2009-08-09 240 views
3

我有一个Excel 2007工作簿,我正在使用它连接到MSSQL 2008服务器以拉下一些名称,我能够成功实现此目标。我的问题是我想要从SQL Server获得的名称创建新的工作表。Excel 2007 VBA - 运行时错误1004

我已经能够创建一个结果数组并迭代创建一个新工作表的数组,但无法让它重新命名工作表,VB返回一个1004的运行时错误:应用程序定义或对象定义错误。我创建了一个msgbox,输出数组结果作为Im遍历它,并且msgbox中显示的名称是正确的且数量正确。

是否有人能够指出我的代码有任何问题,或者可能解释这个错误意味着什么以及如何解决它?我的代码在activesheet被重命名为数组中名称的行上出错。如果我要将名称作为i的值,则重命名活动页面。

这里是我使用的代码:

Public Sub Dataextract() 
     ' Create a connection object. 
     Dim cnPubs As ADODB.Connection 
     Set cnPubs = New ADODB.Connection 
     ' Provide the connection string. 
     Dim strConn As String 

     strConn = "Source=OLEDB;Provider=SQLOLEDB.1;Integrated Security=SSPI;" _ 
       "Persist Security Info=True;Data Source={REMOVED};" 
     'Now open the connection. 
     cnPubs.Open strConn 
     ' Create a recordset object. 
     Dim rsPubs As ADODB.Recordset 
     Set rsPubs = New ADODB.Recordset 
     With rsPubs 
     ' Assign the Connection object. 
     .ActiveConnection = cnPubs 
     ' Extract the required records. 
     ' The Select Query to display the data 
     .Open "SELECT DISTINCT [databaseName] FROM [DBMonitor].[dbo].[dbGrowth]" 
     ' Copy the records into cell A2 on Sheet1. 
     'Sheet1.Range("A2").CopyFromRecordset rsPubs 
     vArray = rsPubs.GetRows() 
     rowsreturned = UBound(vArray, 2) + 1 
     For i = 0 To rowsreturned - 1 
      ' Added the following to see if it errors anywhere else, or if it is 
      ' just the one record. 
      'On Error Resume Next 
      Sheets.Add After:=Sheets(Sheets.Count) 
      ' FAILS HERE.... 
      ActiveSheet.Name = vArray(0, i) 
      MsgBox (i & " " & vArray(0, i)) 
     Next i 
     ' Tidy up 
     .Close 
    End With 
    cnPubs.Close 
    Set rsPubs = Nothing 
    Set cnPubs = Nothing 
    End Sub 

任何帮助,任何人都可以提供将不胜感激。

感谢,

马特

回答

4

三个想法,为什么设置名称可能失败:

  1. 你已经在你的工作簿名称的表?
    试图设置一个名称已在使用中会导致“1004”

  2. 也许您正试图设置的名称包含了一些非法字符:
    :/\ * ? [ ]不准

  3. 空字符串或超过31个字符的字符串是不允许的,无论是

+0

感谢您的信息,名字没有必须任何特殊字符,他们在那里所有长度小于20个字符,但数据库中的字段是一个varchar(50),当名字被应用时,它试图插入50个字符。我现在修改了数据库结构,使它只有30个字符(名字永远不会比这更大),并且我还使用了Trim()。 感谢信息堆,它是不胜感激。 Matt – Lima 2009-08-09 12:28:53

+0

感谢您的反馈,您永远不知道何时会有人遇到同样的问题... – Treb 2009-08-09 17:12:46

相关问题