Excel VBA macos 中 QueryTable 创建的范围名称

Range name created by QueryTable in Excel VBA macos

我是 运行 Excel 中 Mac 2016 年的 QueryTable,目标范围 'data_value',电子表格中单元格 A1 的名称 'hs', QueryTable 在提取数据后将名称 'ExternalData_1' 分配给同一个单元格 A1,我想删除名称 'ExternalData_1' 以便我可以在脚本末尾引用 'data_value' 中的值但是可以't.

Function get_data(input_id As String, input_date As String)

Dim sqlstring As String
Dim connstring As String
Dim sLogin As String

 sLogin = "DATABASE=[DB];UID=[USER];PWD=[PWD]"
sqlstring = "SELECT data_value FROM tb_data_values WHERE data_date='" & input_date & "'"
connstring = "ODBC;DSN=myodbc;" & sLogin

With
    Worksheets("hs").QueryTables.Add(Connection:=connstring, Destination:=Range("data_value"), Sql:=sqlstring)
   .FieldNames = False
   .BackgroundQuery = False
   .Refresh
   .RefreshStyle = xlOverwriteCells

End With

get_data = Range("data_value")

Dim qt As QueryTable
For Each qt In Worksheets("hs").QueryTables
   qt.Delete
Next qt

Worksheets("hs").Names("ExternalData_1").Delete
Worksheets("hs").Range("data_value").ClearContents

End Function

VBA 在行 Worksheets("hs").Names("ExternalData_1").Delete.

中停止 运行

只需删除该行即可。当您删除每个 QueryTable 时,您已经删除了它的命名范围。因此,您的调用 Worksheets("hs").Names("ExternalData_1").Delete 是多余的,并且会出错,因为 Name 对象不存在。如果您将函数包装在适当的错误处理中,错误将引发:

Application-defined or Object-defined error

为了测试,运行 一个 Name 范围循环就在 QueryTables 循环之后。从下面,您会看到只有一个 "ExternalData_1" 会打印 Debug.Print

Dim qt As QueryTable, RngName As Name

For Each qt In Worksheets("hs").QueryTables
    Debug.Print qt.Name                           ' "ExternalData_1" WILL PRINT
    qt.Delete
Next qt

For Each RngName In Worksheets("hs").Names
    Debug.Print RngName.Name                      ' "ExternalData_1" WILL NOT PRINT
Next RngName

或者,您可以在功能区 > 公式 > 名称管理器(在定义的名称部分下)下检查 运行 上面没有行的代码(在 Mac 上可能有所不同),并查看“"ExternalData_1" 未列出。