VBA для автоматизации проникновения в клетки - PullRequest
2 голосов
/ 02 июля 2019

Я новичок в VBA и прошу прощения, если этот вопрос не очень хороший.

Могу ли я получить список номеров в excel и автоматизировать процесс ввода их на веб-страницу по одномуодин?Пользователь должен войти в систему только один раз, но каждый раз, когда ему нужно нажимать кнопки, прежде чем получать информацию о номере с веб-страницы.

У меня есть список таких номеров:

enter image description here

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

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

enter image description here

.... на эту страницугде пользователь нажимает Инициирует , затем Флажок , затем Просмотр (и каждая «строка» кнопок отображается только после нажатия на предыдущую) .... enter image description here

.... на эту страницу, где пользователь щелкает историю, а затем вводит одно из чисел.enter image description here

В резюме: Код, который у меня есть в данный момент, входит в систему на этом сайте, вводит имя пользователя и пароль.Прессы входят.Затем переходит к следующему экрану, где я нажимаю кнопку «инициировать», затем установите флажок, затем просмотрите.Далее он переходит к следующему экрану, где программа нажимает кнопку истории.Затем он возвращается к Excel (в столбец A), вынимает первое число и вводит его там, где написано «Number Here», и нажимает кнопку ввода.Это приводит меня к странице с кучей информации, которую я затем копирую и вставляю обратно в Excel.

Опять же, у меня работает программа для этих факторов.

Однако , я полагаю, мой код должен перемещаться на следующее число в столбце (т. Е. Делать вышеупомянутые шаги сначала для ячейки A3, затем для ячейки A4и т. д.), но это , а не .

Ниже мой код:

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

Option Explicit

Sub _NumberFix()

Dim IE As Object
Dim IeDoc As Object
Dim aInput As Object
Dim eInput As Object
Dim svalue1 As Object
Dim a As Object
Dim b As Object
Dim elems As Object
Dim t As Date
Dim i As Long, lastrow As Long
Dim results As Variant, wkshtnames()
Dim ws As Worksheet, wks As Excel.Worksheet
Dim NewName As String
Dim sheet As Worksheet
Dim duplicate As Boolean

Const MAXWAIT_sec As Long = 10

Set ws = Sheets("VALUES")

Set IE = CreateObject("InternetExplorer.application")
IE.Visible = True
IE.Navigate ("http://mywebsite.com/")

    Do While IE.busy: DoEvents: Loop

Set IeDoc = IE.document

'Enters username and password
    With IeDoc.all
        .UserName.Value = "userr"
        .Password.Value = "password"
    End With

    With IE.document.forms("signingin")
        .document.forms(0).submit
    End With


Application.Wait (Now + TimeValue("0:00:03"))


Set IeDoc = IE.document ' set new page source

    t = Timer

    Do
        On Error Resume Next
        Set elems = IeDoc.queryselector("input[value=Initiate]")
        On Error GoTo 0
        If Timer - t > MAXWAIT_sec Then
            Exit Do
        End If
    Loop While elems Is Nothing

    If Not elems Is Nothing Then
        elems.Item.Click
    End If

    Application.Wait (Now + TimeValue("0:00:03"))


    IeDoc.getElementByID("checkConf").Click


    For Each aInput In IeDoc.getElementsbyTagName("input")
        If aInput.getAttribute("value") = "Request" Then
            aInput.Click
            Exit For
        End If
    Next aInput


    Do While IE.busy: DoEvents: Loop

    'Selects historical
    For Each aInput In IeDoc.getElementsbyTagName("input")
        If aInput.getAttribute("value") = "History" Then
            aInput.Click
            Exit For
        End If
    Next aInput


    lastrow = ws.Cells(ws.rows.Count, "A").End(xlUp).Row
    IE.Visible = True

    For i = 3 To lastrow

    Set IeDoc = IE.document ' set new page source

        Set svalue1 = IeDoc.getElementByID("Number")
        svalue1.Value = ws.Cells(i, 1).Value 'takes the  number out and enters
            'presses submit once numb is entered
            For Each aInput In IeDoc.getElementsbyTagName("input")
                If aInput.getAttribute("value") = "Submit" Then
                    aInput.Click
                    Exit For
                End If
            Next aInput

        IE.Navigate ("https://mywebsite.com/")
        Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop
        IE.Visible = True
        Exit For


Next i
        Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop
        IE.Visible = True


End Sub                

Ответы [ 2 ]

2 голосов
/ 03 июля 2019

Я попытался разобраться в этом - попробуйте следующий код.

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

Option Explicit
Public Const UBlim As Long = 6
Sub Login()

    Dim IE As Object
    Dim eInput As Object
    Dim ws As Worksheet: Set ws = Sheets("VALUES")
    Dim i As Long
    Dim j As Long
    Dim lastrow As Long
    Dim svalue1 As Object
    Dim results As Variant
    Dim wkscnt As Long
    Dim wks As Excel.Worksheet
    Dim wkshtnames()
    Dim a As Object
    Dim b As Object
    Dim t As Date
    Dim elems As Object
    Const MAXWAIT_sec As Long = 10

    Set IE = CreateObject("InternetExplorer.application")
    IE.Visible = True
    IE.Navigate ("http://mywebsite.com/")

    With IE

        Do
            If IE.readystate = 4 Then
                Exit Do
            Else
                DoEvents
            End If
        Loop

        'Enters username and password

        With .document
            .forms("signingin").UserName.Value = "userr"
            .forms("signingin").Password.Value = "password"
            .forms("signingin").document.forms(0).submit

            'this clicks a button after logging in that says initiate new request
            t = Timer

            Do
                On Error Resume Next
                Set elems = .document.queryselectorall("input[value=Initiate]")
                On Error GoTo 0

                If Timer - t > MAXWAIT_sec Then
                    Exit Do
                End If

            Loop While elems Is Nothing

            If Not elems Is Nothing Then
                elems.Item.Click
            End If

            Application.Calculation = xlCalculationManual
            Application.CutCopyMode = False
            wkscnt = ThisWorkbook.Sheets.Count
            j = 0

            For Each wks In ActiveWorkbook.Worksheets

                j = j + 1

                If j > UBlim Then
                    ReDim Preserve wkshtnames(7 To wkscnt)
                    wkshtnames(j) = wks.Name
                End If

            Next wks

            If wkscnt > UBlim Then
                Application.DisplayAlerts = False
                Sheets(wkshtnames).Delete
                Application.DisplayAlerts = True
            End If

            lastrow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row

            For i = 3 To lastrow
                Set svalue1 = .getElementbyID("Number")
                svalue1.Value = ws.Cells(i, 1).Value
                i = i + 1

                For Each eInput In .getElementsbyTagName("input")
                    If eInput.getAttribute("value") = "Submit Request" Then
                        eInput.Click
                        Exit For
                    End If
                Next eInput

                IE.Visible = True

                'copy and pasting the info from the web page to a new excel sheet
                Sheets("Sheet4").Range("A1:Z100").ClearContents
                IE.ExecWB 17, 0 '//select
                IE.ExecWB 12, 2 '//Copy Selection
                ActiveSheet.Paste

                Sheets("Sheet4").Range("A3:Q32").Copy

                'Creates a new sheet after & pastes content into it, formats
                Sheets.Add After:=ActiveSheet
                ActiveSheet.Paste
                Selection.Columns.AutoFit
                Selection.Rows.AutoFit

                ActiveSheet.Protect
                'this navigates back to the page where I need to enter the value in the excel column again

                IE.Navigate ("https://mywebsite.com/Default")
            Next i

        End With

    End With

End Sub
1 голос
/ 17 июля 2019

Хорошо, после того, как я несколько раз задал этот вопрос и попытался найти разные способы решения этой проблемы, у меня есть НАЙДЕН ( / написано ) мой ответ!

Вот оно:

Option Explicit

Sub NewScrape()

Dim IE As Object
Dim IeDoc As Object
Dim aInput As Object
Dim eInput As Object
Dim svalue1 As Object
Dim a As Object
Dim b As Object
Dim elems As Object
Dim t As Date
Dim i As Long, lastrow As Long
Dim results As Variant, wkshtnames()
Dim ws As Worksheet, wks As Excel.Worksheet
Dim NewName As String
Dim sheet As Worksheet
Dim duplicate As Boolean

Const MAXWAIT_sec As Long = 10

Set ws = Sheets("VALUE")

Set IE = CreateObject("InternetExplorer.application")
IE.Visible = True
IE.Navigate ("http://mywebsite.com/")

    Do While IE.busy: DoEvents: Loop

Set IeDoc = IE.document

'Enters username and password
    With IeDoc
        .forms("signingin").UserName.Value = "userr"
        .forms("signingin").Password.Value = "password"
        .forms("signingin").document.forms(0).submit
    End With


Application.Wait (Now + TimeValue("0:00:03"))

    lastrow = ws.Cells(ws.rows.Count, "A").End(xlDown).Row
    IE.Visible = True

    For i = 3 To lastrow

Set IeDoc = IE.document ' set new page source

    t = Timer

    Do
        On Error Resume Next
        Set elems = IeDoc.queryselector("input[value=Initiate]")
        On Error GoTo 0
        If Timer - t > MAXWAIT_sec Then
            Exit Do
        End If
    Loop While elems Is Nothing

    If Not elems Is Nothing Then
        elems.Item.Click
    End If

    Application.Wait (Now + TimeValue("0:00:03"))


    IeDoc.getElementByID("checkConf").Click


    For Each aInput In IeDoc.getElementsbyTagName("input")
         If aInput.getAttribute("value") = "Request" Then
            aInput.Click
            Exit For
        End If
    Next aInput


    Do While IE.busy: DoEvents: Loop

    'Selects history
    For Each aInput In IeDoc.getElementsbyTagName("input")
        If aInput.getAttribute("value") = "History" Then
            aInput.Click
            Exit For
        End If
    Next aInput


        Set svalue1 = IeDoc.getElementByID("accountNumber")
        svalue1.Value = ws.Cells(i, 1).Value 'takes the  number out and enters
            'presses submit once acct numb is entered
            For Each aInput In IeDoc.getElementsbyTagName("input")
                If aInput.getAttribute("value") = "Submit Request" Then
                    aInput.Click
                    Exit For
                 End If
            Next aInput


    Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop
    IE.Visible = True



    'Webpage sometimes takes time to load.
    Application.Wait DateAdd("s", 10, Now)


    'Selects and clears sheet 4
    Sheets("Sheet4").Select
    Range("A1:Z100").Select
    Selection.ClearContents

    Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop


    IE.ExecWB 17, 0 '//select all from webpage
    IE.ExecWB 12, 2 '//Copy Selection

    Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop

    Application.Wait DateAdd("s", 2, Now)

    Application.DisplayAlerts = False  '//Doesnt display alerts
    ActiveSheet.Paste

    Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop


    Sheets("Sheet4").Select '//Selects sheet 4 again
    Range("A3:Q32").Select
    Selection.Copy

    Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop

    Application.Wait DateAdd("s", 2, Now)

    'Creates a new sheet after & pastes content into it, formats
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Paste
    Selection.Columns.AutoFit
    Selection.rows.AutoFit

    Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop


    'If the worksheet already has been made:
    duplicate = False
    For Each sheet In ThisWorkbook.Sheets
        If sheet.Name = Range("D10") Then
            MsgBox ("ERROR: This Numb has already been formulated")
            NewName = InputBox("Please Rename:")
            ActiveSheet.Name = NewName
            duplicate = True
                Exit For
        End If
    Next sheet

    If duplicate = False Then
        ActiveSheet.Name = Range("d10")
        Range("A6").Clear
        ActiveSheet.Protect
       ' MsgBox ("DONE, next...")
    End If


            'this navigates back to the page where I need to enter the value in the excel column again


        IE.Navigate ("https://mywebsite.com/Default")
        Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop
        IE.Visible = True


Next i
        Do While (IE.READYSTATE <> 4 Or IE.busy <> False): DoEvents: Loop
        IE.Visible = True

        On Error GoTo 0
        MsgBox ("All Accounts Have Been Formulated, Check it out!")




  End Sub

Так что в основном Я думаю, что моя проблема заключается в том, куда я положил lastrow= строка и строка i=3 и т.д., а также строка Set IeDoc = IE.document после этого тоже. :)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...