2015-02-14 13 views
1

Я пытаюсь извлечь некоторые данные здесь: http://www.hnb.hr/tecajn/f140215.datVBA извлекать и анализировать данные с веб-сайта, чтобы Слово

Это список обменный курс от Национального банка Хорватии. Имя файла «f140215.dat» в основном дату, отформатированные в следующем порядке:

«е» «DDMMYY» «.dat»

Я намерен иметь данные, организованные в виде таблицы Word, который содержит следующие клетки:

  • Cell # 1, где пользователь будет вручную ввести дату в следующем формате: «МММ ДД, YYYY»
  • Cell # 2, в котором пользователь будет вводить вручную запрашиваемый код валюты имя (USD, GBP и т. Д.)
  • Ячейка № 3, где должен быть указан извлеченный обменный курс для указанной даты и валюты для .

Под таблицей находится кнопка «ОБНОВЛЕНИЕ», которая обновляет информацию о ячейке №3. Сценарий, который я прошу, должен быть подключен к этой кнопке.

После нажатия на кнопку, я хотел бы сценарий, чтобы сделать следующее:

  • Выяснить, какие страницы для перехода на на основе даты, введенной в ячейке # 1. Например, если ячейка # 1 содержит «14 февраля 2015», сценарий должен указывать на «http://www.hnb.hr/tecajn/f140215.dat»
  • На этой странице, возьмите среднее значение для валюты, указанной в Cell # 2. Например, если ячейка № 2 содержит «USD», сценарий должен быть
    экстракт «6,766508», который является средним значением для «840USD001». Только среднее значение имеет значение.
  • Введите это значение в ячейку № 3.

Чтобы подвести итог, основанный на критериях, указанных в двух ячейках таблицы, сценарий должен определить, к какой странице перейти и какие данные извлечь из него, и с этими данными заполнить третью ячейку.

Надеюсь, я объяснил это достаточно хорошо. Это только часть всего генератора счетов, который я создаю. До сих пор я получил все на работу, но это я даже не знаю, как начать. Я могу отправить все это, если нужно, но подумал, что это не совсем актуально.

EDIT:

Я смотрел некоторые учебники и играл, и это то, что я получил до сих пор.

Enum READYSTATE 
    READYSTATE_UNINITIALIZED = 0 
    READYSTATE_LOADING = 1 
    READYSTATE_LOADED = 2 
    READYSTATE_INTERACTIVE = 3 
    READYSTATE_COMPLETE = 4 
End Enum 

Sub Test() 

Dim ie As New InternetExplorer 
ie.Visible = False 
ie.navigate "http://www.hnb.hr/tecajn/f140215.dat" 

Do While ie.READYSTATE <> READYSTATE_COMPLETE 
DoEvents 
Loop 

Dim html As HTMLDocument 
Set html = ie.document 

MsgBox html.DocumentElement.innerText 

End Sub 

Я знаю, что это не так много, но, как я уже сказал, я новичок в этом. Я смог получить данные в окне сообщения, но я понятия не имею, как его разобрать, и без этого я не могу ничего сделать, упомянув выше. Что теперь?

EDIT 2:

Хорошо! Сделал некоторый прогресс!Мне удалось разобрать его, используя функцию split:

Sub Test() 

Dim ie As New InternetExplorer 
ie.Visible = False 
ie.navigate "http://www.hnb.hr/tecajn/f140215.dat" 

Do While ie.READYSTATE <> READYSTATE_COMPLETE 
DoEvents 
Loop 

Dim html As HTMLDocument 
Set html = ie.document 

Dim getData As String 
getData = html.DocumentElement.innerText 

'replaced all the space fields with line breaks 
Dim repData As String 
repData = Replace(getData, "  ", vbCrLf) 

'used line breaks as separators 
Dim splData As Variant 
splData = Split(repData, vbCrLf) 

MsgBox splData(1) 
MsgBox splData(2) 
MsgBox splData(3) 

End Sub 

Сейчас он отображает проанализированные данные в ящиках сообщений. Остальное должно быть легко!

Добавление комментария от параметров порядка:

Это является частью продолжающегося кода:

Dim cur As String 
cur = ActiveDocument.SelectContentControlsByTitle("valCombo").Item(1).Range.Text 
If cur = "USD" Then 
    ActiveDocument.Tables(1).Cell(7, 3).Range.Text = splData(40) & " HRK" 
End If 
If cur = "EUR" Then 
    ActiveDocument.Tables(1).Cell(7, 3).Range.Text = splData(20) & " HRK" 
End If 

Таким образом, она работает, но я хотел бы установить ActiveDocument.Tables(1).Cell(7, 3).Range.Text в виде строки. Однако, как только я это сделаю, он ничего не делает. Почему это?

+0

Разбираем даты в * fddmmyy.dat * формат затем использовать один из ароматов 'MSXML2.XMLHTTP' и разобрать' .responseText', чтобы получить то, что вам нужно. Когда вы продемонстрировали некоторые оригинальные усилия, вернитесь и отредактируйте указанную выше спецификацию программного обеспечения, чтобы включить свою собственную попытку программирования, указав любые полученные вами ошибки. – Jeeped

+0

@ Почитал, спасибо за указатели, но я думаю, что я еще далек от того, где мне нужно их использовать. Я отредактировал сообщение выше, поэтому, пожалуйста, взгляните, когда у вас появится шанс. Благодаря! – blackwind

+0

Думаю, я понял! См. EDIT 2 :-) – blackwind

ответ

1

Это должно помочь вам с первой половиной вашего проекта; это поиск данных. Как я упоминал в своем предыдущем комментарии, поиск данных, такой как этот, лучше подходит для типа объекта MSXML2.ServerXMLHTT.

Вам нужно будет войти в Инструменты VBE ► Ссылки и добавить Microsoft XML v6.0.

Sub scrape_CNB() 
    Dim u As String, dtDATE As Date, xmlHTTP As MSXML2.ServerXMLHTTP60 
    Dim sTMP As String, sCURR As String 
    Dim i As Long, j As Long, vLINE As Variant, vRATE As Variant 

    On Error GoTo CleanUp 

    Set xmlHTTP = New MSXML2.ServerXMLHTTP60 

    sCURR = "USD" 
    dtDATE = CDate("February 14, 2015") 
    With xmlHTTP 
     u = "http://www.hnb.hr/tecajn/f" & Format(dtDATE, "ddmmyy") & ".dat" 
     .Open "GET", u, False 
     .setRequestHeader "Content-Type", "text/xml" 
     .send 
     If .Status <> 200 Then GoTo CleanUp 

     sTMP = .responseText 
     vLINE = Split(sTMP, Chr(13) & Chr(10)) 
     For i = LBound(vLINE) To UBound(vLINE) 
      If CBool(InStr(1, vLINE(i), sCURR, vbTextCompare)) Then 
       Do While CBool(InStr(1, vLINE(i), Chr(32) & Chr(32))): vLINE(i) = Replace(vLINE(i), Chr(32) & Chr(32), Chr(32)): Loop 
       vRATE = Split(vLINE(i), Chr(32)) 
       For j = LBound(vRATE) To UBound(vRATE) 
        MsgBox j & ": " & vRATE(j) 
       Next j 
       Exit For 
      End If 
     Next i 

    End With 

CleanUp: 
    Set xmlHTTP = Nothing 
End Sub 

Поскольку вы не инициируя полный объект Internet.Explorer, это должно быть намного быстрее и .responseText, что возвращается сырой текст, а не HTML.

TBH, я считаю, что программирование на языке курсора, основанное на VBA в Word, трудно справиться; предпочитая однозначно определенные отношения (-и) с листом Excel. Возможно, вы захотите рассмотреть возможность использования Excel в качестве хранилища данных и слияния с Word, чтобы обеспечить вывод вашего счета.

Добавление:

Dim cur As String, t as long, r as long, c as long 
cur = ActiveDocument.SelectContentControlsByTitle("valCombo").Item(1).Range.Text 
t = 1: r = 7: c = 3 
Select Case cur 
    Case "USD" 
    ActiveDocument.Tables(t).Cell(r, c).Range.Text = splData(40) & " HRK" 
    Case "EUR" 
    ActiveDocument.Tables(t).Cell(r, c).Range.Text = splData(20) & " HRK" 
End Select 
+0

Спасибо! Одна проблема, хотя ... Я попытался запустить ее очень быстро и получил ошибку компиляции «Определенный пользователем тип, не определенный» с «Установить htmlBDY = Новый HTMLDocument». – blackwind

+0

Я сделал! Все еще происходит! – blackwind

+0

Приносим извинения - у меня было это, а затем удалено (см. Выше). Эта линия совершенно не нужна. – Jeeped

Смежные вопросы