Страницы: 1
RSS
Обращение к UserForm из другого файла, в т.ч управление элементами формы
 
Добрый день!

Имеется файл с формой (прилагаю). Необходимо макросом из другой книги "имитировать" открытие формы в этом файле, ввод значения в текстовое поле, и нажатие кнопки "Сохранить".

Подскажите, пожалуйста, каким образом из другого файла можно обращаться к форме и ее элементам, а так же к процедурам, обрабатывающим события элементов формы.


Спасибо!
 
Нет необходимости "имитации" открытия формы! Проще обратиться напрямую к тем процедурам которые обрабатывают форму! К процедурам другой книги обращайтесь через Call.
 
Цитата
Al-dozor написал:
К процедурам другой книги обращайтесь через Call.
Вы могли бы написать синтаксис. Я перепробовал кажется все варианты. Но к процедурам формы из другого файла обратиться не могу. Могу вызывать процедуры из Module1, но не из UserForm1. Даже прицеплял через Tools>>References... VBA проект книги с формой в книгу из которой хочу запускать процедуры обработчиков событий формы. Видимо что-то делаю не так.

Буду очень признателен!

Еще пробовал через Sendkeys "имитировать" ввод значений, нажатие кнопок и перемещение по форме с помощью TAB. Но, работа макроса прерывается после открытия формы и продолжается после ее закрытия. Можно это как-то обойти?
Изменено: dmention - 22.06.2017 08:44:22
 
такой пример не подойдет?
Код
1
Call Application.Run("Форма.xls!Module1.shw")

где shw - событие в модуле 1 с UserForm1.Show - и работайте далее с формой.
 
Цитата
yozhik написал:
событие в модуле 1 с UserForm1.Show
А события формы хранятся в модуле 1 или в "модуле формы"?
 
сами события по-любому будут в модуле формы - CommandButton_Click(), к примеру. А там уже как хотите, можете написать Call и процедуру обработки события перенести в стандартный модуль, или оставить в форме
 
Цитата
yozhik написал:
Call Application.Run("Форма.xls!Module1.shw")
Цитата
yozhik написал:
сами события по-любому будут в модуле формы - CommandButton_Click()
Хотелось бы объединить две эти вещи и сделать так:
Код
1
Call Application.Run("Форма.xls!UserForm1.CommandButton_Click")
Но так не работает ((
Как запустить непосредственно событие нажатия кнопки? Может перед этим нужно запустить какое-то событие, например загрузить форму?
 
Цитата
dmention написал:
событие нажатия кнопки
Как вариант, переместите процедуру обработки события в стандартный модуль. Только у Вас по нажатию кнопки записывается значение из TextBox'а формы. Т.е. форму Вы в любом случае должны запустить и поместить в текстбокс какое-то значение
 
Цитата
yozhik написал:
Т.е. форму Вы в любом случае должны запустить и поместить в текстбокс какое-то значение
В том и вопрос как это сделать? Я не понимаю как именно обращаться к элементам формы из другого файла.
 
Лучше поздно, чем никогда.
Я криворучил так.

В модуле формы

Код
1
2
3
4
Private Sub lstMtrls_DblClick(ByVal Cancel As MSForms.ReturnBoolean)
    eventName = "lstMtrls_DblClick"
    Overheads (eventName)
End Sub

в общем модуле
Код
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Public eventName As String
 
Sub Overheads(ByVal eventName, Optional KeyAscii)      
    Dim i As Integer, j As Integer, k As Integer
    Dim arrAMnt() As String, a As String
    'MsgBox eventName
    With frmWorks
        Select Case eventName
            Case .....
 
            Case "lstMtrls_DblClick"      
              Какой-то код
 
        End Select
    End With
End Sub
Изменено: fesh66 - 18.07.2024 14:46:39
 
Можно было проще.
Для начала, нужно убрать слово Private в обработчиках событий формы
Т.е. меняем Private Sub CommandButton1_Click() на Sub CommandButton1_Click()
И в стандартный модуль (module1) файла ФОРМА.xls добавляем функцию для подключения к форме:
Код
1
2
3
Public Function GetForm()
    Set GetForm = UserForm1
End Function


и тогда начнут работать вызовы из другого файла вроде такого:
Код
1
2
3
4
5
6
Sub test3234()
    Set form = Run("Форма.xls!GetForm")
    form.Show
    form.Controls("textbox1") = 444
    form.CommandButton1_Click
End Sub
Изменено: Игорь - 18.07.2024 19:12:03
 
Спасибо за совет! Ho у меня не было цели вызывать форму из другого файла. Это я, как сейчас говорят, делал "рефакторинг" )))
OOps! Заголовок темы невнимательно прочитал. Прошу прощения...
Изменено: fesh66 - 10.08.2024 17:10:47
Страницы: 1
Читают тему
Наверх
Loading...