我正在Mac 2016中的Excel中运行QueryTable,目标范围为'data_value',电子表格'hs'中的单元格A1的名称,QueryTable在提取数据后将名称'ExternalData_1'分配给相同的单元格A1,我要删除命名为“ ExternalData_1”,这样我就可以在脚本末尾引用“ data_value”中的值,但是不能。

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对象不存在而将出错。如果您将函数包装在正确的错误处理中,则会引发错误:


  应用程序定义或对象定义的错误


要进行测试,请在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”。

mysql - QueryTable在Excel VBA macOS中创建的范围名称-LMLPHP

关于mysql - QueryTable在Excel VBA macOS中创建的范围名称,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/53070521/

10-10 14:13