Добавьте раскрывающийся список в динамически создаваемую книгу с помощью VBA

#excel #vba #validation

Вопрос:

Я использую макрос для создания временного листа в своей книге, заполнения данных в нескольких ячейках на этом листе, экспорта этого листа в новую книгу и закрытия новой книги.

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

 Sub main()

'replace "J2" with the cell you want to insert the drop down list
With Range("J2").Validation
.Delete
'replace "=A1:A6" with the range the data is in.
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, _
Operator:= xlBetween, Formula1:="=Sheet1!A1:A6"
.IgnoreBlank = True
.InCellDropdown = True
.InputTitle = ""
.ErrorTitle = ""
.InputMessage = ""
.ErrorMessage = ""
.ShowInput = True
.ShowError = True
End With
End Sub 

 

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

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

1. Является ли лист активным Sheet1 ? Даже если нет, есть ли какие-либо данные в диапазоне Sheet1!A1:A6 ?

2. Ага. Это активная таблица, и в ячейках действительно есть данные.

3. Пожалуйста, попробуйте следующую строку кода тестирования (поместите ее в первую строку): Debug.Print ActiveSheet.Name, ActiveSheet.CodeName: Stop . Что он возвращает, Immediate Window когда код останавливается на этой строке?

4. Если новая книга содержит только 1 лист, являются ли значения раскрывающегося списка в A1:A6 на этом листе ?

5. Range("J2").Validation ссылается на активный лист при запуске кода — вы должны использовать явную ссылку, например, wsTemp.Range(«J2»), где wsTemp-это лист, который вы добавили ранее. Кроме того: вы также должны скопировать Лист1 в новую книгу, так как вы берете оттуда значения списка проверки. Скопируйте этот лист перед копированием временного листа — на всякий случай.

Ответ №1:

Range("J2").Validation ссылается на активный лист при запуске кода — вы должны использовать явную ссылку, например, wsTemp.Range(«J2»), где wsTemp-это лист, который вы добавили ранее.

Кроме того: вы также должны скопировать Лист1 в новую книгу, так как вы берете оттуда значения списка проверки. Скопируйте этот лист перед копированием временного листа — на всякий случай.