Страницы: 1
RSS
VBA Excel - работа с формами
 
Добрый день!
Столкнулся с проблемой.

Хочу сделать пользовательскую форму с выпадающим списком. Логично, что при инициализации формы нужно предусмотреть отбор из 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 //Название макроса 
не работает, т.е. макрос не отрабатывает. аналогично происходит и со строчками макроса,если просто вставить их сюда.
Буду очень благодарен за подсказки. Спасибо
Изменено: Laser42 - 16.01.2014 18:13:01 (код)
 
Для начала объясните, зачем ДВЕ формы? Сразу вызывайте ту, в которой нужно работать. Получается, что первая форма у Вас промежуточная и выполняет единственную функцию - загрузить вторую форму.
 
и файл-пример не помешал бы
Согласие есть продукт при полном непротивлении сторон
 
Если Вы хотите, чтобы форма была показана и вызвавший её код продолжал выполнятся, то необходимо вызывать форму не модально:
Код
forma2.Show 0
Хотя в большинстве случаев такой подход неверен и следует присмотреться к логике кода повнимательнее, чтобы оптимизировать.
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
как то так?
Если очень захотеть - можно в космос полететь ;)
 
Повторю свой вопрос: ДВЕ формы зачем?
 
Две формы сделаны затем, чтобы первую поставить на авто запуск при открытии файла. С нее 2 опции: обработка исходных данных (форма 2) или обновление исходных данных (переход на нужный лист для вставки данных из sql).

Меня тогда интересует вот что (давайте абстрагируемся пока от того,  с чего попадают на форму 2 - возможно,  действительно стоит сделать ее запуск кнопкой на листе.
Вот, доустим, у меня есть форма 2. На ней выпадающий список - ComboBox, если не путаю. Как посчитать данные для этого списка.

1) Подсчет (макрос) стартует по кнопке,  после расчета запускаем форму.
2) Как я пытался сделать - пересчет непосредственно при запуске формы.
3) Ваш вариант.

Спасибо
lexey_fan, спасибо,  посмотрю ваш файл чуть позже
UPD. Посмотрел. только проблема в том. что вместо ручного наполнения ComboBox мне нужно взять данные для него из массива. Это возможно, или он умеет брать данные только с листов Excel?
Изменено: Laser42 - 17.01.2014 10:35:43 (UPD)
 
Наполнить КомбоБокс можно несколькими способами:
1. Считать циклом данные из ячеек листа.
2. Указать диапазон ячеек (нежелательно, имхо).
3. Использовать именованный (предпочтительно динамический) диапазон.
4. Сформировать тем или иным способом из исходных данных массив, и уже этот массив использовать.
Во всех этих случаях количество записей можно посчитать. А для чего Вам знать их количество? Ну будет 14 или 15 - какая разница?

P.S. Продолжаю считать, что промежуточная (первая) форма избыточна.
 
Ладно, убедили. Тогда кнопка на листе запускает макрос, который сначала запускает 2 расчета данных для формы, а потом показывает форму с 1 страницы:

Код
Sub ButtonStart ()

Call macros1 
Call macros2 

form.MultiPage1.Value = 0 
form.Show 
 
End Sub


Так всё работает. Всем спасибо
 
Однако, не все оказалось так просто. Мне бы все же хотелось бы наполнить мой 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) Далее. вопрос, можно каким-нибудь методом записать значения из массива в форму? (см. код выше)

Спасибо
 
Что-то Вы всё без примера. Создал за Вас небольшой файл-пример.
 
Извините, корпоративная безопасность. Сейчас посмотрю
 
Юрий, я посмотрел ваш пример.
Спасибо, понял, почему не срабатывал код Initialize:
Код
Private Sub forma_Initialize() 'неправильно 
Private Sub UserForm_Initialize() ' правильно'здесь не нужно вставлять название своей формы


Теперь все получится. Еще раз спасибо
 
Цитата
Извините, корпоративная безопасность
Какая ещё безопасность? Яблоки, огурцы, апельсины...
 
Юрий М автор имел ввиду скорей всего запрет на выкладывание файлов в сеть.
 
А можно ли заполнять 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? Спасибо
 
Уменьшите размер шрифта.
Страницы: 1
Наверх