2016-06-07 5 views
1

Ich habe eine MS Excel-Arbeitsmappe, die viele Arbeitsblätter enthält.MS Excel "Subskript out of range" beim Kopieren von Arbeitsblättern in neue Arbeitsmappe

Benutzer geben Daten in eines der Arbeitsblätter ein und klicken dann auf eine Schaltfläche, auf der VBA-Code ausgeführt wird. Basierend auf Bedingungen, die von Benutzereingaben abgeleitet wurden, muss ich eine neue Arbeitsmappe erstellen, die Kopien einiger Arbeitsblätter enthält.

Der Code wiederholt sich dann (Schleife) durch die Arbeitsblätter in der Quelle-Arbeitsmappe und die Namen der entsprechenden Arbeitsblätter in einen String hinzufügen ...

Dim worksheetsToCopy As String 

worksheetsToCopy = worksheetsToCopy & """" & "Admin Tab" & """" & ", " 

Nach der abgeschlossenen Schleife inspizieren ich die Variable mit Debug .print worksheetsToCopy , die mir die folgende Ausgabe in dem Direkt-Fenster gibt: "Admin Tab", "Home Tab", "Armaturenbrett",

Dann I-out Streifen der letzte "" mit

worksheetsToCopy = Mid(worksheetsToCopy, 1, InStrRev(worksheetsToCopy, ",") - 1) 

Dann, wenn ich versuche, die Arbeitsblätter in der Variablen worksheetsToCopy mit der folgenden Codezeile enthalten sind, zu kopieren, erhalte ich den Laufzeitfehler 9 - Index außerhalb des Bereichs:

Sheets(Array(worksheetsToCopy)).Copy 

Allerdings, wenn ich laufen die gleiche Anweisung aber manuell die Registerkarten Namen in Anführungszeichen und mit Kommas wie unten eingeben, funktioniert es gut:

Sheets(Array("Admin Tab", "Home Tab", "Dashboard")).Copy 

Warum erhalte ich den Laufzeitfehler 9 - „Subscript out of range“ Fehler mit der ersten Anweisung.

Was mache ich falsch oder fehlt? Irgendwelche Hilfe wird geschätzt ...

+1

Ihr Code entspricht 'Sheets (Array ("" "Admin Tab"“, "" Home Tab "", "" Dashboard "" ")). Copy', nicht' Sheets (Array ("Admin Tab", "Home Tab", "Dashboard")). Copy'. Siehe Dawid-Antwort für das Erstellen eines Arrays aus einer Zeichenfolge. –

Antwort

0

Sieht aus wie Sie eine doppelte Zeichenfolge in Anführungszeichen erstellen. Versuchen Sie, eine normale Zeichenfolge mit durch Komma getrennten Namen zu erstellen, z. B.:
"Registerkarte" Admin ", Registerkarte" Start ", Dashboard"
Sobald Sie Ihre Zeichenfolge erhalten, entfernen Sie das letzte Komma und verwenden Sie es wie folgt für die Blätter Array-Kopie:

'Add a string array variable 
Dim sheetArray() As String 

'Remove the last , from the string of Worksheets to copy 
worksheetsToCopy = Mid(worksheetsToCopy, 1, InStrRev(worksheetsToCopy, ",") - 1) 

'Create the array from your string 
sheetArray = Split(worksheetsToCopy, ",") 

'And copy the sheets 
Sheets(sheetArray).Copy 
+0

Vielen Dank für das Feedback Dawid. Ich habe es versucht, wie Sie beschrieben, aber ich bekomme immer noch genau den gleichen Fehler ... Irgendwelche anderen Ideen vielleicht? – Ben

+0

Könnten Sie bitte den Rest Ihres Codes posten? Könnte etwas mit dem Blattnamen sein, da dieser Fehler auftritt, wenn das Objekt nicht gesetzt ist. –

+0

Ich habe das fehlende Stück, das Entfernen des letzten, aus der Zeichenkette der WorksheetsToCopy gefunden. Ich habe es zu Ihrem Beitrag hinzugefügt, um Menschen in Zukunft zu helfen, die dasselbe Problem haben könnten. Ich werde auch den ganzen Satz von Code in meinem ursprünglichen Beitrag veröffentlichen. Vielen Dank für Ihre Hilfe Dawid, sehr geschätzt. – Ben

0

Hier ist die Lösung für den Fehler im Thema beschrieben.

The worksheet in MS Excel Der Code, den der Benutzer ausgeführt wird, wenn die "Neue Arbeitsmappe" Schaltfläche klickt:

Option Explicit 

Sub ButtonCreateWorkbook_Click() 
' 
' ButtonCreateClientWorkbookk_Click Macro 
' This Macro creates a new workbook containing specific worksheets based on the selection 
' that are set in the "Control" worksheet of the Workbook 
' 
Dim strWorksheetsToCopy As String 
Dim wbSourceWorkbook As Workbook 
Dim strControlSheet As String 
Dim iRowStart As Integer 
Dim iRowEnd As Integer 
Dim strWorksheetColumn As String 
Dim strSwitchColumn As String 
Dim iRow As Integer 
Dim strSheetArray() As String 

Set wbSourceWorkbook = Application.ActiveWorkbook 

strControlSheet = "Control" 
wbSourceWorkbook.Sheets(strControlSheet).Activate 
strWorksheetColumn = "B" 'this variable indicates which iRow contains the Worksheet names 
iRowStart = 2   'this value must set to the iRow number where the FIRST Worksheet Name occurs in Column A 
'this value must be set to the iRow number where the LAST Worksheet Name occurs in Column B 
iRowEnd = Cells(Rows.Count, 2).End(xlUp).Row 
strSwitchColumn = "C"  'this column must be set to the value of the "On/Off Switch" column on the "Control_ShowHide" worksheet. 

'This section of code controls which worksheets must be copied and add the name of the worksheet to the string 
For iRow = iRowStart To iRowEnd 
    'Check if the worksheet must be copied 
    If wbSourceWorkbook.Sheets(strControlSheet).Range(strSwitchColumn & iRow).Value > 0 Then 
     strWorksheetsToCopy = strWorksheetsToCopy & wbSourceWorkbook.Sheets(strControlSheet).Range(strWorksheetColumn & iRow).Value & "," 
    End If 
Next iRow 
Debug.Print strWorksheetsToCopy 

'Remove the last , from the string 
strWorksheetsToCopy = Mid(strWorksheetsToCopy, 1, InStrRev(strWorksheetsToCopy, ",") - 1) 

'Transpose the String to a string array 
strSheetArray = Split(strWorksheetsToCopy, ",") 

'Create the new Workbook with the relevant sheets 
wbSourceWorkbook.Sheets(strSheetArray).Copy 

End Sub 
Verwandte Themen