2009-08-09 6 views
3

У меня есть книга Excel 2007, которую я использую для подключения к серверу MSSQL 2008, чтобы вытащить некоторые имена, я могу добиться этого. Моя проблема в том, что я хотел бы, чтобы новые рабочие листы были созданы из имен, которые он получает от SQL Server.Excel 2007 VBA - Ошибка времени выполнения 1004

Я смог создать массив результатов и выполнить итерацию по массиву, создав новый лист, но не могу его переименовать, VB возвращает ошибку времени выполнения 1004: Определяемый или определенный объект ошибка. Я создал msgbox, который выводит результаты массива как Im, итерации через него, и имена, отображаемые в msgbox, являются правильными и имеют правильную сумму.

Можно ли указать какие-либо проблемы с моим кодом или объяснить, что означает эта ошибка и как ее решить? Мой код является ошибкой в ​​строке, где activesheet переименовывается в имя в массиве. Если бы я должен был сделать имя значением i, то activesheet будет переименован.

Вот код, я использую:

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 

Любая помощь, кто может обеспечить будет весьма признателен.

Спасибо,

Matt

ответ

4

Три идеи, почему установка имя может не:

  1. У Вас уже есть лист с таким именем в вашей книге?
    Попытка установить имя, которое уже используется приведет в «1004»

  2. Может быть имя, которое вы пытаетесь установить, содержит некоторые недопустимые символы:
    :/\ * ? [ ] не допускаются

  3. Пустое строка или строка из более чем 31 символа не допускаются, либо

+0

Спасибо за информацию, имя не имеет никаких специальных символов, и они имеют длину менее 20 символов, однако поле базы данных был varchar (50), когда имя было применено, оно пыталось вставить 50 символов. Теперь я изменил структуру базы данных так, чтобы она составляла всего 30 символов (имя никогда не будет больше этого), и я также использовал Trim(). Спасибо за кучу информации, мы очень благодарны. Matt – Lima

+0

Спасибо за отзыв, вы никогда не знаете, когда кто-то столкнется с одной и той же проблемой ... – Treb

Смежные вопросы