Excel vba с использованием переменной в качестве имени ListObjects - PullRequest
0 голосов
/ 26 марта 2012
Function update_avgcpu_data(Server_hostname)

Dim rpt_name As String
rpt_name = Server_hostname & "avgcpu"
MsgBox rpt_name
With ThisWorkbook.Sheets(Server_hostname).ListObjects.Add(SourceType:=0, Source:= _
    "ODBC;DSN=localtest;",Destination:=ThisWorkbook.Sheets(Server_hostname).Range("$A$1")).QueryTable
    .CommandText = "SELECT cpu_avg_statistics_0.LOGDATE as 'Date of Month', cpu_avg_statistics_0.CPU as 'CPU Utilization %' FROM test.cpu_avg_statistics cpu_avg_statistics_0 WHERE (cpu_avg_statistics_0.SERVER_NAME='" & Server_hostname & "') AND (cpu_avg_statistics_0.LOGDATE between '2012-02-01' and '2012-02-05') ORDER BY cpu_avg_statistics_0.LOGDATE"
    .RowNumbers = False
    .FillAdjacentFormulas = False
    .PreserveFormatting = True
    .RefreshOnFileOpen = False
    .BackgroundQuery = True
    .RefreshStyle = xlInsertDeleteCells
    .SavePassword = False
    .SaveData = True
    .AdjustColumnWidth = True
    .RefreshPeriod = 0
    .PreserveColumnInfo = True
    .ListObject.DisplayName = rpt_name
    .Refresh BackgroundQuery:=False
    End With
    End Function

Я использую вышеупомянутую функцию для запуска запроса, код ошибки - ошибка времени выполнения 1004, ошибка приложения или объекта. При нажатии debug он останавливается на строке .ListObject.DisplayName = rpt_name. Пожалуйста, помогите

Ответы [ 3 ]

2 голосов
/ 24 января 2014

Я столкнулся с той же проблемой, когда использовал макрос для создания по сути того же сценария, который вы отметили. После часа или двух отладок я придумал следующее:

Краткий ответ означает, что у вас уже есть объект с именем rpt_name . Поскольку у вас не может быть двух объектов с одинаковым именем, Excel вызывает ошибку.

Длинный ответ Я получил это из справочной функции VBA: «Если предпринята попытка установить для свойства Name имя, уже используемое другим объектом ListObject, выдается ошибка времени выполнения».

Более длинный ответ для меня моя ошибка заключалась в том, что я создавал новую таблицу каждый раз, когда запускал свой макрос, и макрос пытался использовать одно и то же имя для новой таблицы. Конечно, в первый раз, когда я запустил макрос, он работал, потому что у него не было повторяющегося имени, но последующие запуски приводили к сбою из-за дублированного имени (в моем случае имя таблицы)

Самый длинный ответ на данный момент, я предполагаю, что вы, возможно, ввели то же самое rpt_name в своем окне сообщения (третья строка вашего сценария?), Что привело к ошибке. Возможно, вам придется сравнить то, что было введено в окно сообщения, со списком существующих имен, прежде чем продолжить работу со своим сценарием ...

1 голос
/ 04 августа 2015

У меня была такая же ошибка ранее сегодня.Чтобы решить эту проблему, я сделал следующее:

  1. Перед импортом таблицы доступа я добавил лист

    ActiveWorkbook.Worksheets.Add
    
  2. Код импорта доступа:

    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _................
    .........
    .........
    
  3. Переименуйте лист.Следующий код переименовывает Активный лист в AccessImport

    ActiveSheet.Name = "AccessImport"
    
0 голосов
/ 15 марта 2013

Возможно, ваша переменная "имя_сервера" содержит пробелы или другие символы, которые нельзя использовать для отображаемого имени таблицы.

Попробуйте тот же код, но измените значение rpt_name. Например, rpt_name = "avgcpu"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...