Не могу установить SetFocus

Весь MS Office, программирование на Visual Basic for Applications и MS VB

Модератор: Naeel Maqsudov

Ответить
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Появилась такая проблемка. Поиск по форуму ничего не дал.
На форме несколько TextBox ов. Первый "Закупка", второй "Продажа" и т.д.
Пытаюсь сделать проверку на то, чтобы поле Закупка небыло пустым или Закупка небыла больше Продажи. Вроде все просто. Но после проверки не могу установить фокус в поле Закупка. Активируется поле со следующим TabIndex.

Код: Выделить всё

Private Sub Продажа_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Sheets("Рассрочка").Range("D9") = Продажа.Text
If Закупка.Text = "" Or Закупка.Text > Продажа.Text Then
MsgBox "Ошибка в поле 'Закупка' ", vbInformation, " "
Продажа.Text = ""
Закупка.SetFocus
Exit Sub
End If
End Sub
Подскажите, где моя ошибка?
Спасибо.
p.s. после разных экспериментов замечаю, что дело по-моему в BeforeUpdate. После выполнения строки Закупка.SetFocus, выполнение процедуры начинается сначала :confused:
на пробной форме "втупую" SetFocus устанавливается без проблем :confused:
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
SunKiSSka
Сообщения: 68
Зарегистрирован: 11 июл 2007, 12:58
Откуда: Санкт-Петербург

VictorM, у меня есть такой вариант, который позволяет вернуться на то же место (на тот же Text Box) на форме при потере фокуса:

Код: Выделить всё

Dim x
Private Sub Text1_GotFocus()
    On Error Resume Next
    Text1.SelStart = x
End Sub
Private Sub Text1_LostFocus()
    x = Text1.SelStart
End Sub
когда то такое делала, вроде должно работать :)

И есть, например, код для перебора массива элементов Text Box, который позволяет последовательно обойти все элементы:

Код: Выделить всё

Private Sub Text1_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then 'нажата клавиша ENTER
NewIndex = Index + 1 'вычисляется следующий по индексу TextBox
On Error Resume Next 'если достигнут последний индекс, это позволит избежать ошибки
Text1(NewIndex).SetFocus 'операция получения ввода следующего ТекстБокса
End If
End Sub
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

SunKiSSka, спасибо! Сейчас буду пробовать.
***
чёт не могу въехать, куда притулить Ваш код (первый фрагмент) :confused:
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

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

Код: Выделить всё

Private iFocus As Boolean

Private Sub Продажа_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
    Temp_Macro
End Sub

Private Sub Продажа_KeyDown(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)
    If KeyCode = vbKeyReturn Then Temp_Macro
End Sub

Private Sub Temp_Macro()
   If iFocus = True Then
      iFocus = False: Exit Sub
   End If
   If Закупка.Value = "" Or _
      Val(Закупка.Value) > Val(Продажа.Value) Then
      'На самом деле просто Val() недостаточно, ибо :
      'MsgBox Val("5.5")
      'MsgBox Val("5,5")
      
      iFocus = True 'Or iFocus = Not iFocus
      Продажа.Value = "":  Закупка.SetFocus
    End If
End Sub
p.s. кому интересны подробности http://www.progz.ru/forum/index.php?showtopic=36042
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
kminas
Сообщения: 108
Зарегистрирован: 06 янв 2006, 00:06
Откуда: Ростов-на-Дону

VictorM писал(а):Вопрос решен. На соседнем форуме есть такой человек - pashulka (жаль, что он перестал заходить на наш форум). С его помощью и была решена эта задача.
Умный мужик, мне здорово помог.
SunKiSSka писал(а):И есть, например, код для перебора массива элементов Text Box, который позволяет последовательно обойти все элементы:

Код: Выделить всё

Private Sub Text1_KeyDown(Index As Integer, KeyCode As Integer, Shift As Integer)
If KeyCode = 13 Then 'нажата клавиша ENTER
NewIndex = Index + 1 'вычисляется следующий по индексу TextBox
On Error Resume Next 'если достигнут последний индекс, это позволит избежать ошибки
Text1(NewIndex).SetFocus 'операция получения ввода следующего ТекстБокса
End If
End Sub
А как потом вернуть фокус на CommandButton?
Аватара пользователя
VictorM
Сообщения: 794
Зарегистрирован: 23 окт 2006, 01:44
Откуда: Lugansk, Ukraine
Контактная информация:

Умный мужик, мне здорово помог.
Да уж, он очень многим помог.
А как потом вернуть фокус на CommandButton?
я пока не разбирался с этим кодом. Может SunKiSSka знает ?
"Дайте людям рыбы, и вы накормите их на весь день;
научите их ловить рыбу - и вы накормите их на всю жизнь".
Ответить