在单元格中构建方法命令并在vba中运行它

时间:2017-02-24 14:35:30

标签: excel vba excel-vba

如果放在vba中的宏中,我有以下命令可以正确运行:

Set elements = doc.getElementsByClassName("media-body")

我尝试在从单元格中获取信息时运行此命令。因此我放置

doc.getElementsByClassName("media-body")

在单元格D5中,但是当我运行时: Set elements = evaluate("Range(""D5"")")它会抛出错误(运行时错误' 424':需要对象。

有没有办法解决它?

2 个答案:

答案 0 :(得分:1)

不,没有办法解决它。 Excel.Application.Evaluate仅适用于Excel对象的子集。来自the documentation

  

备注

     

可以使用Microsoft Excel中的以下类型的名称   用这种方法:

     

公式。 A1风格的参考。你可以使用任何   以A1风格表示法引用单个单元格。所有引用都是   被认为是绝对的参考。

     

范围。你可以使用范围,   intersect和union运算符(分别为冒号,空格和逗号)   有参考。定义名称。您可以在中指定任何名称   宏的语言。

     

外部参考。你可以使用!操作者   引用单元格或另一个工作簿中定义的名称?对于   例如,评估(“[BOOK1.XLS] Sheet1!A1”)。

     

图表对象。您可以   指定任何图表对象名称,例如“图例”,“绘图区域”或   “系列1”,用于访问该对象的属性和方法。对于   例如,图表(“Chart1”)。评估(“图例”)。字体名称返回   图例中使用的字体名称。

您收到错误424的原因是因为doc是您尝试从单元格运行的代码中的对象引用。 Evaluate无法确定doc ,因为无法将其设置为单元格内的实例。

对问题中的单元格内容做任何有意义的事情的唯一方法是解析单元格中的代码,并基本上通过VBA-VBA解释器运行它。

修改

如果我理解你所追求的是什么(参见评论),你真正喜欢的是一种基于名称和类型一般搜索HTML元素的方法。我通过选择如何根据类型参数搜索元素名称来解决这个问题。下面的示例假定目标单元格(行sourceRow和列sourceCol)包含元素名称,即“media-body”,右侧的单元格包含其类型 - 即“ClassName”

Public Function GetElement(targetSheet As Worksheet, doc As HTMLDocument, _
                           sourceRow As Long, sourceCol As Long) As IHTMLElement
    With targetSheet
        'Get the element name from the passed cell.
        Dim elementName As String
        elementName = .Cells(sourceRow, sourceCol)
        'Get the element type from the adjacent cell.
        Dim elementType As String
        elementType = .Cells(sourceRow, sourceCol + 1)
        Select Case elementType
            Case "ClassName"
                Set GetElement = doc.getElementsByClassName(elementName)
            Case "Id"
                Set GetElement = doc.getElementById(elementName)
            Case "Name"
                Set GetElement = doc.getElementsByName(elementName)
            '...
        End Select
    End With
End Function

这可以很容易地通过单个单元格中的逗号分隔字符串来实现 - 类似于“media-body,ClassName”或其他几种方法,但这是我要去的方向。

答案 1 :(得分:0)

替换你的:

Set elements = evaluate("Range(""D5"")")

使用:

Set elements = Evaluate("D5")