Проблема с оператором Goto в цикле If ... ElseIf

Автор Dr_Lecter, 4 октября 2015, 16:11

0 Пользователи и 1 гость просматривают эту тему.

Dr_Lecter

Не могу понять почему код ниже не реагирует на выбор пользователя и игнорирует метки.
При вводе пустого значения или при выборе повторного ввода сваливается на метку On Error

Я читал что оператор Goto не рекомендован к использованию, но найти другой вариант решения пока не смог.
Неужели нужно оформлять цикл Do .... While и пока нужные условия не совпадут повторять запрос данных?


InputPatientName:
sPatientNameContent = InputBox("Пожалуйста введите Ф.И.О. пациента:", "Запрос ввода данных") 'Получим Ф.И.О. пациента
If sPatientNameContent <> "" Then
Dim sInputNameMessage as String 'Сообщение о проверке правильности ввода Ф.И.О. пациента
Dim sInputNameDialogTitle as String 'Заголовок сообщения о проверке правильности ввода Ф.И.О. пациента
Dim nInputNameDialogType as Integer 'Тип сообщения о проверке правильности ввода Ф.И.О. пациента
Dim nInputNameReturnCode as Integer 'Код возврата сообщения о проверке правильности ввода Ф.И.О. пациента
sInputNameMessage = "Вы ввели:" & Chr(10) & sPatientNameContent & Chr(10) & "Нажмите ""Да"" если данные верны, или ""Нет"" для повторного ввода"
sInputNameDialogTitle = "Проверьте корректность введенных данных!"
nInputNameDialogType = 4 OR 32
nInputNameReturnCode = MsgBox(sInputNameMessage, nInputNameDialogType, sInputNameDialogTitle)
  ElseIf nInputNameReturnCode = 7 Then
goto InputPatientName
ElseIf nInputNameReturnCode = 6 Then
oPatientName.Content = sPatientNameContent 'Запись Ф.И.О. пациента в документ
arrayPatientName = Split(sPatientNameContent, " ") 'Разобьем введенное Ф.И.О. пациента в массив по пробелам
sPatientNameContent = Join(arrayPatientName, sU) 'Обьединим массив уже с нижним подчеркиванием
Else
Dim sInputNameErrorMessage as String 'Сообщение о вводе пустого значения
Dim sInputNameErrorDialogTitle as String 'Заголовок сообщения о вводе пустого значения
Dim nInputNameErrorDialogType as Integer 'Тип сообщения о вводе пустого значения
sInputNameErrorMessage =  "Вы или ввели пустую строку или выбрали Отмена" & Chr(10) & "Необходимо ввести Ф.И.О пациента повторно"
sInputNameErrorDialogTitle = "Произошла ошибка!"
nInputNameErrorDialogType = 48 'Отображается значок "Восклицательный знак"
MsgBox(sInputNameErrorMessage, nInputNameErrorDialogType, sInputNameErrorDialogTitle)
goto InputPatientName
End If

rami

Это что за ужас такой :o я сейчас увидел ???

Переменные определяются один раз, а не в цикле.

Dr_Lecter

Это может создавать проблему?
Просто на мой взгляд не логично определять переменную если мы не будем её использовать.
Зачем определять сообщение об ошибке если пользователь её не совершил?

Dr_Lecter

Все чудесатее и чудесатее как говорила Алиса....

Вынес определение переменных вверх процедуры и условие Else заработало, возвращается на метку при вводе пустой строки.
А вот ElseIf не пашут - что ни нажимай.

rami

Я извиняюсь, в предыдущем ответе я по ошибке упомянул циклы вместо условий(из-за неправильного заголовка If ... ElseIf — это условие, а не цикл)
Думаю, что правильный код должен быть таким:InputPatientName:
sPatientNameContent=InputBox("Пожалуйста введите Ф.И.О. пациента:","Запрос ввода данных") 'Получим Ф.И.О. пациента
If sPatientNameContent <> "" Then
'Dim sInputNameMessage as String 'Сообщение о проверке правильности ввода Ф.И.О. пациента
'Dim sInputNameDialogTitle as String 'Заголовок сообщения о проверке правильности ввода Ф.И.О. пациента
'Dim nInputNameDialogType as Integer 'Тип сообщения о проверке правильности ввода Ф.И.О. пациента
'Dim nInputNameReturnCode as Integer 'Код возврата сообщения о проверке правильности ввода Ф.И.О. пациента
sInputNameMessage="Вы ввели:" & Chr(10) & sPatientNameContent & Chr(10)_
& "Нажмите ""Да"" если данные верны, или ""Нет"" для повторного ввода"
nInputNameReturnCode=MsgBox(sInputNameMessage,36,"Проверьте корректность введенных данных!")
End If
If nInputNameReturnCode = 7 Then GoTo InputPatientName
If nInputNameReturnCode = 6 Then
oPatientName.Content = sPatientNameContent 'Запись Ф.И.О. пациента в документ
arrayPatientName = Split(sPatientNameContent, " ") 'Разобьем введенное Ф.И.О. пациента в массив по пробелам
sPatientNameContent = Join(arrayPatientName, sU) 'Обьединим массив уже с нижним подчеркиванием
Else
'Dim sInputNameErrorMessage as String 'Сообщение о вводе пустого значения
'Dim sInputNameErrorDialogTitle as String 'Заголовок сообщения о вводе пустого значения
'Dim nInputNameErrorDialogType as Integer 'Тип сообщения о вводе пустого значения
sInputNameErrorMessage =  "Вы или ввели пустую строку или выбрали Отмена" & Chr(10)_
& "Необходимо ввести Ф.И.О пациента повторно"
MsgBox(sInputNameErrorMessage,48,"Произошла ошибка!")
goto InputPatientName
End If

Dr_Lecter

Разобрался - если первое If верно то остальные блоки ElseIf не выполняются, выполняется все до первого ElseIf и затем переходит на End If.

Dr_Lecter

Задача решена.
Тему можно закрывать.
Всем спасибо за участие!  :beer: