Excel vba使用变量作为ListObjects的名称

时间:2012-03-26 03:12:34

标签: excel excel-vba vba

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,应用程序定义或对象定义的错误。当按下调试时,它停在该行 .ListObject.DisplayName = rpt_name。请帮忙

3 个答案:

答案 0 :(得分:2)

当我使用宏创建基本相同的脚本时,我遇到了同样的问题。经过一两个小时的调试,我想出了这个:

简短回答是您有一个名为 rpt_name 的对象。由于你不能拥有两个具有相同名称的对象,因此excel会抛出错误。

长答案我从VBA帮助功能得到了这个:“如果尝试将Name属性设置为另一个ListObject对象已经使用的名称,则会引发运行时错误。 “

更长的回答对我来说,我的错误是我每次运行宏时都在创建一个新表,并且宏试图为新表使用相同的名称。当然我第一次运行宏它有效,因为它没有重复的名称,但后续运行导致崩溃,因为重复的名称(在我的情况下是一个表名)

最长回答此时我猜您可能在消息框(脚本的第三行?)中输入了相同的 rpt_name ,从而导致错误。在继续编写脚本之前,您可能需要将输入到消息框中的内容与现有名称列表进行比较...

答案 1 :(得分:1)

我今天早些时候遇到了同样的错误。为了解决这个问题,我做了以下几点:

  1. 在导入访问表之前,我添加了一个表

    ActiveWorkbook.Worksheets.Add
    
  2. 访问导入代码:

    With ActiveSheet.ListObjects.Add(SourceType:=0, Source:=Array( _................
    .........
    .........
    
  3. 重命名工作表。以下代码将活动工作表重命名为AccessImport

    ActiveSheet.Name = "AccessImport"
    

答案 2 :(得分:0)

您的变量“Server_hostname”可能包含不允许用于表格显示名称的空格或其他字符。

尝试相同的代码,但更改rpt_name的值。例如rpt_name =“avgcpu”