Excel 2016的VBA语法更新

Excel 2016的VBA语法更新,excel,vba,Excel,Vba,这可能是32位对64位的问题,但我需要帮助调试新版本的Excel无法运行的代码,但Excel 2003可以。VBA中的那些版本之间是否有语法更新导致此代码无法编译 调试器将以以下行停止: With Selection.QueryTable VBA中的那些版本之间是否有语法更新导致此代码无法编译 不会。代码编译得很好,选择几乎就是任何对象,无论您使用哪个成员查询它,都将在运行时进行后期绑定解析 2003年至2007年间,Excel对象模型中增加了一项内容:引入了ListObject,但没有删除Q

这可能是32位对64位的问题,但我需要帮助调试新版本的Excel无法运行的代码,但Excel 2003可以。VBA中的那些版本之间是否有语法更新导致此代码无法编译

调试器将以以下行停止:

With Selection.QueryTable
VBA中的那些版本之间是否有语法更新导致此代码无法编译

不会。代码编译得很好,
选择
几乎就是任何
对象
,无论您使用哪个成员查询它,都将在运行时进行后期绑定解析

2003年至2007年间,Excel对象模型中增加了一项内容:引入了
ListObject
,但没有删除
QueryTable
,它仍然是
范围
类的成员。但它现在也是
ListObject
类的成员:

请参见上面的内容:

ListObject存在于Excel 2003中,并且它已经具有QueryTable属性。但它在那里不起作用,因为在2003年,您无法围绕查询表创建列表对象。从Excel 2007开始,这不仅是可能的,而且是创建查询表时的默认设置;从Excel 2016开始,如果查询没有返回任何行,则周围没有listobject的查询表将永久销毁您的公式

您的代码在
选择中运行,这是一个糟糕的想法-这是宏记录器记录的内容,但这并不意味着这是做任何事情的最佳方式

如果您的“查询表”如下所示:

当您在功能区中时,它有一个“表格工具”选项卡,…然后它就是一个
列表对象。如果您的
选择
在该表中,则
选择.QueryTable
不会剪切它,您需要通过
选择.ListObject
访问它,正如注释中所建议的:

With Selection.ListObject.QueryTable
但这仍然是一个糟糕的想法,因为您的代码非常脆弱

而是使用对象。查看Project Explorer工具窗口(Ctrl+R),找到您的工作表;选择它,然后查看属性工具窗口(F4)为其命名:将其默认的
(名称)
属性替换为有意义的内容,例如
MySuperImportantSheet

现在,您可以使用该标识符在VBA代码中引用该工作表。假设该表上只有1个“查询表”,那么这个
With
块将更加健壮:

If MySuperImportantSheet.ListObjects.Count <> 1 Then
    'handle unexpected weirdness
    Exit Sub
End If

Dim tbl As ListObject
Set tbl = MySuperImportantSheet.ListObjects(1)
With tbl.QueryTable
    'whatever you wanted to do with it
End With
如果MySuperImportantSheet.ListObjects.Count为1,则
"处理突发奇事",
出口接头
如果结束
作为ListObject的Dim tbl
Set tbl=MySuperImportantSheet.ListObjects(1)
带tbl.QueryTable
“不管你想用它做什么
以

欢迎访问该网站!它不是编译还是在运行时失败?您提到了“编译”,但也提到了“调试器”(意味着运行时)。确切的错误消息是什么?请添加详细信息,包括本声明的上下文,而不是在评论中回复。谢谢此外,请查看,以了解有关提问的更多信息,这些问题将吸引高质量的答案。“调试器停止”不是对错误的有用描述。代码本身没有问题,但在运行时可能会失败,具体取决于
选择的当前值。请重写该代码,使其不依赖
选择
(和
。选择
,和
。激活
)。这种废话只适用于宏记录器。FWIW,没有人能在不做假设的情况下回答这个问题,除非我们知道它爆炸时的
选择是什么。所以我做了一个假设回答。希望有帮助!这是一个很好的答案。如果有人想进一步测试ListObject是否有QueryTable,你可以查看我的这篇文章:.
ListObject
存在于Excel 2003中,并且它已经有了
QueryTable
属性。但它在那里不起作用,因为在2003年,您无法围绕查询表创建列表对象。从Excel 2007开始,这不仅是可能的,而且是创建查询表时的默认设置;从Excel 2016开始,如果查询没有返回任何行,则周围没有listobject的查询表将永久销毁您的公式(这是一个有趣的小错误,我没能让MS修复)。