Excel VBA设置外部数据区域属性报错:运行时错误'91'
问题原因及解决方法
错误根源
你遇到的运行时错误'91',是因为代码里的Selection.ListObject.QueryTable对象不存在(返回Nothing),当你试图访问它的.RowNumbers属性时,自然触发“对象变量未设置”的错误。
出现这个问题大概率是因为:你的SQL连接是通过Power Query(获取和转换数据)创建的Excel表,这类结构化表(ListObject)并不关联传统的QueryTable对象,而录制宏生成的代码沿用了旧版对象模型,导致对象引用失效。
分场景解决
场景1:表通过旧版QueryTable创建(未使用Power Query)
直接修改代码,去掉冗余的Select操作,直接引用ListObject对象,同时先检查QueryTable是否存在:
Dim targetTable As ListObject ' 替换成你的工作表名称和表名 Set targetTable = ThisWorkbook.Worksheets("Sheet1").ListObjects("CCA_XXXXXXXXX") If Not targetTable.QueryTable Is Nothing Then With targetTable.QueryTable .RowNumbers = False .FillAdjacentFormulas = False .PreserveFormatting = True .RefreshOnFileOpen = False .BackgroundQuery = False .RefreshStyle = xlInsertDeleteCells .SavePassword = False .SaveData = True .AdjustColumnWidth = False .RefreshPeriod = 0 .PreserveColumnInfo = True End With End If
场景2:表通过Power Query创建的SQL连接
这类表没有QueryTable属性,可通过两种方式实现需求:
- 手动设置(推荐):
进入Power Query编辑器,点击「关闭并上载至」→ 勾选「仅创建连接」→ 点击「属性」→ 取消勾选「调整列宽」,再重新加载数据。 - VBA代码实现:
Dim sqlConn As WorkbookConnection Dim targetTable As ListObject ' 替换成你的连接名称、工作表名和表名 Set sqlConn = ThisWorkbook.Connections("SQL连接名称") Set targetTable = ThisWorkbook.Worksheets("Sheet1").ListObjects("CCA_XXXXXXXXX") ' 调整连接属性 With sqlConn.OLEDBConnection .RefreshOnFileOpen = False .BackgroundQuery = False End With ' 直接设置表的列宽(替代AdjustColumnWidth=False的效果) targetTable.DataBodyRange.Columns.AutoFit ' 如果需要固定列宽,可手动设置.ColumnWidth = 数值
关键提示
- 永远别用
Select/Selection写VBA代码,直接引用对象(工作表、表、单元格),代码稳定性会大幅提升,也不会因为用户误操作选中其他内容而出错。 - 录制宏生成的代码往往有冗余,且可能适配旧版Excel对象模型,需要根据实际数据源类型调整。
内容的提问来源于stack exchange,提问作者Valerie
相关产品推荐
相关产品推荐

