Хочу сделать пользовательскую форму с выпадающим списком. Логично, что при инициализации формы нужно предусмотреть отбор из Excel некоторых значений для списка. И вот с этим проблема.
Сейчас исходная ситуация такова Кнопка на листе запускает forma11, та по нажатию своей кнопки делает себе Hide, а затем forma2.Show. Это работает. Дальше я хочу прописать, чтобы при инициализации формы 2 в выпадающий список брались данные с листа, затем, чтобы активировалась первая вкладка формы (на которой и находится тот самый выпадающий список), затем еще раз Show (чтобы увидеть эту вкладку). Код:
Код
Private Sub forma2_Initialize()
Call MyMacros 'Название_макроса
forma2.MultiPage1.Value = 0
forma2.Show
End Sub
Правильно ли вообще написано Public? Правильно ли размещен этот код в мой файл Project/Forms/forma2/ ?
Проблема в том, что строка
Код
Call //Название макроса
не работает, т.е. макрос не отрабатывает. аналогично происходит и со строчками макроса,если просто вставить их сюда. Буду очень благодарен за подсказки. Спасибо
Для начала объясните, зачем ДВЕ формы? Сразу вызывайте ту, в которой нужно работать. Получается, что первая форма у Вас промежуточная и выполняет единственную функцию - загрузить вторую форму.
Две формы сделаны затем, чтобы первую поставить на авто запуск при открытии файла. С нее 2 опции: обработка исходных данных (форма 2) или обновление исходных данных (переход на нужный лист для вставки данных из sql).
Меня тогда интересует вот что (давайте абстрагируемся пока от того, с чего попадают на форму 2 - возможно, действительно стоит сделать ее запуск кнопкой на листе. Вот, доустим, у меня есть форма 2. На ней выпадающий список - ComboBox, если не путаю. Как посчитать данные для этого списка.
1) Подсчет (макрос) стартует по кнопке, после расчета запускаем форму. 2) Как я пытался сделать - пересчет непосредственно при запуске формы. 3) Ваш вариант.
Спасибо lexey_fan, спасибо, посмотрю ваш файл чуть позже UPD. Посмотрел. только проблема в том. что вместо ручного наполнения ComboBox мне нужно взять данные для него из массива. Это возможно, или он умеет брать данные только с листов Excel?
Наполнить КомбоБокс можно несколькими способами: 1. Считать циклом данные из ячеек листа. 2. Указать диапазон ячеек (нежелательно, имхо). 3. Использовать именованный (предпочтительно динамический) диапазон. 4. Сформировать тем или иным способом из исходных данных массив, и уже этот массив использовать. Во всех этих случаях количество записей можно посчитать. А для чего Вам знать их количество? Ну будет 14 или 15 - какая разница?
P.S. Продолжаю считать, что промежуточная (первая) форма избыточна.
Однако, не все оказалось так просто. Мне бы все же хотелось бы наполнить мой ComboBBox в форме данными из массива.
1) Как правильно объявить массив? Мой массив объявляется в Modules/DB (в нем же находится макрос, который открывает форму):
Код
Public MyArray()
Sub Macros()
...
Redim MyArray(1 to n, 1 to 2) 'Redim и запись значений происходит уже конкретно в макросе в Modules/DB/
...
End Sub
2) Процедура при инициализации формы не выполняется (при запуске макроса форма не скрывается в конце) Почему? Форма называется forma, находится в Forms/. В коде этой формы следующее:
Код
Option Explicit
-----------------
Private Sub forma_Initialize()
With ComboBox1
.ColumnCount = 2
.ColumnWidths = "10,70"
End With
forma.Hide 'это для проверки.
3) Далее. вопрос, можно каким-нибудь методом записать значения из массива в форму? (см. код выше)
А можно ли заполнять ComboBox из массива поэлементно (я хочу поставить условие, что в List должны добавляться только непустые значения массива)?
Код
Public sub UserForm_Initialize()
Me.Combobox1.ColumnCount = 2 'нужно, чтобы список был из 2 колонок
Me.ComboBox1.AddItem(0,0) = MyArray(1,1) ' вот это не работает - неизвестная функция
End Sub
Проблема в чем. MyArray - это массив из двух столбцов и нескольких строк, нижние из которых пустые. Можно, конечно, сделать еще один массив, в котором таких пустых строк не будет, но не хочется засорять код заполнения массива еще одним циклом и переменными-счетчиками (хотя, если другого выхода не будет, так и придется сделать). Вопрос: можно ли все-таки каким-то способом прописать циклом значения из массива в Combobox по одному, или нет?
Можно и по одному. Но быстрее будет переложить во второй массив и уже его в КомбоБокс. Если данных мало, а в КомбоБокс бессмысленно забивать тысячи строк, то можно заполнять циклом с проверкой прямо из ячеек листа.
Возник еще один вопрос. На форме есть Combobox, заполненный через AddItem значениями "1", "2". Логично сузить размер Combobox. При этом ширина самого выпадающего списка (свойство ListWidth) остается более широкой, но если сузить и ее тоже - появляется горизонтальный скроллинг. Вопрос - можно ли уменьшить ширину вот этой области самого листа, чтобы скроллинг не появлялся при уменьшении ListWidth? Спасибо