Имя диапазона, созданное QueryTable в макросах Excel VBA - PullRequest
0 голосов
/ 30 октября 2018

Я запускаю QueryTable в Excel для Mac 2016 с местом назначения для диапазона «data_value», именем для ячейки A1 в электронной таблице «hs», 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.

1 Ответ

0 голосов
/ 30 октября 2018

Просто удалите эту строку. Когда вы удаляете каждый 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» отсутствует в списке.

Excel Ribbon Show

...