Вот два метода.1) Использование регулярного выражения в возвращаемом тексте.Обычно хмурится, но здесь вполне исправно.2) Традиционное извлечение строки json и использование парсера json для анализа значения.
Требуемые данные хранятся в строке json, найденной как на веб-странице, так и в ответе xmlhtttp , под тем же самымэлемент:
Это означает, что вы можете рассматривать html как строку и нацеливать только образец цены открытия, используя регулярное выражение, как показано ниже, или анализироватьзапрос xmlhttp в html-парсер, возьмите требуемый элемент, извлеките его innerText и обрежьте пробел, затем перейдите к json-парсеру для извлечения цены открытия.
В обоих методах вы хотите избежать кэширования обслуживаемогоРезультаты, поэтому следующий заголовок является важным дополнением к попытке смягчить это:
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
Нет необходимости в дополнительном форматировании ячейки.Полное значение получается для обоих тикеров.
Регулярное выражение:
Оно присутствует в строке json в ответе.Вы можете легко вывести его из текста возврата.
Объяснение Regex:
VBA:
Option Explicit
Public Sub GetClosePrice()
Dim ws As Worksheet, re As Object, p As String, r As String
Set ws = ThisWorkbook.Worksheets("Sheet1")
p = """open"":""(.*?)"""
Set re = CreateObject("VBScript.RegExp")
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuote.jsp?symbol=HAL", False
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
If .Status = 200 Then
r = GetValue(re, .responseText, p)
Else
r = "Failed connection"
End If
End With
ws.Range("K11").Value = r
End Sub
Public Function GetValue(ByVal re As Object, ByVal inputString As String, ByVal pattern As String) As String
With re
.Global = True
.pattern = pattern
If .test(inputString) Then ' returns True if the regex pattern can be matched agaist the provided string
GetValue = .Execute(inputString)(0).submatches(0)
Else
GetValue = "Not found"
End If
End With
End Function
Анализатор HTML и json:
Для этого требуется установить код для jsonparser из jsonconverter.bas в стандартный модуль с именем JsonConverter, а затем перейти в VBE> Инструменты> Ссылки> Добавить ссылку на Microsoft Scripting Runtime иБиблиотека объектов Microsoft HTML.
VBA:
Option Explicit
Public Sub GetClosePrice()
Dim ws As Worksheet, re As Object, r As String, json As Object
Set ws = ThisWorkbook.Worksheets("Sheet1")
With CreateObject("MSXML2.XMLHTTP")
.Open "GET", "https://www.nseindia.com/live_market/dynaContent/live_watch/get_quote/GetQuote.jsp?symbol=MRF", False
.setRequestHeader "If-Modified-Since", "Sat, 1 Jan 2000 00:00:00 GMT"
.send
If .Status = 200 Then
Dim html As HTMLDocument
Set html = New HTMLDocument
html.body.innerHTML = .responseText
Set json = JsonConverter.ParseJson(Trim$(html.querySelector("#responseDiv").innerText))
r = json("data")(1)("open")
Else
r = "Failed connection"
End If
End With
ws.Range("K11").Value = r
End Sub