Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.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中运行_Vba_Excel - Fatal编程技术网

在单元格中生成方法命令并在vba中运行

在单元格中生成方法命令并在vba中运行,vba,excel,Vba,Excel,如果将以下命令放置在vba中的宏中,则可以正确运行: Set elements = doc.getElementsByClassName("media-body") 我尝试在从单元格中获取信息时运行此命令。所以我把 doc.getElementsByClassName("media-body") 在单元格D5中,但当我运行时: Set elements=evaluateRangeD5它抛出一个错误运行时错误“424”:需要对象 有办法解决吗?替换您的: Set elements = eval

如果将以下命令放置在vba中的宏中,则可以正确运行:

Set elements = doc.getElementsByClassName("media-body")
我尝试在从单元格中获取信息时运行此命令。所以我把

doc.getElementsByClassName("media-body")
在单元格D5中,但当我运行时: Set elements=evaluateRangeD5它抛出一个错误运行时错误“424”:需要对象

有办法解决吗?

替换您的:

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


不,没有办法解决它。Excel.Application.Evaluate仅适用于Excel对象的子集。发件人:

评论

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

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

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

外部引用。你可以用这个!操作人员 引用单元格或其他工作簿中定义的名称?对于 例如,评估[BOOK1.XLS]Sheet1!A1

图表对象。你可以 指定任何图表对象名称,例如图例、绘图区域或 系列1,以访问该对象的属性和方法。对于 例如,ChartsChart1.EvaluateLegend.Font.Name返回 图例中使用的字体的名称

出现错误424的原因是,doc是您试图从单元格运行的代码中的对象引用。Evaluate不知道doc是什么,因为无法从单元格中将其设置为实例

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

编辑

如果我正确理解了您在查看注释后的内容,那么您真正想要的是一种基于名称和类型搜索HTML元素的方法。我将通过选择如何基于类型参数搜索元素名来实现这一点。下面的示例假设行sourceRow和列sourceCol中的目标单元格包含元素名称,即媒体正文,右侧的单元格包含其类型,即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或其他几种方法,但这是我要走的方向。

我已经尝试过,但它只是将元素的值设置为doc.getElementsByClassNamemedia-body。它不运行该方法。如果您需要提供更多信息,您的代码的其余部分有哪些?D5单元格中有什么?这是我代码的一部分-它的其他元素是对问题没有影响的常规元素:子模板\u废弃ie.navigate RangeB3应用程序。现在等待+时间值0:00:2 Set doc=ie.document“This one works Set elements=doc.getelements ByclassnameMedia-body”这一个也可以工作,但不起我想的作用want'在D5中,我有-doc.getElementsByclassnamemedia-body Set elements=EvaluateD5 End子我导航到的页面是:那么您的意思是将整个代码构建在一个单元格中,然后通过vba解释器运行它?你能提到一个可靠的VBA解释器吗?@Andrei-AFAIK,没有一个VBA解释器是用VBA写的-你必须写出来。这是我的VBA之外的smthexpertise@Andrei-你到底想做什么?我试图在Excel中创建一个网页抓取模板。我的想法是在单元格内输入一些通用元素,然后让代码基于这些元素执行。例如,如果我必须在页面中查找classname=media body,我将把它放在一个单元格中,然后代码将相应地执行。
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