Копирование листов без копирования полного адреса проверки данных

#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. Работает отлично. Большое спасибо, я обязательно запомню это.