Как сгенерировать лист для каждого конкретного значения

#vba #excel

#vba #excel

Вопрос:

Я включаю некоторый код в свой проект, и у меня есть кое-что, чего я не понимаю. Мой With цикл не работает.

Моя цель — создать новый лист из определенной ячейки B16 = House, а другой новый лист для каждой ячейки содержит PRIVATE word.

Пример: Когда пользователь нажимает на кнопку: — Один новый лист, созданный с заголовком = значением B16 сразу после моего первого листа (имя MyFirstSheet) — Некоторые другие листы, созданные для значений каждой ячейки, содержат слово PRIVATE, сразу после предыдущего листа.

Таким образом, результат будет MyFirstSheet, House, Test1PRIVATE, Test2PRIVATE ….

 Sub NewSheetFromTemplate()
Dim SearchRange As Range, c As Range
Dim sht As Worksheet

'New sheet for a specific cell
Sheets("TEMPLATE").Copy After:=Sheets("MyFirstSheet")
ActiveSheet.Name = Sheets("MyFirstSheet").Range("B16").Value

'New sheet for each cell contains PRIVATE
With ThiwWorkbook
   Set SearchRange = ActiveSheet.Range("B16:D70")
   For Each c In SearchRange
      If Right(c.Value, 2) = "PRIVATE" Then
         Sheets("TEMPLATE").Copy After:=Sheets("MyFirstSheet")
         Sheets("MyFirstSheet").Name = c.Value
      End If
   Next c
End With
End Sub
 

Проблема в том, что мой первый лист хорошо создан (поэтому я MyFirstSheet, House, создал), но не другие листы для каждой ячейки содержат «PRIVATE»
Excel сообщает ОБ ОШИБКЕ 1004 и создал лист в ШАБЛОНЕ заголовка (2)

Комментарии:

1. Вы говорите, что это не работает. Какую ошибку вы получаете? Что происходит, когда вы переходите к коду?

2. @Ferfa после 1-го цикла цикла [code] для каждого c в SearchRange [/ code] Листы («MyFirstSheet») не существуют, потому что вы переименовываете его в c.value, тогда куда будет скопирован новый лист после ?!?!?!

Ответ №1:

Если я правильно понимаю вопрос, вам просто нужно изменить строку

 If Right(c.Value, 2) = "PRIVATE" Then
 

Для

 If UCase(Right(c.Value, 7)) = "PRIVATE" Then
 

Это потому, что длина слова «private» составляет 7 символов, а не 2. Кроме того, я использую UCASE , чтобы убедиться, что он также найдет совпадение, если private написано с разными заглавными буквами.

Ответ №2:

Спасибо @Fabrizio и @Ralph за вашу помощь и объяснение.

Мой окончательный код:

 Sub NewSheetFromTemplate()
Dim SearchRange As Range, c As Range
Dim sht As Worksheet

'New sheet for each value contain "PRIVATE"
With ThiwWorkbook
   Sheets(1).Select
   Set SearchRange = ActiveSheet.Range("A2:C70")
   For Each c In SearchRange
      If Right(c.Value, 7) = "PRIVATE" Then
        Sheets("TEMPLATE").Copy After:=ActiveSheet
        ActiveSheet.Name = c.Value
      End If
   Next c
End With

'New sheet for a specific cell: A2
Sheets(1).Select
Sheets("TEMPLATE").Copy After:=ActiveSheet
ActiveSheet.Name = Sheets(1).Range("A2").Value

'Show OK message
Sheets(1).Select
MsgBox "OK, all sheets well created. Please fill out next sheet"

End Sub