2014-02-17 6 views
0

Моя компания нуждается в перезагрузке имен пользователей и паролей для более 1000 человек, и вместо того, чтобы делать это по-отдельности, я бы хотел, чтобы VBA автоматизировал ее для меня. Я подключил его к IE-окну, но getElementsByTagName («вход») возвращает только последний тег ввода. Ниже мой код:Excel VBA getElementsByTagName() возвращает только последний вход

Dim shellWins As ShellWindows 
Dim IE As InternetExplorer 
Dim HTMLdoc As HTMLDocument 
Dim objElement As Object 
Dim objCollection As IHTMLElementCollection 
Dim name As String 
Dim val As String, val2 As String 
Dim a 

Set shellWins = New ShellWindows 

If shellWins.Count > 0 Then 
    ' Get IE 
    Set IE = shellWins.Item(0) 
Else 
    ' Create IE 
    Set IE = New InternetExplorer 
    IE.Visible = True 
End If 

Set objCollection = IE.Document.getElementsByTagName("input") 


For i = 0 To objCollection.Length 
    name = objCollection(, i).name 
    If Left(name, 6) = username Then 
     val = objCollection(i).Value 
     a = Split(val, "@") 
     If Left(a(1), 1) <> "s" Then 
      val2 = a(0) & sa & a(1) 
     Else 
      val2 = val 
     End If 
     objCollection(i).Value = val2 
    ElseIf Left(name, 6) = pswd Then 
     objCollection(i).Value = nPswd 
    End If 
Next 

Set shellWins = Nothing 
Set IE = Nothing 

Входящие теги, которые я хочу, находятся в табличных тегах, может ли это быть причиной этого? Если да, как бы я ссылался на теги внутри таблицы?

Заранее спасибо.

+0

Вы опустили какой-то код? –

ответ

-1

Другой подход заключается в использовании запроса для извлечения данных с веб-страницы. например, ниже код извлекает данные с сайта http://finance.yahoo.com/q?s=usdCAd=x и помещает его в ячейку A1:

With Sheet1.QueryTables.Add(Connection:= _ 
    "URL;http://finance.yahoo.com/q?s=usdCAd=x", Destination:=Sheet1.Range("$A$1")) 
    .Name = "q?s=usdCAd=x_1" 
    .FieldNames = True 
    .RowNumbers = False 
    .FillAdjacentFormulas = False 
    .PreserveFormatting = True 
    .RefreshOnFileOpen = False 
    .BackgroundQuery = True 
    .RefreshStyle = xlInsertDeleteCells 
    .SavePassword = False 
    .SaveData = True 
    .AdjustColumnWidth = True 
    .RefreshPeriod = 0 
    .WebSelectionType = xlEntirePage 
    .WebFormatting = xlWebFormattingNone 
    .WebPreFormattedTextToColumns = True 
    .WebConsecutiveDelimitersAsOne = True 
    .WebSingleBlockTextImport = False 
    .WebDisableDateRecognition = False 
    .WebDisableRedirections = False 
    .Refresh BackgroundQuery:=False 
End With 

Вы будете в конечном итоге с большим количеством строк и столбцов некоторых строк, извлекаемых с веб-сайта. Затем вы можете обработать информацию и получить нужные данные.

+0

Сообщение, которое вы связали, связано с использованием QueryTables и, похоже, не имеет никакого отношения к актуальному вопросу. –

+0

Использование таблиц запросов можно извлекать данные с веб-сайта и обрабатывать информацию, полученную оттуда – Pedrumj

+0

ОП обновляет информацию на странице и отправляет форму ... –

1

Попробуйте эту петлю вместо:

Dim el as object 
Set objCollection = IE.document.getElementsByTagName("input") 
For Each el In objCollection 
    If Left(el.Name, 6) = UserName Then '?"username"? 
     a = Split(el.Value, "@") 
     If Left(a(1), 1) <> "s" Then 
      val2 = a(0) & sa & a(1) 
      el.Value = val2 
     End If 
    ElseIf Left(el.Name, 6) = pswd Then 
     el.Value = nPswd 
    End If 
Next el 

Не совсем уверен, хотя вы, кажется, опустили код из вашего вопроса.

+0

Я понимаю, что я пропустил какой-то код, но единственный код, который был опущен, был объявлением const. Я попробовал этот метод, и он по-прежнему возвращал только последний тег ввода в документе. – JRLambert

+0

В этом случае у вас что-то странное. Например, какие-либо кадры? Можете ли вы опубликовать исходный HTML-код для двух входов, которые вы пытаетесь заполнить? –

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