#excel #vba
#excel #vba
Вопрос:
Если я помещу источник проверки данных в рабочую книгу original workbook.xlsm
на Sheet1
as "='Validations'!$A$2:$A$10"
, используя следующий VBA:
Public Sub AddValidationToRange(targetRng As Range, validRng As Range)
With targetRng.Validation
.Delete
.Add Type:=xlValidateList, _
AlertStyle:=xlValidAlertStop, _
Operator:=xlBetween, _
Formula1:="='" amp; validRng.Worksheet.Name amp; "'!" amp; validRng.Address
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub
А затем я копирую Sheet1
в другую книгу, источник проверки данных становится "=[original workbook.xlsm]Validations'!$A$2:$A$10"
Я также использую VBA для копирования листа:
ws.Copy after:=wb.Sheets(wb.Sheets.count)
Я не хочу, чтобы это предположение о книге выполнялось, я хочу, чтобы источник оставался точно таким же "='Validations'!$A$2:$A$10"
, потому что я все равно буду копировать Validations
лист в ту же новую книгу для настройки.
Есть ли способ эффективно удалить «абсолютную» ссылку на рабочую книгу и сохранить локальную проверку данных для ее хост-книги?
Комментарии:
1. Возможно, использую
INDIRECT
, но не тестировал.
Ответ №1:
Группа (массив) листов
- Вы можете добиться этого, скопировав оба листа «за один раз».
- Вручную: выберите
Sheet1
и нажмите CTRLи выберитеValidations
. Теперь щелкните правой кнопкой мыши на одной из этих вкладок и выберитеMove or Copy
… - Вы также можете использовать следующий код.
Код
Sub copyGroupOfWorksheets()
Dim swb As Workbook
Set swb = ThisWorkbook ' The workbook conataining this code.
Dim dst As Workbook
Set dst = Workbooks("Test.xlsm")
swb.Worksheets(Array("Sheet1", "Validations")).Copy _
After:=dst.Sheets(dst.Sheets.Count)
End Sub
Комментарии:
1. Отличная штука, я смутно помню, как раньше использовался массив листов, и это кажется идеальным вариантом использования. Я попробую завтра утром!
2. Работает отлично. Большое спасибо, я обязательно запомню это.