2016-09-26 2 views
1

ЦЕЛЬObject Обязательный, несмотря на уже определяющий объект (EXCEL, VBA)

отъехать данные обменных курсов для различных валют.

ПОДХОД

  1. Выберите активный лист и копию валюты, чтобы быть преобразован в массив (например, [ "EUR", "GBP", "USD"]
  2. Открыть браузер и перейти конвертация валюты сайт преобразования
  3. Loop с помощью различных валют и извлекать факторы
  4. Append коэффициенты преобразования в массив
  5. заселить Excel с новейшей преобразования коэффициентов

HTML

<span class="amount" id="converterToAmount" style="">26.21</span> 

КОД

Sub retreiveCurrencies() 

Dim ws As Worksheet 
Dim locals() As Variant 
Dim rates As Object 
Dim exchangeArray() As Variant 
Dim i As Long 
Dim IE As Object 



'Select currencies to convert 
Sheets("APPENDIX - CURRENCY CONVERTER").Activate 
locals = ActiveSheet.Range("B2:B15").Value 
'This should return locals = ["EUR", "GBP, "USD"] 

'Prep Internet Explorer 
Set IE = CreateObject("InternetExplorer.Application") 
IE.Visible = True 


'Loop through currencies and retreive rates. Paste rates into exchangeArray 
For i = LBound(locals, 1) To UBound(locals, 1) 
    IE.Navigate "http://www.usforex.com/currency-converter/" & locals(i, 1) & "/usd/1.00/false" 
     Do While IE.Busy And Not IE.readyState = READYSTATE_COMPLETE 
      DoEvents 
     Loop 
    '!!!!error on following line = "Object required"!!!! 
    Set rates = IE.Document.GetElementById("converterToAmount").innerText 
    ReDim Preserve exchangeArray(rates) 

Next i 

'Paste exchange rate array into currency conversion column 
ActiveSheet.Range("E2:E15") = exchangeArray() 



End Sub 

вопросы/вопрос (ы)

  1. В настоящее время возникает ошибка «Требуемый объект» @Set rates = IE.Document.GetElementById("converterToAmount").innerText, несмотря на определение Dim rates As Object. Любое решение?
  2. Есть ActiveSheet.Range("E2:E15") = exchangeArray() достаточно, чтобы вставить клетки обратно в excel?
+3

'rates' не должно быть объектом. Вы устанавливаете его для значения внутреннего текста элемента IE, который является строкой. Попробуйте определить его как String и оставьте ключевое слово 'Set'. – Dave

+0

Я мог бы поклясться, что раньше это делал. Благодарим вас за решение этой проблемы. Однако, когда я называю «MsgBox exchangeArray (i)» после «ReDim», я не вижу никаких значений. Я что-то неправильно истолковываю? По какой-то причине ставки не вытягиваются и/или не сохраняются в exchangeArray – jonplaca

+1

Я склонен определять целевой диапазон с экстентами варианта массива, например '.Range (« E2 »).Изменение размера (UBound (exchangeArray, 1), UBound (exchangeArray, 2)) = exchangeArray' – Jeeped

ответ

4

Названный вопрос уже был затронут в @ Dave комментария - .innerText является String, не Object.

Сказанное: синтаксис вашего массива немного неактивен - Redim Preserve фактически изменяет размер массива - он не пишет значение для него. Вы также пытаетесь использовать rates в качестве индекса вместо его добавления. Кроме того, я бы принял предложение @Jeeped в комментариях, а также применил его к вашему exchangeArray. Размер фиксирован, и он всегда будет такого же размера, как locals. Это означает, что вы можете просто сделать это:

ReDim exchangeArray(LBound(locals, 1) To UBound(locals, 1), LBound(locals, 2) To UBound(locals, 2)) 

После того, как он уже установлен правильный размер, вы не должны даже ReDim его в петлю. Просто отразите позицию вашего «ключевого» массива:

Dim rates As String 
'... 

'Loop through currencies and retreive rates. Paste rates into exchangeArray 
ReDim exchangeArray(LBound(locals, 1) To UBound(locals, 1), LBound(locals, 2) To UBound(locals, 2)) 
For i = LBound(locals, 1) To UBound(locals, 1) 
    ie.navigate "http://www.usforex.com/currency-converter/" & locals(i, 1) & "/usd/1.00/false" 
     Do While ie.Busy And Not ie.readyState = READYSTATE_COMPLETE 
      DoEvents 
     Loop 
    '!!!!error on following line = "Object required"!!!! 
    rates = ie.document.getElementById("converterToAmount").innerText 
    exchangeArray(i, 1) = rates 
Next i 
+0

Спасибо - это прекрасно сочетает все вместе и иллюстрирует, где я ошибся. Помечено как решение. – jonplaca

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