ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я все еще uber-n00b с концепциями программирования и знаю достаточно VBS, чтобы навредить себе, поэтому я, скорее всего, оскорблю / убью некоторые термины / концепции / идеи, которые связаны с этой программой, которую я Я пытаюсь написать. Вы, превосходящий программист, который имеет полное право поджигать меня, были предупреждены.
Я пытался написать VBScript для проверки данных, особенно дат. Поскольку мои пользователи плохо разбираются в клавиатурах, я решил, что упросту задачу, разделив ввод каждой части даты (только месяц и день, у меня год установлен статически).
Раньше у меня были проблемы с проверкой чисел только с 1 «Do ... Loop», так как я пытался проверить, был ли это числовой ввод, и одновременно проверять, находился ли он в указанном диапазоне (1 - 12, за 12 месяцев года).
Вот как примерно выглядел предыдущий код:
Do
' If...Then Statements Here
Loop Until (dtFirstMonth > 0) _
And (dtFirstMonth < 13) _
And IsNumeric(dtFirstMonth) _
And (dtFirstMonth <> "") _
And (dtFirstMonth <> vbNull)
Это часто приводило к ошибкам «Несоответствие типов данных», поэтому мне пришлось разделить критерий проверки на два отдельных оператора «Do ... Loop», как вы можете видеть в текущем коде, который я имею ниже:
Sub srTest()
Do
dtFirstMonth = InputBox("Please Enter a Numeric Month for the Starting Range", _
"Starting Range Month")
If (dtFirstMonth = vbNull) _
Or (dtFirstMonth = "") _
Or Not IsNumeric(dtFirstMonth) Then
MsgBox "Please Enter a Valid Numeric Month",, "Enter Month Number"
ElseIf (dtFirstMonth <> vbNull) _
And (dtFirstMonth <> "") _
And IsNumeric(dtFirstMonth) Then
Do
dtFirstMonth = Round(dtFirstMonth)
Wscript.Echo dtFirstMonth ' Infinite Loop Here (Basically, As Soon As We Get Into Loop with a Value of 1, We're Stuck)
dtFirstMonth = CInt(dtFirstMonth)
' Must Convert User Input to Integer to
' Prevent Data Mismatch Errors In
' Following "If" Statement; Besides,
' It Passed the First Test to be a
' Numeric Value in the First Place
If (dtFirstMonth < 1) Or (dtFirstMonth > 12) Then
MsgBox "Please Enter a Valid Numeric Month",, "Enter Month Number"
Exit Do
' Drop Out of 2nd Level Loop to
' Enter Into 1st Level Loop
End If
Loop Until (dtFirstMonth > 0) _
And (dtFirstMonth < 13) _
And IsNumeric(dtFirstMonth) _
And (dtFirstMonth <> "") _
And (dtFirstMonth <> vbNull)
If (dtFirstMonth < 1) Or (dtFirstMonth > 12) Then
dtFirstMonth = ""
End If
' dtFirstMonth Was Converted to Integer Earlier
' This is to Meet the Value that Didn't Pass
' the Nested Do & If Statement (Level 2 Do Loop)
' Sets dtFirstMonth to "Empty String" to Continue
' Looping in the Level 1 "Do...Loop" Statement;
' If Omitted, Level 1 "Do...Loop" is Satisfied,
' Thus Ending the Subroutine (Since the Value
' of dtFirstMonth is Still a Numeric Value)
End If
Loop Until IsNumeric(dtFirstMonth) _
And (dtFirstMonth <> "") _
And (dtFirstMonth <> vbNull)
Wscript.Echo dtFirstMonth
End Sub
srTest
Мне пришлось настроить 1-й цикл "Do ... Loop", чтобы проверить, что пользовательский ввод (dtFirstMonth) действительно является числовым значением, а не нулевым значением или пустой строкой. Вложенный оператор «Do ... Loop» или 2-й оператор «Do ... Loop» - это то, где у меня есть те же критерии плюс дополнительные критерии, определяющие желаемые диапазоны (любое число от 1 до 12).
Это прекрасно работает для номера 2-12, но когда скрипт анализирует число 1, я вхожу в бесконечный цикл.
Я проверил, чтобы убедиться, что бесконечный цикл происходит во 2-м цикле «Do ... Loop», заменив весь 2-й раздел «Do ... Loop» на «Wscript.Echo dtFirstMonth». Делая это, я получаю ожидаемые результаты: один Echo, а не бесконечное их количество (технически я получаю 2, так как у меня есть другая строка "Wscript.Echo dtFirstMonth" в нижней части подпрограммы для отладки). , но в любом случае, это не бесконечный цикл).
Я также изменил критерий для нижнего диапазона, чтобы он был таким, но это не исправляет ошибку:
Do
' If...Then Statements Here
Loop Until (dtFirstMonth >= 1)
Я тоже пробовал это, но безуспешно:
Do
' If...Then Statements Here
Loop Until (dtFirstMonth >= CInt(1))
В действительности, этот сегмент действительно не нужен, так как я все равно преобразовал входные данные пользователя в целое число.
Поскольку это начало сбивать с толку, я решил добавить инструкцию «Round» до того, как скрипт передаст пользовательский ввод в функцию «CInt», надеясь, что он не будет пойман как 0 значение или десятичное значение как-то; да, это иррациональная мысль с моей стороны, но я все еще хотел изучить все возможности (есть также тот факт, что у меня есть некоторые пользователи с синдромом "Fat Finger Syndrome" и некоторые другие с менталитетом "злоупотреблять программой", поэтому я решил, что ' убедитесь, что в скрипте учтены десятичные записи). Я добавил строку «Round» до и после вложенного цикла «Do ... Loop», и у меня все еще была проблема с Infinite Loop.
Насколько я смог это сделать, и теперь я застрял.
Я понимаю, что, вероятно, есть более эффективные способы проверки даты / времени в VBScript, и я, безусловно, открыт для любых новых предложений, но я бы хотел решить это просто ради назидания.