2016-06-07 11 views
1

У меня есть рабочая книга MS Excel, содержащая множество рабочих листов.MS Excel «индекс вне диапазона» при копировании рабочих листов в новую рабочую книгу

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

Затем код перебирает (цикл) через рабочие листы в источнике Workbook и добавить имена соответствующих рабочих листов в строку ...

Dim worksheetsToCopy As String 

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

После цикла завершения я проверить переменную с Debug .print worksheetsToCopy , который дает мне следующий результат в окне Immediate: "Tab Admin", "Home Tab", "Панель управления",

Тогда я раздеванием из последнего "" с

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

Затем, когда я пытаюсь скопировать рабочие листы, содержащиеся в переменной worksheetsToCopy со следующей строки кода, я получаю сообщение об ошибке выполнения 9 - Subscript вне диапазона:

Sheets(Array(worksheetsToCopy)).Copy 

Однако, когда я бегу та же команда, но вручную ввести имена вкладок в кавычки и запятые как ниже, он отлично работает:

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

Почему я получаю сообщение об ошибке выполнения 9 - «Подстрочный из диапазона» ошибка с первым утверждением.

Что я делаю неправильно или не хватает? Любая помощь будет оценена ...

+1

Ваш код эквивалентен 'Sheets (Array ("" "Администратор Tab"», "" Home Tab «", "Панель инструментов" ")). Копировать', а не' Листы (Array («вкладка« Администратор »,« Главная вкладка »,« Панель мониторинга »)). См. Ответ Dawid для создания массива из строки. –

ответ

0

Похоже, вы создаете двойную кавычку. Попробуйте создать обычную строку с именами, разделенными запятой, и разделить ее на фактический массив, например:
«Вкладка« Администратор », вкладка« Главная »,« Панель мониторинга »
Как только вы получите свою строку, удалите последнюю запятую и используйте ее так: для листа массива копия:

'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

Большое спасибо за отзыв Dawid. Я попробовал это, как вы описали, но я все равно получаю ту же ошибку ... Любые другие идеи, возможно? – Ben

+0

Не могли бы вы оставить остальную часть своего кода? Может быть что-то с именем листа, поскольку эта ошибка возникает, когда объект не задан. –

+0

Я нашел недостающую часть, удаление последней, из строки рабочих строкТокопию. Я добавил его к вашему сообщению, чтобы помочь людям в будущем, которые могут иметь такую ​​же проблему. Я также опубликую весь комплект кода в своем оригинальном посте. Спасибо за вашу помощь Давид, очень ценится. – Ben

0

Вот решение проблемы, описанной в данной теме.

The worksheet in MS Excel код, который выполняется, когда пользователь нажимает на кнопку "Создать новую книгу":

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 
Смежные вопросы