在单元格中build立方法命令并在vba中运行它
我有以下命令运行正确,如果放在一个macros在vba中:
Set elements = doc.getElementsByClassName("media-body")
我尝试在从单元内获取信息的同时运行此命令。 因此我放置
doc.getElementsByClassName("media-body")
在单元格D5,但是当我运行: Set elements = evaluate("Range(""D5"")"
)它会引发错误(运行时错误'424':对象需要。
有没有办法解决它?
不,没有办法解决这个问题。 Excel.Application.Evaluate
仅适用于Excel对象的子集。 从文档 :
备注
这种方法可以使用Microsoft Excel中的以下types的名称:
公式。 A1式参考。 您可以使用对A1风格表示法的单个单元格的任何引用。 所有参考文献都被认为是绝对参考文献。
范围。 您可以使用范围,相交和联合运算符(分别为冒号,空格和逗号)和引用。 定义的名字。 您可以用macros的语言指定任何名称。
外部参考。 你可以用! 运算符来引用一个单元格或另一个工作簿中定义的名称? 例如Evaluate(“[BOOK1.XLS] Sheet1!A1”)。
图表对象。 您可以指定任何图表对象名称,例如“图例”,“绘图区域”或“系列1”,以访问该对象的属性和方法。 例如,Charts(“Chart1”)。Evaluate(“Legend”)。Font.Name返回图例中使用的字体的名称。
您得到错误424的原因是因为doc
是您尝试从单元格运行的代码中的对象引用。 Evaluate
不知道doc
是什么,因为没有办法将其设置为单元格内的实例。
对问题中的单元格内容做任何有意义的唯一方法是parsing单元中的代码,并基本上通过VBA-VBA解释器运行它。
编辑
如果我正确地理解了你之后的内容(请参阅评论),那么您真正喜欢的是一种基于名称和types来一般searchHTML元素的方法。 我会通过select如何基于types参数search元素名称来解决这个问题。 下面的例子假定目标单元格(在sourceRow
和sourceCol
)包含元素名称,即“media-body”,右边的单元格包含它的types,即“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
在单个单元格中使用逗号分隔的string就可以轻松实现这一点,比如“media-body,ClassName”或者其他几种方法,但这是我所要做的。
replace你的:
Set elements = evaluate("Range(""D5"")")
附:
Set elements = Evaluate("D5")