Всем доброго времени суток! Столкнулся со следующей проблемой. Имеется:
Стандартный модуль [vba]
Код
Public myTextBox2 As MSForms.TextBox
Public Sub form2() UserForm2.Show End Sub
Public Sub peredacha() 'Это основная процедура If myTextBox2.Value > 5 Then myTextBox2.SetFocus End If End Sub
[/vba]
Форма с двумя текстбоксами и двумя кнопками, ну и конечно же модуль формы [vba]
Код
Private Sub CommandButton1_Click() Me.TextBox1.SetFocus End Sub
Private Sub CommandButton2_Click() Call peredacha End Sub
Private Sub TextBox1_Enter() Set myTextBox2 = Me.TextBox1 End Sub
[/vba]
Модуль листа [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Call peredacha End Sub
[/vba]
(Код МАКСИМАЛЬНО упрощен)
Так вот - Если фокус установлен в TextBox2, то код по первой кнопке [vba]
Код
Private Sub CommandButton1_Click() Me.TextBox1.SetFocus End Sub
[/vba] отрабатывается как и полагается.
Код по второй кнопке [vba]
Код
Private Sub CommandButton2_Click() Call peredacha End Sub
[/vba] аналогично без проблем.
но вот код повешенный на изменение листа [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Call peredacha End Sub
[/vba] нивкакую не хочет возвращать фокус в TextBox1. Хотя задействована одна и та же процедура!!!
Файл прилагается.
[p.s.]P.S. Чуть не забыл (хотя это и не суть важно).... Worksheet_Change срабатывает так как TextBox1 связан с ячейкой листа по свойству ControlSource.[/p.s.]
Всем доброго времени суток! Столкнулся со следующей проблемой. Имеется:
Стандартный модуль [vba]
Код
Public myTextBox2 As MSForms.TextBox
Public Sub form2() UserForm2.Show End Sub
Public Sub peredacha() 'Это основная процедура If myTextBox2.Value > 5 Then myTextBox2.SetFocus End If End Sub
[/vba]
Форма с двумя текстбоксами и двумя кнопками, ну и конечно же модуль формы [vba]
Код
Private Sub CommandButton1_Click() Me.TextBox1.SetFocus End Sub
Private Sub CommandButton2_Click() Call peredacha End Sub
Private Sub TextBox1_Enter() Set myTextBox2 = Me.TextBox1 End Sub
[/vba]
Модуль листа [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Call peredacha End Sub
[/vba]
(Код МАКСИМАЛЬНО упрощен)
Так вот - Если фокус установлен в TextBox2, то код по первой кнопке [vba]
Код
Private Sub CommandButton1_Click() Me.TextBox1.SetFocus End Sub
[/vba] отрабатывается как и полагается.
Код по второй кнопке [vba]
Код
Private Sub CommandButton2_Click() Call peredacha End Sub
[/vba] аналогично без проблем.
но вот код повешенный на изменение листа [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Call peredacha End Sub
[/vba] нивкакую не хочет возвращать фокус в TextBox1. Хотя задействована одна и та же процедура!!!
Файл прилагается.
[p.s.]P.S. Чуть не забыл (хотя это и не суть важно).... Worksheet_Change срабатывает так как TextBox1 связан с ячейкой листа по свойству ControlSource.[/p.s.]and_evg
В том виде, что у меня Ваш файл загрузился, видно следующее: Да, процедура -то вызывается одна, но условия в которых она запускается - две большие разницы. Когда Вы запускаете с кнопки формы, то: 1) форма уже видна 2) определена переменная, которая используется в этой процедуре. При попытке вызвать из модуля листа ни то, ни другое не выполнено. Приведенное ниже видоизменение процедуры на модуле листа - возможное решение проблемы. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Set myTextBox2 = UserForm2.TextBox1 Call peredacha UserForm2.Show End Sub
[/vba]
В том виде, что у меня Ваш файл загрузился, видно следующее: Да, процедура -то вызывается одна, но условия в которых она запускается - две большие разницы. Когда Вы запускаете с кнопки формы, то: 1) форма уже видна 2) определена переменная, которая используется в этой процедуре. При попытке вызвать из модуля листа ни то, ни другое не выполнено. Приведенное ниже видоизменение процедуры на модуле листа - возможное решение проблемы. [vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range) Set myTextBox2 = UserForm2.TextBox1 Call peredacha UserForm2.Show End Sub
Perfect2You, 1. Верно говорите. форма не в фокусе... почему?!?!? 2. думаю, что данная переменная публичная... действует, и в модуле листа... 3. UserForm2.Show вызывает ошибку - Форма уже отображается
Perfect2You, 1. Верно говорите. форма не в фокусе... почему?!?!? 2. думаю, что данная переменная публичная... действует, и в модуле листа... 3. UserForm2.Show вызывает ошибку - Форма уже отображаетсяand_evg
2. думаю, что данная переменная публичная... действует, и в модуле листа...
Да, обратиться к ней можно. Только чтобы значение сохранилось на все время, ее по-моему Static делать надо. А так - обратиться можно, но после работы вызвавшей программы значение теряется.
1. Верно говорите. форма не в фокусе... почему?!?!?, 3. UserForm2.Show вызывает ошибку - Форма уже отображается :(
Как я заметил: либо можно работать в форме, либо на листе. Активна форма - заблокирован лист, Активен лист - форма свернута (в памяти есть, но неактивна). Show проверяет: загружена ли? Если загружена, активирует. Если нет, то запускает. Причем при вызове show у меня блокируется даже работа макроса из модуля листа, пока ее не закрыть. Только после этого он дорабатывает до конца. Именно поэтому в модуле листа UserForm2.Show - последний оператор. peredacha же форму не активирует - работает с любым состоянием ее: и с активным, и с фоновым.
Поэтому, исходя из моих экспериментов, получилось так...
Непонятненько. У меня как часы. Может, что-то не туда вставили? На всякий случай залью файл со своей скромной правкой. По вопросам:
2. думаю, что данная переменная публичная... действует, и в модуле листа...
Да, обратиться к ней можно. Только чтобы значение сохранилось на все время, ее по-моему Static делать надо. А так - обратиться можно, но после работы вызвавшей программы значение теряется.
1. Верно говорите. форма не в фокусе... почему?!?!?, 3. UserForm2.Show вызывает ошибку - Форма уже отображается :(
Как я заметил: либо можно работать в форме, либо на листе. Активна форма - заблокирован лист, Активен лист - форма свернута (в памяти есть, но неактивна). Show проверяет: загружена ли? Если загружена, активирует. Если нет, то запускает. Причем при вызове show у меня блокируется даже работа макроса из модуля листа, пока ее не закрыть. Только после этого он дорабатывает до конца. Именно поэтому в модуле листа UserForm2.Show - последний оператор. peredacha же форму не активирует - работает с любым состоянием ее: и с активным, и с фоновым.
Поэтому, исходя из моих экспериментов, получилось так...Perfect2You
Perfect2You, К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...
Manyasha, не совсем так. Для проблемы описанной в вышеуказанной теме я применил немного переработанное Ваше решение. Хоть и пришлось многократно тиражировать код, но пришлось пока смириться. Проблема описанная в данной теме, возникла при решении следующих задач.
Perfect2You, К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...
Manyasha, не совсем так. Для проблемы описанной в вышеуказанной теме я применил немного переработанное Ваше решение. Хоть и пришлось многократно тиражировать код, но пришлось пока смириться. Проблема описанная в данной теме, возникла при решении следующих задач. and_evg
А можно поинтересоваться: как Вы переходите к работе с листом от формы? Я нажимал на крест в правом верхнем углу формы, только после этого мог вернуться на редактирование рабочего листа, а Вы? Пробовали ли Вы что-то ввести в ячейку рабочего листа до вызова формы? В этом случае ошибка возникает?
А можно поинтересоваться: как Вы переходите к работе с листом от формы? Я нажимал на крест в правом верхнем углу формы, только после этого мог вернуться на редактирование рабочего листа, а Вы? Пробовали ли Вы что-то ввести в ячейку рабочего листа до вызова формы? В этом случае ошибка возникает?Perfect2You
К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...
продолжаю биться над проблемой возврата фокуса в текстбокс формы из стандартного модуля...
Perfect2You повторюсь
Цитата
К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...
продолжаю биться над проблемой возврата фокуса в текстбокс формы из стандартного модуля... and_evg
По поводу ControlSource начинаю тоже приходить к мнению, что преимущество ControlSource (облегчение связи поля и ячейки) нивелируется появляющимися при этом другими проблемами. Поэтому и хотелось бы услышать от авторитетных людей какие могут быть дополнительные недостатки при использовании ControlSource.
Цитата
продолжаю биться над проблемой возврата фокуса в текстбокс формы из стандартного модуля..
Все таки победил я это! Может быть кому пригодится. [vba]
Код
Public myTextBox2 As MSForms.TextBox
Public Sub peredacha() 'Это основная процедура If myTextBox2.Value > 5 Then UserForms.Add(myTextBox2.Parent.Name).Show 'Вот это ключевая строчка !!! myTextBox2.SetFocus End If End Sub
[/vba]
Ну и как полагается: жду конструктивную критику
Manyasha,
Цитата
Подход не верный
По поводу ControlSource начинаю тоже приходить к мнению, что преимущество ControlSource (облегчение связи поля и ячейки) нивелируется появляющимися при этом другими проблемами. Поэтому и хотелось бы услышать от авторитетных людей какие могут быть дополнительные недостатки при использовании ControlSource.
Цитата
продолжаю биться над проблемой возврата фокуса в текстбокс формы из стандартного модуля..
Все таки победил я это! Может быть кому пригодится. [vba]
Код
Public myTextBox2 As MSForms.TextBox
Public Sub peredacha() 'Это основная процедура If myTextBox2.Value > 5 Then UserForms.Add(myTextBox2.Parent.Name).Show 'Вот это ключевая строчка !!! myTextBox2.SetFocus End If End Sub
[/vba]
Ну и как полагается: жду конструктивную критику and_evg
Сообщение отредактировал and_evg - Пятница, 17.03.2017, 08:30