#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