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