用于在特定HTML类中提取值的VBA脚本

时间:2015-08-19 12:48:59

标签: html excel vba excel-vba if-statement

我创建了一个VBA脚本,通过获取HTML类中的值来从网站中提取价格。

有关更多背景信息,请参阅VBA Script pull data from website

这很有效但是在某些情况下只有1个价格(没有RRP和销售价格),因此我需要以某种方式合并一个if语句来查找一个类名,如果那不是'存在寻找另一个。

例如,我有以下电子表格:

| A | B | C |
| | Item | Price |
| | bfd/garden-structures/arbours/arbours-sunflower | |
| | bfd/garden-structures/arbours/tatton-corner-arbour-seat | |
| | bsd/garden-storage/wooden-storage/4-x-2-windsor-garden-storage-chest | |

在这个示例中,前两个使用下面的代码:(查看类VariantPrice& NowValue)但是第三个示例不能用作类VariantPrice &安培; NowValue不存在,但它确实有price类& SinglePrice

我使用的代码如下:

Sub BuyDeckingDirect()

    Dim ie As New InternetExplorer
    Dim doc As HTMLDocument
    Dim result As IHTMLElement
    Dim result2 As IHTMLElement
    Dim item As String
    Dim lRow As Long

    'ie.Visible = True'
    lRow = 2
    item = Worksheets("BuyDeckingDirect").Range("B" & lRow).Value
    MsgBox "Price Dump Started"
    Do Until item = ""
        ie.navigate "http://www.buydeckingdirect.co.uk/" & item

        Do
            DoEvents
        Loop Until ie.readyState = READYSTATE_COMPLETE

        Set doc = ie.document

        Set result = doc.querySelector(".VariantPrice")
        Set result2 = result.querySelector(".NowValue")

        Worksheets("BuyDeckingDirect").Range("C" & lRow).Value = result2.innerText

        lRow = lRow + 1
        item = Worksheets("BuyDeckingDirect").Range("B" & lRow).Value

    Loop
    MsgBox "BuyDeckingDirect Price Dump Complete"
End Sub

任何帮助都会非常感激!

由于

尔杰斯

1 个答案:

答案 0 :(得分:1)

querySelector调用中的两个类合并,如果resultNothing,请使用替代类再次调用它。

示例:

' ...
Set result = doc.querySelector(".VariantPrice .NowValue")
If result Is Nothing Then
    Set result = doc.querySelector(".VariantPrice .price")
End If
' You should consider the fact that you can have neither
If result Is Nothing Then
    Worksheets(...etc...).Value = "N/A"
Else
    Worksheets(...etc...).Value = result.innerText
End If

当然,您也可以在设置NowValue之后检查是否存在result类:

' ...
Set result = doc.querySelector(".VariantPrice")
If IsNull(result.querySelector(".NowValue")) Then
    Set result2 = result.querySelector(".price")
Else
    Set result2 = result.querySelector(".NowValue")
End If

就个人而言,我更喜欢第一种选择,但它取决于您的使用案例。