Страницы: 1 2 След.
RSS
Многомерный массив (из web) в цикле и Redim его, грузить лишь даты и контракты (быстро)
 
что-то с темой у меня не получается... собрала по ячейке в кучу и выгрузила скопом... но это ведь не дело - не создать цикл в макросе... может кто-нибудь сможет помочь мне пролить свет на этот тёмный лес:
1) ручной парсинг(насколько понимаю я сделала) поместить в цикл (2 цикла получится по коду)
2) удалить элемент 2го столбца, если он If Not IsDate и предыдущий ему элемент (по строке из 1 столбца)
- полагаю для этого дела переложить массив в новый, убрав лишнее, ну или заменив на 0 (тоже подойдёт)... очень хочу понять Redim - но пока никак...
3) обрезать часть html кода по примеру из комментов к статье http://www.planetaexcel.ru/techniques/3/53/ чтобы не читать его весь на каждом цикле... - наверно, тоже был бы вариант оптимизации...

на примере 1-го массива отразила (жёлтым) что надо удалить (или заменить на ноль), 2-й массив (если Redim 1-й, но как), 3-й массив выгружается макросом в М3 (идентичен первому)... по коду закомментированные цифры - это прибавляемое кол-во символов при чтении html - просто нужные данные располагаются в html-коде через одинаковые "расстояния" - так, наверно, проще будет, чем считать каждый раз...

вобщем, оптимизация напрашивается сама собой, а я пока в поисках... если ваши строки упростят мой ход мыслей - то, многомерность, циклы и redim сделают жизнь проще, наверно... надеюсь надолго!.. если вас не затруднит высказаться по этому вопросу... очень важно ( чувствую себя как без рук, когда во вложенном примере не могу этого реализовать)... многомерность однако
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
что-то с темой у меня не получается...
вот уж точно...

если убрать из вашего описания все «умные слова» - макросы, массивы, многомерность, циклы, redim и прочую муть,
и описать задачу нормальным человеческим языком (вот здесь - исходные данные, вот такой надо получить результат, делаю вот так, получается вот так, а должно быть вот так) - то, глядишь, и помощи ждать долго не придётся.

А мы уж сами разберемся, где нужна многомерность и redim, а где надо сделать все иначе  :)

PS: и вообще, ваша задача решается проще, - через веб-запрос
На отдельном листе, жмёте ДАННЫЕ - ИЗ ИНТЕРНЕТА, вставляете туда ссылку, ок, ок,
- и получаете на листе результат (который можно обновлять одной строкой кода - метод Refresh)

А потом останется написать простенький макрос, копирующий табличку с того листа в нужное вам место
(или даже без этого, - можно формулами типа ВПР подтягивать данные прямо с листа веб-запроса)
Изменено: Игорь - 18.05.2014 21:17:38
 
Цитата
Игорь пишет: PS: и вообще, ваша задача решается проще, - через веб-запрос
На отдельном листе, жмёте ДАННЫЕ - ИЗ ИНТЕРНЕТА
даже уже написанным макросом (вложенным файлом ранее) быстрее чем ваш вариант... и в совокупности со всеми др задачами рабочего файла - оптимальнее...

Цитата
Игорь пишет: А мы уж сами разберемся, где нужна многомерность и redim, а где надо сделать все иначе
озвучила темы с которыми не получается разобраться, и на примере оптимизации данного макроса (в файле вложенном) хотела бы увидеть пример их реализации... а я уже сама разберусь где их можно будет использовать в будущем для моих задач...
Изменено: JeyCi - 18.05.2014 21:50:32
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Вариант - вытягиваем в переменную значение для второго столбца. Если это дата - то увеличиваем индекс, по индексу кладём эту дату, в первый столбец вытягиваем значение для первого столбца.
В конце выгружаем верхушку массива согласно последнему индексу (только собранное).
Ну и InStr(1, htmlcode, "calendarEntries") и InStr(1, htmlcode, "Euro FX Weekly Options") можно извлечь один раз и взять значения в переменные)


Другой вариант - когда собрано как у вас - объявить другой массив 14х2, переложить только строки с датами (увеличивая индекс). верхушку выгрузить.
 
Цитата
Игорь:   описать задачу нормальным человеческим языком (вот здесь - исходные данные, вот такой надо получить результат, делаю вот так, получается вот так, а должно быть вот так) - то, глядишь, и помощи ждать долго не придётся.
Я АБСОЛЮТНО согласна с Игорем.
Формализация задачи - самый сложный этап автоматизации.
Монологи - самый худший вариант описания задачи.
 
Скрытый текст
Цитата
а я уже сама разберусь где их можно будет использовать в будущем для моих задач.
1 маленький цикл,все данные с таблицы можно взять.
Изменено: Doober - 19.05.2014 01:54:41
 
Цитата
Doober пишет: 1 маленький цикл,все данные с таблицы можно взять.
Doober спасибо большое вам, но они НЕ нужны мне все  :)   (только если когда-нибудь в будущем)... нужны только американские контракты, месячные и недельные... поскольку уже в excel выковыривать нужное, добавляя условия в формулы тоже не хотелось бы... по MSXML.XMLHTTP запросу тоже думала - но пока это для меня сложноватый синтаксис и ещё более тёмный лес - спасибо вам за пример со временем может и осилю... полагаю, это не совсем VBA, скорее VB (не знаю с чего начать с ним разбираться)... но в любом случае, спасибо... я с интересом уже посматривала на ваши такого рода посты ранее и думала, надо будет и мне с этим когда-нибудь разобраться...

а по теме: просто макрос, вложенный в 1-ом посте хотела бы узнать, можно ли как-то загнать в цикл (а то ведь я на калькуляторе прибавляла закоментированные цифры) и переложить в новый массив, удалив ненужное(или заменив на 0), после чего выгрузить этот массив... arr(i,j) обрабатывать в цикле по i и по j пока не умею... не знаю с чего начинать и как это должно выглядеть... имхо... вот и обращаюсь за помощью... и по i и по j и переложить redim'ом очень хочется на своём примере научиться применять ( а то на чужих не очень пока понимаю - что по строкам ложить, что по столбцам, в какой последовательности и как)

хотя может и в вашем варианте перед выгрузкой можно почистить данные, оставив лишь EC* и ?X* контракты и даты по ним???
Изменено: JeyCi - 19.05.2014 08:23:13
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Я практически никогда "Redim'ом не перекладываю" - т.к.
1. это работает только вширь, а нам обычно нужно вниз - т.е. в финале необходимо массив переворачивать
2. долго: каждый редим - это перекладывание всего массива в новый побольше (судя по потерям времени)
3. сложнее код.

Проще делать как я выше уже подсказал - создали массив сразу под максимальный размер, перекладываем только нужное, увеличивая индекс, в финале используем только собранное.

Хотя конечно если из миллиона нужно отобрать тысячу - то это неоптимально "тягать такой пустой хвост". Но обычно бывает наоборот - условно "из миллиона не нужна тысяча".
Изменено: Hugo - 19.05.2014 10:38:48
 
Цитата
Проще делать как я выше уже подсказал - создали массив сразу под максимальный размер, перекладываем только нужное, увеличивая индекс, в финале используем только собранное.
Так и сделал
Скрытый текст
 
Цитата
Doober пишет:
If InStr(1, oMatches(n).subMatches(1), "B", vbTextCompare) = 2 Or InStr(1, oMatches(n).subMatches(1), "BP", vbTextCompare) = 1 Then
за ликбез спасибо - redim вещь загадочная очень и вообще перекладывать по 2м столбцам нелегко...
НО конкретно по данной строке  на примере др контракта хватает лишнее (пример вкладываю)... Doober,может в вашу строку можно как-то вставить доп условие 1-й символ НЕ=Y... (VBScript.RegExp тоже пока для меня загадка)... нужны только амер контракты (в примере жёлтым)
p.s. в файле:
sURI = "http://www.cmegroup.com/trading/fx/g10/british-pound_product_calendar_options.html?exchange=XCME&productCd=6BH4&underlyingContract=6B&floorContractCd=BPH4&expMonth=201403&prodid="
Изменено: JeyCi - 19.05.2014 11:32:43
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Так надо
Код
      If (InStr(1, oMatches(n).subMatches(1), "B", vbTextCompare) = 2 Or InStr(1, oMatches(n).subMatches(1), _
            "BP", vbTextCompare) = 1) And InStr(1, oMatches(n).subMatches(1), "Y", vbTextCompare) = 0 Then
 
Изменено: Doober - 19.05.2014 12:33:39
 
Цитата
Doober пишет: Так надо
вот что значит высший пилотаж - всегда можно обойти Redim стороной  :)   ... всё работает!.. буду разбираться... thanks!

p.s. Hugo, п.2 - я хотела создать новый пустой (просто Redim), а в него переложить нужные из имеющегося... без Redim Preserve - слышала, что это долго... но вот VBScript и без этого смог выразить мысль, и всего то двумя цифрами: или 1(равно) или 0(не равно)... насколько поняла... надеюсь, хоть читаю правильно..
Изменено: JeyCi - 19.05.2014 14:39:50
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi  redim вещь загадочная очень и вообще перекладывать по 2м столбцам нелегко...
Это же инструмент динамического резервирования для массивов любой размерности! :D
Даже во времена "Царя-Косаря" почти во всех языках программирования присутствовал этот инструмент.
 
Doober. сижу вот - разбираюсь - например такой запрос пытаюсь делать
Код
Public Function Parse_HTML(S)
    S = Replace(S, Chr(34), "")
    bRes = False
    Set RegExp = CreateObject("VBScript.RegExp")
    RegExp.Global = True
    RegExp.IgnoreCase = True
   RegExp.Pattern = "[{]Month:(.+?),(.+?)Settle:([A-Z 0-9]+?)[}]"
    bRes = RegExp.test(S)
    If bRes Then
     Set oMatches = RegExp.Execute(S)
     ReDim x(1 To oMatches.Count, 1 To 2)
     For n = 0 To oMatches.Count - 1
       x(n + 1, 1) = oMatches(n)
        x(n + 1, 2) = oMatches(n).subMatches(6)
     Next
    End If
  Parse_HTML = x
End Function
по адресу
Код
 sURI = "http://www.cmegroup.com/trading/fx/realized-fx-volatilities/euro-quarterly-variance_quotes_settlements_futures.html"

776 строка html-кода (Month и Seattle) пытаюсь вытянуть столбцы... тоже массив, тоже 2 столбца, также выгружаю, как по sub вашему первому - полностью - (только в sub адрес заменила)... а макрос ругается на строку выгрузки??
Код
 Sheets("from").[z3].Resize(UBound(Arr), UBound(Arr, 2)).Value = Arr
может я в массив неправильно собрала???
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Правильно ругается.

Код
Public Function Parse_HTML(S, PZ As Integer)
    S = Replace(S, Chr(34), "")
     S = Replace(S, Chr(10), "")
    S = Replace(S, Chr(9), "")
    S = Replace(S, Chr(32), "")
    bRes = False
    Set RegExp = CreateObject("VBScript.RegExp")
    RegExp.Global = True
    RegExp.IgnoreCase = True
    RegExp.Pattern = "<tr><thscope=row>(.+?)</th><td>(.+?)</td><td>(.+?)</td><td>(.+?)</td><td>(.+?)</td>" & _
    "<td>(.+?)</td><td>(.+?)</td><tdclass=(.+?)</td><tdclass(.+?)</td></tr>"
    bRes = RegExp.test(S)
    If bRes Then
        Set oMatches = RegExp.Execute(S)
        ReDim X(1 To oMatches.Count, 1 To 2)
        PZ = 0
        For n = 0 To oMatches.Count - 1
             PZ = PZ + 1
                X(PZ, 1) = oMatches(n).subMatches(0)
                X(PZ, 2) = oMatches(n).subMatches(6)
        Next
    End If
    Parse_HTML = X
End Function
 
PS:У Хоттабыча закончились волоски в бороде
 
Цитата
Doober пишет: Правильно ругается.
Скрытый текст

ясно что ничего не ясно, кроме того что с паттернами быть поосторожнее...
НО тогда с массивом ругается, что Argument is not optional в строке Arr = Parse_HTML(htmlcode) ? что ему не хватает, чтобы взять в Arr?
после функции

Doober вы меня извините, конечно, но я убрала в вашей функции (PZ as Integer) - надеюсь я ничего плохого не сделала?... но на удивление у меня заработало...
p.s. excel очень интересно смотрит на html через призму regexp... имхо
Изменено: JeyCi - 20.05.2014 22:02:05
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
. но на удивление у меня заработало...
Это меня пугает больше всего.
Это означает,что вы не разобрались в работе процедур,физическом  смысле аргументов.
 
Цитата
Doober пишет: Это меня пугает больше всего.
так ведь если он мне сказал, что Argument Not optional - вот и убрала его опции... ? или добавить надо было?.. он ведь, например n в первый раз и так, видимо, понимал, что тот Integer...
Изменено: JeyCi - 20.05.2014 22:25:19
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
Doober пишет: Это означает,что вы не разобрались в работе процедур,физическом смысле аргументов.
исправляюсь:
в public function вернула PZ на место,
в sub вписала Dim PZ As Integer,
там где ругался поставила
Код
arr = Parse_HTML(htmlcode, PZ)
(последний код выше) - для VaR...
Изменено: JeyCi - 28.09.2014 14:42:20
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
вот это дааа!!
огромное спасибо всем!!! кто внёс вклад в моё понимание CreateObject("MSXML.XMLHTTPRequest") , CreateObject("VBScript.RegExp") , CreateObject("Scripting.Dictionary") ... сотворила vbscript используя код выше - при создании скрипта из данного кода , загвозда навернулась в том, что массив создаваемый REDIM'ом не понимался адекватно (никак не понимался) в скрипте - пришлось применить старые добрые Словарики... а вытянуть то хотела всего несколько циферок...не могу не поделиться - settle фьючей  :)   фунтика и еврушки (скрипт в аттаче)... хоть не надо теперь шастать но интернету, чтобы понять на каком мы свете... если дальний фьюч более дорогой чем текущий - это контанго (contango), если ближний фьюч более дорогой, чем дальний - это бэквардация (backwardation)... а дальше экономическая теория  :D   про состояния рынка...  :(  

p.s. может можно было и более кратко и более ювелирно, более циклично  :oops:   чем у мня получилось - но работает - и это уже замечательно!
ребята успехов вам всем!.. так приятно иногда MsgBox'ами выкидывать интересные цифры, а то во всех рабочих файлах и во всём и'нете так много цифр   8-0  

?? для win7 *32x  может кто-нибудь подскажет, есть ли какой-нибудь специализированный софт/интерфейс, чем VBA, чтобы можно было писать и править VBscripts... так чтобы не тестить в xl, а потом адаптировать для работы без xl... софтинка какая-нибудь - в которой можно и писать и она подскажет если есть ошибка... чтобы за каждой проверкой не бегать в Блокнотик ?? или может линк на какую толковую инфо/или книгу по vbscript (если где у кого завалялся линк)... уже спасибо!
Изменено: JeyCi - 08.11.2014 12:11:24
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
немножко экперимента с прежним кодом и выгрузка в txt (дополнительно)
-добавлены заголовки -
Код
Public Function UseCME(URL$) As Variant
    'URL$ = "http://www.cmegroup.com/trading/fx/g10/euro-fx_quotes_globex_options.html?exchange=XCME&foi=OPT&venue=G&productCd=6EH4&underlyingContract=6E&floorContractCd=ECH4&expMonth=201403&prodid="
    Dim XMLHTTP                       'ADOStream, filename
    On Error Resume Next
    Set XMLHTTP = CreateObject("Microsoft.XMLHTTP")
    XMLHTTP.Open "Get", URL$, "False"
    XMLHTTP.setRequestHeader "Accept-Encoding", "gzip, deflate"
    XMLHTTP.setRequestHeader "user-agent", "Mozilla/5.0 (Windows NT 6.1; Trident/7.0; rv:11.0) like Gecko"
    XMLHTTP.setRequestHeader "Accept-Language", "ru-RU,ru"
    XMLHTTP.setRequestHeader "Content-Type", "text/html;charset=UTF-8"
    XMLHTTP.send
    If XMLHTTP.statustext = "OK" Or XMLHTTP.Status = 200 Then
        Debug.Print XMLHTTP.responseText
        UseCME = XMLHTTP.responseText
    End If
    Set XMLHTTP = Nothing
End Function

хотя html-код в файл скачать на скорую руку можно и так
Скрытый текст
Изменено: JeyCi - 21.01.2015 15:32:40
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 

ВВИДУ СКОРОГО ДНЯ РОЖДЕНИЯ ЭТОЙ ВЕТКИ  :) - ВОЗОБНОВЛЮ ЧУТЬ-ЧУТЬ... (чтобы было понятно, что ничто не вечно, когда источник меняет структуру исходных данных)
на примере линка - та же история - нужны все Даты Экспирации - просто другой торговый инструмент
(евру и фунтика за эти годы потиху причёсывала, на сип посматривала редко - хотя там всё по аналогии "чтобы взять с сайта" и было и есть и, наверно, будет)
***
и вот самое интересное с того (указанного линка)
запрос на: http://www.cmegroup.com/trading/equity-index/us-index/e-mini-sandp500_product_calendar_options.html
регулярка: "<tr><thscope=row>(.+?)</td><td>(.+?)</td><td>(.+?)<br/>(.+?)</td><td>(.+?)</td>" - позволяет взять только 1 тип контрактов, как бы выбраннный в выпадающем списке по умолчанию...

138American Options
136End of Month Options
8292Weekly Monday Option
2915Weekly Options
8227Weekly Wednesday Option

таблица  (выявлено по option выпадающего списка)

добавление к строке запроса ID-тикера - например, #optionProductId=138 - не показывает иной контракт... хотя выбор иного контракта в выпадающем списке - в строке адреса в браузере пропечатывает этот довесок в дополнение адреса...

появился вопрос: КАК взять все даты экспирации Сипа (по прошествии нескольких лет)

ответ нашёлся лишь в начале этого поста: т.к. евру и фунтика все эти годы причёсывали по рабочему коду - просто попробовать сделать по аналогии... взглянув, а что же там, прищлось констатировать, что там по какой-то причине пришлось переехать на новые рельсы - парсинг JSON... (давно, уже не помню почему)...

протестирован код (привожу отрывок, поскольку вычленять лишь его из всего проекта ооочень долго, а примеры работы с JsonBag на сайте есть)

Код
' ... начало как обычно для MSXMLHTTP примерно, как в этой ветке...
S = htmlcode  
Parse_HTML_OexpS = Split(Split(S, "component.options =")(1), ";")(0)    
        'создаём объект JsonBag
        Set Js = New JsonBag
        'в него текстовую строку json_файла
        Js.JSON = S'парсинг JSON-структуры с помощью ClassModule JsonBag

- всё работает!..

ВОПРОС: почему в Fiddler'e не вижу и намёка на тот JSON ???

остальные вопросы: также не понятно, как бы парсила с нуля эту ситуацию для взятия дат экспирации всех/нескольких - по задаче ветки... (если бы не было готового кода по евре и фунтику)... может ли быть такое, что "то ли Fiddler что-то не то показывает"? "то ли сайт-источник вообще не показывает, что надо"? даже боюсь предположить, что это может быть связано с местоположением IP юзера (т.е. меня)...

вобщем странности какие-то... как из кода этой вэб-страницы увидеть как взять все даты экспирации (задача ведь по сути не изменилась), не включая браузер (чтобы не прыгать по выпадающему списку программно)? для меня загадка (когда я смотрю html-код уже сейчас)... если есть идеи алгоритма без включения браузера и прыгания по выпадающему списку... - заранее спасибо ... иначе пусть этот пост останется для инфо "не всё можно увидеть в Fiddler't и html-коде" - страшный вывод  :(

Изменено: JeyCi - 03.05.2017 17:27:26
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
JeyCi , Вам
Цитата
есть ли идеи алгоритма без включения браузера
сейчас высказать примером  или дня рождения ветки подождать ? :)
Цитата
JeyCi написал:
то ли Fiddler что-то не то
Не то, без выполнения  серверных скриптов ничего не  выйдет.
PS:Прикольно получилось, сообщение номер 1111
Изменено: Doober - 05.05.2017 11:05:04
 
Цитата
Doober написал: Не то, без выполнения  серверных скриптов ничего не  выйдет.
это что они (сам сайт) защиту какую-то поставили? (чтобы не отследить траффик из Fiddler'а или ему подобных)?
сервер-то не мой  :oops:
или эти скрипты как-то можно c моего компа прогнать? и на каком языке и где покопать, не подскажете?
Скрытый текст
Изменено: JeyCi - 05.05.2017 21:32:26
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
скрипты как-то можно c моего компа прогнать?
Нечего делать им на Вашем компе.
Читал, читал, та и не понял, надо Вам решение или нет.
Изменено: Doober - 06.05.2017 15:23:48
 

Doober, спасибо!.. тоже делала через JsonBag (просто по аналогии с тем что работало у меня с еврой) - но в упор не могу разглядеть эти Json-файлы в Fiddler, чтобы распарсить с нуля (если бы у меня не было отработки по евре)... боюсь, что и до других json-ов могут возникнуть проблемы добраться - поэтому ребром и встал вопрос "Упс, приплыли" и "что делать"... хотела знать что в таких ситуациях делается, чтобы увидеть такие json'ы воочию...? (не поняла)
У меня было как-то так (с прежних времён)

Код
        Js.JSON = S
    'достаём объекты и (переменные) названия КК ВСЕ 30.09.2016
        ii = 1
        Count% = Js.Count   '("label").Count + 1

'собираем словарь массивов            
Set d = CreateObject("Scripting.Dictionary")
With d
    .comparemode = 1
    Do While ii <= Count%
    n_l = Js.Item(ii).Item("label")  'label
    n_n = Js.Item(ii).Item("name")  'name
    n_id = Js.Item(ii).Item("productId")  'productId
            
    If Not .Exists(n_l) Then .Add n_l, X() 
        
    Set bagN = Js.Item(ii).Item("calendarEntries")   'объект calendarEntries
    ReDim X(1 To bagN.Count, 1 To 2)
        For m = 1 To bagN.Count '+ 1
            'x(m, 3) = bagN.Item(m).Item(1) 'contractMonth
            X(m, 1) = bagN.Item(m).Item(2) 'productCode
            X(m, 2) = bagN.Item(m).Item(4) 'lastTrade
        Next m
        .Item(n_l) = X
    Erase X
    Set bagN = Nothing
    
    ii = ii + 1
    Loop
End With

'выгрузка массивов из словаря
    With Workbooks.Add.Sheets(1)
        .Columns(2).NumberFormat = "@"
        i = 0
        For Each kk In d.keys
            lr = .Cells(.Rows.Count, "A").End(xlUp).Row
            i = lr + 1
            b = d.Item(kk)
            .Cells(i, 1).Resize(UBound(b, 1), UBound(b, 2)) = b
            Erase b
        Next
        .Cells.EntireColumn.AutoFit
    End With

также у меня ваш код почему-то отрабатывает только с закомментированными (иначе Subscript out of range) заголовками:

Код
        '.setRequestHeader "Accept -Encoding", "gzip ,deflate"
        '.setRequestHeader "Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8"
- примерно такую же проблему вскрыла на днях и в своём коде?? (просто сменив создание объекта MSXML2.XMLHTTP на создание объекта  CreateObject("WinHttp.WinHttpRequest.5.1") - только тогда поняла, что чем-то не нравятся эти 2 заголовка [раньше работало, вдруг перестало], проверила, не поняла, закомментировала, пошло работать, вернула MSXML2.XMLHTTP... сама в замешательстве была?... думала, блок питания мешает понять
а с таким заголовком ещё даже не встречалась нигде:
Код
.setRequestHeader "Upgrade-Insecure-Requests", "1"
Upgrade-Insecure-Requests
и на Хабре про это интересно написали :)
Цитата
Upgrade-Insecure-Resources помогли с доступом OriginA ... Один из HTML ресурсов теперь не содержит смешанного контента потому, что протоколы были незаметно подменены и удалённые зависимости стали доступны через https. Этот пример показывает почему множество сайтов неохотно предоставляют собственный контент через https, во избежание пугающих сообщений об ошибках и дефектов функциональности.
Это ведёт к печальному обстоятельству, что наименее ответственные участники на конце цепочки зависимостей могут тормозить прогресс. Циклические зависимости(так как они точно существуют в огромной структуре веба) могут создавать взаимные блокировки, которые не разрешить без координации действий.
Doober вы это через Mozilla увидели?? или в traffic'е в Fiddler надо разглядеть какой-то особый js? (и к нему такой заголовок??).. просто в упор не вижу (может ещё не во всех тонкостях разобрлась)
Изменено: JeyCi - 09.08.2017 19:08:54
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
и модуль класса JsonBag у меня, видимо, подсокращённый был... не все методы прописаны - ToArray2 отсутствовал... мой код в #26 под модуль класса, приложенный к этому посту
Изменено: JeyCi - 12.05.2017 12:01:09
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал:
вы это через Mozilla увидели??
Это чуйка :) .Иногда скрипты разбираю.
PS:Я иногда балуюсь и пишу сайты
 
вижу - ваш (хотя без Referer'a)
Код
.setRequestHeader "X-Requested-With", "XMLHttpRequest"
вижу http://www.cmegroup.com/apps/cmegroup/widgets/productLibs/js/calendar.js
ковырнув его - поменяв расширение на txt и открыв - замечен линк http://www.cmegroup.com/apps/cmegroup/widgets/productLibs/mustache/calendar/opti­ons.html
а  где ваша чуйка увидела сами json-данные?  :) (я, похоже, дошла только до заголовков полей)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: а  где ваша чуйка увидела сами json-данные?
да, наверно, это, действительно была чуйка... которая увидела структуру:
{{замеченного линка}} - предыдущего поста.....
и распарсила её (С ДОПОЛНЕНИЕМ в Модуль Класса функции-метода ToArray2), как:
Код
    x = JS.ToArray2
    For n = 1 To UBound(x)
        HD = x(n)
        sh.Cells(1 + n, 1).Resize(1, UBound(HD, 2) - 1) = HD
    Next
Doober, спасибо...
это был очень скользкий момент... а вы увидели возможность всё это добро взять в массив и разложить по ячейкам... такое умение, действительно, только с опытом можно приобрести... буду иметь ввиду... спасибо за опыт! (жизненный  :) )
P.S.
а почему клиент перестал понимать заголовки Accept и спотыкаться об них начал у меня - так и не поняла... у меня, наверно, ещё 11 дней до дня рождения ветки  8)
мои Request Headers

мои Response Headers

Изменено: JeyCi - 09.08.2017 19:22:15
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1 2 След.
Наверх