Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
使用VBA将特定web数据导入excel_Vba_Excel_Web Scraping - Fatal编程技术网

使用VBA将特定web数据导入excel

使用VBA将特定web数据导入excel,vba,excel,web-scraping,Vba,Excel,Web Scraping,我非常熟悉VBA编码场景(web脚本更适合我),但我需要创建一个基于excel的程序,将数据从基于intranet的web应用程序导入电子表格。这是我想要建立的要点。。。 在电子表格中,用户将输入以下信息:用户名、密码、客户帐号列表和日期范围。然后,用户将单击“命令按钮”,以执行以下操作: 打开基于web的程序,登录(基于电子表格中输入的登录名/密码),然后导航到帐户搜索屏幕 在搜索字段中输入第一个客户帐号,然后单击“搜索”按钮导航到特定的客户帐号 导航到“搜索活动”屏幕,输入日期范围并单击“搜

我非常熟悉VBA编码场景(web脚本更适合我),但我需要创建一个基于excel的程序,将数据从基于intranet的web应用程序导入电子表格。这是我想要建立的要点。。。 在电子表格中,用户将输入以下信息:用户名、密码、客户帐号列表和日期范围。然后,用户将单击“命令按钮”,以执行以下操作:

  • 打开基于web的程序,登录(基于电子表格中输入的登录名/密码),然后导航到帐户搜索屏幕

  • 在搜索字段中输入第一个客户帐号,然后单击“搜索”按钮导航到特定的客户帐号

  • 导航到“搜索活动”屏幕,输入日期范围并单击“搜索活动”按钮

  • 从活动表的特定列中提取数据,并将数据导入电子表格

  • 如果有多页数据,则会有一个“下一个结果”按钮,应该有一个循环来单击下一个结果按钮(如果存在),并从每页中提取相同的数据列,直到按钮不再存在(不再有数据)

  • 一旦没有更多的数据页(或者如果只有一页),宏将返回并导航到帐户搜索屏幕,并对电子表格中键入的帐户列表中的每个帐户执行相同的操作,直到没有其他帐户为止

  • 完成后(所有数据成功导入电子表格),应关闭IE窗口

  • 这有点复杂,我意识到excel/vba绝对不是执行这些功能的最佳解决方案,但不幸的是,这正是我在本例中必须使用的。我已经能够拼凑出一些vba,它们几乎可以完成上述所有操作,我遇到的问题是在活动页面中循环并提取数据不起作用(产生一系列让我更加困惑的错误),有时它会从第一张工作表中提取数据,单击“下一个结果”按钮,进入下一页并抛出错误,甚至是翻过两三页并抛出错误。这没有多大意义,但最常见的错误是“拒绝许可”“。此外,该代码目前仅从一个帐户中提取数据,我希望一旦我为一个帐户工作,就可以简单地创建一个完整代码的循环,使其进入帐户编号列表,并对每个帐户执行相同的操作,直到完成。我已经被困在这个问题上好几个星期了,我真的准备放弃整个事情,从头开始,任何帮助都将非常感谢

    下面是我到目前为止的代码

    Private Sub CommandButton1_Click()
    
        ' open IE, navigate to the desired page and loop until fully loaded
        Set IE = New InternetExplorerMedium
        my_url = "https://customerinfo/pages/login.jsp"
        my_url2 = "https://customerinfo/pages/searchCustomer.jsp"
        my_url3 = "https://customerinfo/pages/searchAccountActivity.jsp"
    
        With IE
            .Visible = True
            .navigate my_url
            Do Until Not .Busy And .readyState = 4
                DoEvents
            Loop
        End With
    
        ' Input the userid and password
        IE.document.getElementById("userId").Value = [B2]
        IE.document.getElementById("password").Value = [B3]
    
        ' Click the "Login" button
        IE.document.getElementById("action").Click
        Do Until Not IE.Busy And IE.readyState = 4
            DoEvents
        Loop
    
        ' Navigate to Search screen
        With IE
            .navigate my_url2
            Do Until Not .Busy And .readyState = 4
                DoEvents
            Loop
        End With
    
        ' Input the account number & click search
        IE.document.getElementById("accountNumber").Value = [B5]
        IE.document.getElementById("action").Click
        Do Until Not IE.Busy And IE.readyState = 4
            DoEvents
        Loop
    
        With IE
            .navigate my_url3
            Do Until Not .Busy And .readyState = 4
                DoEvents
            Loop
        End With
    
        'Input search criteria
        IE.document.getElementById("store").Value = [C7]
        IE.document.getElementById("dateFromMonth").Value = [C10]
        IE.document.getElementById("dateFromDay").Value = [B11]
        IE.document.getElementById("dateFromYear").Value = [B12]
        IE.document.getElementById("timeFromHour").Value = [B20]
        IE.document.getElementById("timeFromMinute").Value = [B21]
        IE.document.getElementById("dateToMonth").Value = [C15]
        IE.document.getElementById("dateToDay").Value = [B16]
        IE.document.getElementById("dateToYear").Value = [B17]
        IE.document.getElementById("timeToHour").Value = [B24]
        IE.document.getElementById("timeToMinute").Value = [B25]
        IE.document.getElementById("action").Click
        Do Until Not IE.Busy And IE.readyState = 4
            DoEvents
        Loop
    
        'Pulls data from activity search
        Dim TDelements As IHTMLElementCollection
        Dim TDelement As HTMLTableCell
        Dim r As Long, i As Long
        Dim e As Object
    
        Application.Wait Now + TimeValue("00:00:05")
        Set TDelements = IE.document.getElementsByTagName("tr")
        r = 0
        For i = 1 To 1
            Application.Wait Now + TimeValue("00:00:03")
            For Each TDelement In TDelements
                If TDelement.className = "searchActivityResultsOldContent" Then
                    Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
                    r = r + 1
                ElseIf TDelement.className = "searchActivityResultsNewContent" Then
                    Sheet1.Range("E1").Offset(r, 0).Value = TDelement.ChildNodes(8).innerText
                    r = r + 1
                End If
            Next
            Application.Wait Now + TimeValue("00:00:02")
            Set elems = IE.document.getElementsByTagName("input")
            For Each e In elems
                If e.Value = "Next Results" Then
                    e.Click
                    i = 0
                    Exit For
                End If
            Next e
        Next i
    
        Do Until Not IE.Busy And IE.readyState = 4
          DoEvents
        Loop
        IE.Quit
    
    End Sub
    

    那么,单击“下一步…”元素后发生了什么?让我描述一下我遇到的一个问题。假设代码流如下所示:

  • 创建IE实例,并导航到某个URL,例如。G第一个搜索结果页面
  • 检查页面是否已加载并准备就绪。等等
  • 创建目标元素的
    DispHTMLElementCollection
    集合,由
    .document.getElementsByTagName()
    等检索
  • 循环浏览集合的元素,做一些事情
  • 单击“下一步…”元素。问题是,在某些情况下,由于一些JS或XHR处理,下一页在单击后不会立即开始下载
  • 常规检查下一页是否已加载并准备就绪。此检查只允许在没有任何延迟的情况下进一步执行代码,因为在单击后没有立即开始下载下一页,并且错误地将当前现有页确定为已下载并准备好的下一页。简单的几秒延迟并不能提供可靠的方法来获取就绪页面
  • 同样,错误地从现有页面而不是下一页创建元素的
    DispHTMLElementCollection
    集合
  • 循环浏览已创建集合的元素。循环进行时,下一页开始下载。集合仍然包含对对象的引用,但实际上已卸载包含该对象的页面。因此,无论是尝试访问卸载页面的元素,还是由于文档对象没有响应,操作都会出现“权限被拒绝”错误
  • 我的建议是避免单击“下一步…”,尝试从“下一步…”锚定
    的属性href
    读取下一页URL


    在我看来,最有效的方法是使用XHR、like和。

    请缩小您的帖子范围,将代码/文本限制在关键部分,并澄清您的问题。谢谢和问候,可能重复