Проверка данных потеряна при копировании листа с помощью макроса VBA

Проблема: у меня возникла проблема с проверкой данных, которая не копируется на скопированный рабочий лист, когда рабочий лист копируется с помощью макроса. Есть ли способ сделать это, используя мой текущий код?

Да, я также знаю, что есть аналогичный вопрос (здесь: Проверка данных потеряна при копировании листа в другую книгу), но это не совсем та же проблема, и в настоящее время на нее нет ответа. Мы будем очень признательны за любую помощь в копировании этих проверок данных вместе с данными и сэкономим часы ненужной повторяющейся работы.

Изменить: этот код находится в разделе «ThisWorkbook» моей книги.

Мой код выглядит следующим образом:

Dim wb As Workbook
Dim wsTemp As Worksheet
Dim sName As String
Dim bValidName As Boolean
Dim i As Long

bValidName = False

Do While bValidName = False
    sName = InputBox("Please name this new worksheet:", "New Sheet Name", Sh.Name)
        If Len(sName) > 0 Then
        For i = 1 To 7
            sName = Replace(sName, Mid(":\/?*[]", i, 1), " ")
        Next i
        sName = Trim(Left(WorksheetFunction.Trim(sName), 31))
        If Not Evaluate("ISREF('" & sName & "'!A1)") Then bValidName = True
    End If
Loop

With Application
    .ScreenUpdating = False
    .DisplayAlerts = False
    .EnableEvents = False
End With

Set wb = ThisWorkbook
Set wsTemp = wb.Sheets("TEMPLATE")

wsTemp.Visible = xlSheetVisible
wsTemp.Copy After:=wb.Sheets(wb.Sheets.Count)
ActiveSheet.Name = sName
Sh.Delete
wsTemp.Visible = xlSheetHidden   'Or xlSheetVeryHidden

With Application
    .ScreenUpdating = True
    .DisplayAlerts = True
    .EnableEvents = True
End With

' Call Sort_Active_book
' Call Rebuild_TOC

person David S.    schedule 28.03.2016    source источник
comment
если проверки не будут скопированы, одним из возможных решений может быть сохранение сведений о ваших проверках (адрес ячейки, формула проверки и т. д.) в справочном листе, а затем создание подпроцедуры для создания проверок для каждого нового листа на основе информация, которую вы храните в справочной таблице проверки рабочего листа. Таким образом, все, что вам нужно сделать, это управлять таблицей, и проверки будут обновляться соответствующим образом.   -  person Scott Holtzman    schedule 28.03.2016
comment
Это хорошая идея, но, возможно, к вашему удивлению, это рабочий лист обслуживания шаблона листа, который у меня есть, и это справочный лист, который вы, возможно, уже предлагаете, на этом листе нет данных. Как вы думаете, в каком направлении отсюда двигаться?   -  person David S.    schedule 28.03.2016
comment
если сообщение Gary's Student ниже не помогает, создайте другой справочный лист с таблицей проверки данных и информацией о ней. В этом красота (и, возможно, проклятие) Excel. У вас может быть несколько элементов дизайна :)   -  person Scott Holtzman    schedule 28.03.2016
comment
@ScottHoltzman Создание дополнительного справочного листа не похоже на маршрут, потому что я хочу только скопировать и вставить проверки данных, а на листе TEMPLATE (Maint.) нет данных, этот рабочий лист по сути является справочным листом.   -  person David S.    schedule 28.03.2016


Ответы (1)


Вы должны иметь возможность скопировать рабочий лист и сохранить DV. Этот пример:

  • Активирует Лист1
  • создает простой DV на Sheeet1
  • копирует Лист1 в конец книги


Sub Macro2()
    Sheets("Sheet1").Select
    Range("D1").Select
    ActiveCell.FormulaR1C1 = "alpha"
    Range("D2").Select
    ActiveCell.FormulaR1C1 = "beta"
    Range("D3").Select
    ActiveCell.FormulaR1C1 = "gamma"
    Range("B1").Select
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=$D$1:$D$3"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
    Sheets("Sheet1").Select
    Sheets("Sheet1").Copy After:=Sheets(3)
End Sub

Это записанный код, запускаемый в новой пустой книге в системе Win 7/Excel 2007.

Можешь повторить мой результат??

Если мой код работает в вашей системе, начните с попытки имитировать ваш код VBA вручную с включенным диктофоном. Затем возьмите записанный код и измените его, включив в него незаписываемые части, (например, операторы InputBox).

person Gary's Student    schedule 28.03.2016
comment
Хотя это прекрасный пример, который поможет мне самому разобраться в коде VBA с помощью средства записи макросов, проблема заключается в том, что я не знаю синтаксиса, методов или многих его лучших практик; это включает в себя, когда следует избегать и когда использовать Select. PS: я смог воспроизвести ваш результат из предоставленного вами кода. - person David S.; 28.03.2016