2015-05-18 5 views
1

Я использую следующий код для копирования главной копии каждый раз, когда я нажимаю кнопку.копировать и переименовывать несколько листов в excel vba

Когда я поместил команду копирования в цикл for, он создает все 20 рабочих листов.

Однако я хочу создать лист на каждом нажатии кнопки и назвать 1, 2 ..etc.

Я поставил команду копирования вне цикла

Это делает первый лист идеально. на следующий клик я получаю сообщение об ошибке 400. Любая помощь для создания этих рабочих листов и переименовать их будет п

Sub NewSheets() 

Dim i As Integer 
Dim ws As Worksheet 
Dim sh As Worksheet 
Set ws = Sheets("Template") 
Set sh = Sheets("Sheets Insert") 
Application.ScreenUpdating = 0 

Sheets("Master").Copy After:=sh 

For i = 20 To 2 Step -1 
'Sheets("Master").Copy After:=sh 
ActiveSheet.Name = i 


Next 

End Sub 

ответ

1

Я хочу, чтобы произвести лист на каждое нажатие кнопки и имя 1, 2. .и т.д.

Тогда не используйте петлю вообще. Просто создайте новый лист на кнопке и назовите лист соответствующим номером (1, 2, 3 и т. Д.). Поэтому замените свой субпользователь на:

Sub NewSheets() 

Dim i As Integer 
Dim ws As Worksheet 
Dim sh As Worksheet 
Set ws = Sheets("Template") ' Note that you are never using this... 

Set sh = Sheets(Sheets.Count) ' This will be the last sheet in the Workbook 
Application.ScreenUpdating = 0 

Sheets("Master").Copy After:=sh 

' change 3 to be the number of static sheets you have in the Workbook. 
Sheets(Sheets.Count).Name = Sheets.Count - 3 ' change 3 to the proper number 

End Sub 
+0

Это делает именно так, как я хочу , Спасибо. не могли бы вы предложить, как я могу назвать листы Master1, Master2 ....). – user3266075

+0

@ user3266075 Вы можете добавить любой префикс к имени во второй последней строке. Для 'Master' измените это на следующее:' Таблицы (Таблицы.Count) .Name = "Master" & Sheets.Count - 3' – chancea

0

Я думаю, что я понимаю, что вам нужно делать. Ваша проблема заключается в том, что вы не можете циклически выполнять этот цикл без объявления глобальной переменной.

Для того, чтобы получить то, что я думаю, что вы хотите сделать, работать - сначала нужно объявить глобальную переменную - прямо в верхней части модуля:

Global iter As Integer 

ИТЭР в данном случае это просто моя стенография для итерации - вы можете назвать это, как хотите.

Sub NewSheets() 

Dim i As Integer 
Dim ws As Worksheet 
Dim sh As Worksheet 
Set ws = Sheets("Template") 
Set sh = Sheets("Sheets Insert") 
Application.ScreenUpdating = 0 

Sheets("Master").Copy After:=sh 
If iter = 0 Then 
    iter = 1 
End If 

ActiveSheet.Name = iter 
iter = iter + 1 

If iter = 20 Then 
    iter = 1 
End If 

End Sub 

Это делает ваш код более легким, так как вам не понадобится физическая петля.

Это меняет 0 до 1 для первого когда - то будет считать добавление новых листов до тех пор, пока он получает до 20 (иметь в виду, что это не будет работать для повторного использования этих имен)

+0

Я пробовал это, и он работает, единственное ограничение - если я не могу повторно использовать имя, даже если Я удалил лист. – user3266075

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