Домашняя страница Undo Do New Save Карта сайта Обратная связь Поиск по форуму
МИР MS EXCEL - Гость.xls

Вход

Регистрация

Напомнить пароль

 

= Мир MS Excel/Возврат фокуса в TextBox. - Мир MS Excel

Старая форма входа
  • Страница 1 из 1
  • 1
Модератор форума: китин, _Boroda_  
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Возврат фокуса в TextBox. (Макросы/Sub)
Возврат фокуса в TextBox.
and_evg Дата: Среда, 15.03.2017, 16:07 | Сообщение № 1
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Всем доброго времени суток!
Столкнулся со следующей проблемой.
Имеется:

Стандартный модуль
[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.]
К сообщению приложен файл: 8890222.xls (68.5 Kb)
 
Ответить
СообщениеВсем доброго времени суток!
Столкнулся со следующей проблемой.
Имеется:

Стандартный модуль
[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
Дата добавления - 15.03.2017 в 16:07
Perfect2You Дата: Среда, 15.03.2017, 17:12 | Сообщение № 2
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
В том виде, что у меня Ваш файл загрузился, видно следующее:
Да, процедура -то вызывается одна, но условия в которых она запускается - две большие разницы. Когда Вы запускаете с кнопки формы, то:
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
[/vba]

Автор - Perfect2You
Дата добавления - 15.03.2017 в 17:12
and_evg Дата: Среда, 15.03.2017, 18:40 | Сообщение № 3
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Perfect2You,
1. Верно говорите. форма не в фокусе... почему?!?!?
2. думаю, что данная переменная публичная... действует, и в модуле листа...
3. UserForm2.Show вызывает ошибку - Форма уже отображается :(
 
Ответить
СообщениеPerfect2You,
1. Верно говорите. форма не в фокусе... почему?!?!?
2. думаю, что данная переменная публичная... действует, и в модуле листа...
3. UserForm2.Show вызывает ошибку - Форма уже отображается :(

Автор - and_evg
Дата добавления - 15.03.2017 в 18:40
Perfect2You Дата: Среда, 15.03.2017, 19:52 | Сообщение № 4
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Непонятненько.
У меня как часы. Может, что-то не туда вставили? На всякий случай залью файл со своей скромной правкой.
По вопросам:
2. думаю, что данная переменная публичная... действует, и в модуле листа...

Да, обратиться к ней можно. Только чтобы значение сохранилось на все время, ее по-моему Static делать надо. А так - обратиться можно, но после работы вызвавшей программы значение теряется.
1. Верно говорите. форма не в фокусе... почему?!?!?, 3. UserForm2.Show вызывает ошибку - Форма уже отображается :(

Как я заметил: либо можно работать в форме, либо на листе. Активна форма - заблокирован лист, Активен лист - форма свернута (в памяти есть, но неактивна). Show проверяет: загружена ли? Если загружена, активирует. Если нет, то запускает.
Причем при вызове show у меня блокируется даже работа макроса из модуля листа, пока ее не закрыть. Только после этого он дорабатывает до конца. Именно поэтому в модуле листа UserForm2.Show - последний оператор. peredacha же форму не активирует - работает с любым состоянием ее: и с активным, и с фоновым.

Поэтому, исходя из моих экспериментов, получилось так...
К сообщению приложен файл: _8890222.xls (47.0 Kb)


Сообщение отредактировал Perfect2You - Среда, 15.03.2017, 19:59
 
Ответить
СообщениеНепонятненько.
У меня как часы. Может, что-то не туда вставили? На всякий случай залью файл со своей скромной правкой.
По вопросам:
2. думаю, что данная переменная публичная... действует, и в модуле листа...

Да, обратиться к ней можно. Только чтобы значение сохранилось на все время, ее по-моему Static делать надо. А так - обратиться можно, но после работы вызвавшей программы значение теряется.
1. Верно говорите. форма не в фокусе... почему?!?!?, 3. UserForm2.Show вызывает ошибку - Форма уже отображается :(

Как я заметил: либо можно работать в форме, либо на листе. Активна форма - заблокирован лист, Активен лист - форма свернута (в памяти есть, но неактивна). Show проверяет: загружена ли? Если загружена, активирует. Если нет, то запускает.
Причем при вызове show у меня блокируется даже работа макроса из модуля листа, пока ее не закрыть. Только после этого он дорабатывает до конца. Именно поэтому в модуле листа UserForm2.Show - последний оператор. peredacha же форму не активирует - работает с любым состоянием ее: и с активным, и с фоновым.

Поэтому, исходя из моих экспериментов, получилось так...

Автор - Perfect2You
Дата добавления - 15.03.2017 в 19:52
Manyasha Дата: Среда, 15.03.2017, 22:16 | Сообщение № 5
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
and_evg, я так понимаю, это продолжение предыдущей темы?
Решение предложенное Wasilichем не подошло или у Вас уже просто спортивный интерес?


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеand_evg, я так понимаю, это продолжение предыдущей темы?
Решение предложенное Wasilichем не подошло или у Вас уже просто спортивный интерес?

Автор - Manyasha
Дата добавления - 15.03.2017 в 22:16
and_evg Дата: Четверг, 16.03.2017, 08:14 | Сообщение № 6
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Perfect2You, К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...

Manyasha, не совсем так. Для проблемы описанной в вышеуказанной теме я применил немного переработанное Ваше решение. Хоть и пришлось многократно тиражировать код, но пришлось пока смириться. Проблема описанная в данной теме, возникла при решении следующих задач. :)
 
Ответить
СообщениеPerfect2You, К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...

Manyasha, не совсем так. Для проблемы описанной в вышеуказанной теме я применил немного переработанное Ваше решение. Хоть и пришлось многократно тиражировать код, но пришлось пока смириться. Проблема описанная в данной теме, возникла при решении следующих задач. :)

Автор - and_evg
Дата добавления - 16.03.2017 в 08:14
Perfect2You Дата: Четверг, 16.03.2017, 13:37 | Сообщение № 7
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
А можно поинтересоваться: как Вы переходите к работе с листом от формы? Я нажимал на крест в правом верхнем углу формы, только после этого мог вернуться на редактирование рабочего листа, а Вы?
Пробовали ли Вы что-то ввести в ячейку рабочего листа до вызова формы? В этом случае ошибка возникает?
 
Ответить
СообщениеА можно поинтересоваться: как Вы переходите к работе с листом от формы? Я нажимал на крест в правом верхнем углу формы, только после этого мог вернуться на редактирование рабочего листа, а Вы?
Пробовали ли Вы что-то ввести в ячейку рабочего листа до вызова формы? В этом случае ошибка возникает?

Автор - Perfect2You
Дата добавления - 16.03.2017 в 13:37
and_evg Дата: Четверг, 16.03.2017, 14:14 | Сообщение № 8
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Perfect2You,
Цитата
Я нажимал на крест в правом верхнем углу формы

Верно, только так. Просто данный пример максимально упрощен.
Цитата
В этом случае ошибка возникает?

В вашем варианте
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Set myTextBox2 = UserForm2.TextBox1
    Call peredacha
    UserForm2.Show
End Sub
[/vba]
ошибки не возникает
А в моем
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Call peredacha
End Sub
[/vba]
Возникает, что и логично, т.к. не определена переменная myTextBox2
 
Ответить
СообщениеPerfect2You,
Цитата
Я нажимал на крест в правом верхнем углу формы

Верно, только так. Просто данный пример максимально упрощен.
Цитата
В этом случае ошибка возникает?

В вашем варианте
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Set myTextBox2 = UserForm2.TextBox1
    Call peredacha
    UserForm2.Show
End Sub
[/vba]
ошибки не возникает
А в моем
[vba]
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    Call peredacha
End Sub
[/vba]
Возникает, что и логично, т.к. не определена переменная myTextBox2

Автор - and_evg
Дата добавления - 16.03.2017 в 14:14
Perfect2You Дата: Четверг, 16.03.2017, 14:52 | Сообщение № 9
Группа: Проверенные
Ранг: Форумчанин
Сообщений: 237
Репутация: 59 ±
Замечаний: 0% ±

Excel 2010
Так если в моем не возникает ошибки, значит, решена проблема?
 
Ответить
СообщениеТак если в моем не возникает ошибки, значит, решена проблема?

Автор - Perfect2You
Дата добавления - 16.03.2017 в 14:52
and_evg Дата: Четверг, 16.03.2017, 15:13 | Сообщение № 10
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
Perfect2You повторюсь
Цитата
К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...

продолжаю биться над проблемой возврата фокуса в текстбокс формы из стандартного модуля... %)
 
Ответить
СообщениеPerfect2You повторюсь
Цитата
К сожалению в приложенном Вами файле возникает аналогичная ошибка. Правда если свойство формы ShowModal установить в False, тогда данная ошибка исчезает, но и желаемого эффекта не получаем...

продолжаю биться над проблемой возврата фокуса в текстбокс формы из стандартного модуля... %)

Автор - and_evg
Дата добавления - 16.03.2017 в 15:13
Manyasha Дата: Четверг, 16.03.2017, 16:18 | Сообщение № 11
Группа: Модераторы
Ранг: Старожил
Сообщений: 2198
Репутация: 898 ±
Замечаний: 0% ±

Excel 2010, 2016
and_evg,
может все-таки прислушаетесь к замечаниям из прошлой темы?
Подход не верный

Для этого есть другие способы

Я с этим полностью согласна!

Опишите задачу, что Вы пытаетесь сделать? Уверена, что есть более удобные и правильные варианты.


ЯД: 410013299366744 WM: R193491431804
 
Ответить
Сообщениеand_evg,
может все-таки прислушаетесь к замечаниям из прошлой темы?
Подход не верный

Для этого есть другие способы

Я с этим полностью согласна!

Опишите задачу, что Вы пытаетесь сделать? Уверена, что есть более удобные и правильные варианты.

Автор - Manyasha
Дата добавления - 16.03.2017 в 16:18
and_evg Дата: Пятница, 17.03.2017, 08:28 | Сообщение № 12
Группа: Проверенные
Ранг: Обитатель
Сообщений: 452
Репутация: 78 ±
Замечаний: 0% ±

Excel 2007
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 - Пятница, 17.03.2017, 08:30
 
Ответить
Сообщение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
Дата добавления - 17.03.2017 в 08:28
Мир MS Excel » Вопросы и решения » Вопросы по VBA » Возврат фокуса в TextBox. (Макросы/Sub)
  • Страница 1 из 1
  • 1
Поиск:

Яндекс.Метрика Яндекс цитирования
© 2010-2024 · Дизайн: MichaelCH · Хостинг от uCoz · При использовании материалов сайта, ссылка на www.excelworld.ru обязательна!