VBA在不同的关键短语之前找到短语的最后一个实例?

时间:2012-07-10 15:05:50

标签: html vba search excel-vba excel

我有一个来自HTML源代码的大字符串(大约1,000,000个字符)。我正在使用msinet.ocx查看来自相应网站的文本。我写了一小段代码,以便找到一个关键短语(“pkid =”),它发生在不同的关键短语(“组件附件矩阵”)之前,但它无法正常工作。这就是我现在所拥有的:

workbench = Cells(columnNumber, 1).Value
myURL = "http://beams.us.yazaki.com/Beams/ViewDetails.aspx?topic=document&pkid=" _
& workbench
Dim inet1 As Inet
Dim mypage As String

Set inet1 = New Inet
With inet1
    .Protocol = icHTTP
    .URL = myURL
    mypage = .OpenURL(.URL, icString)
End With

CAMnum = InStr(mypage, "Component Accessory Matrix")
intStart = InStrRev(mypage, "pkid=", CAMnum) + 5
newnum = Mid(mypage, intStart, 6)
Cells(columnNumber, 2).Value = newnum

问题似乎是mypage = .OpenURL(.URL, icString);当我运行len(mypage)时,它返回大约100,000的值,当它应返回大约一百万的值时。有人可以解释一下吗?

2 个答案:

答案 0 :(得分:1)

使用InStrInStrRev,找到您的字符串,然后向后看。一旦你有了这个位置,从那里向前看,直到我们找到引号字符。最后,使用这些位置来获取字符串

pos1 = InStrRev(YourXMLString, "pkid=", InStr(YourXMLString, "Component Accessory Matrix")) + 5 ' length of "pkid="
pos2 = InStr(pos1, YourXMLString, Chr(34)) ' Chr(34)="
FoundString = Mid$(YourXMLString, pos1, pos2 - pos1)

请注意,如果“组件附件矩阵”缺失,或者之前没有“pkid =”,或者报价不是分隔符,或者更多文本介于 pkid = 和引号之间,代码将失败和/或产生无意义的结果。

答案 1 :(得分:1)

使用HTML DOM。

  • 将文本加载到HTML文档中:

    Dim html As Object ' MSHTML.HTMLDocument  
    Set html = CreateObject("htmlfile")  
    html.body.innerHTML = "your HTML code here"
    
  • 使用getElementsByTagName获取td元素的集合:

    Dim tdElements As Object ' MSHTML.IHTMLElementCollection  
    Set tdElements = html.getElementsByTagName("td")  
    
  • 循环浏览它们,直到找到内部文本为“Component Accessory Matrix”的文本,然后抓取上一个td元素的内部文本。

    Dim tdElement As Object ' MSHTML.IHTMLElement  
    Dim i As Long  
    Dim textToParse As String  
    For i = 1 to tdElements.Count  
      If tdElements.Item(i).innerText = "Component Accessory Matrix" Then  
        ' get previous <td>  
        Set tdElement = tdElements.Item(i - 1)  
        textToParse = tdElement.innerText  
        Exit For  
      End If  
    Next i  
    
  • 使用传统方法解析字符串

我会将结果字符串拆分为=并取第二个元素,然后将该字符串拆分为"并取第一个元素。这样就离开了300451

Here's a further example if you need it