цикл do не зацикливается или генерирует цикл без ошибки do

#excel #vba

Вопрос:

привет, один из моих еженедельных файлов, который мы пытаемся включить в модель запросов макросов/мощности, чтобы обеспечить производство более широкой командой, почти завершен, но у меня возникла проблема с циклом, в котором будет указана часть имени файла с датой. файл может быть создан в любой день недели или в первые пару дней недели после того, как он будет связан, в зависимости от того, когда будут готовы исходные данные, но должен иметь префикс даты в формате yyyymmdd последней даты, на которую он содержит данные.

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

 Dim svdate As String Sub inpt() Do svdate = InputBox("date") If Len(svdate) = 8 And IsNumeric(svdate) Then MsgBox svdate Else  MsgBox ("the value should be a number in format yyyymmdd please try inputting the date again") End If Loop Until True  

поскольку мой vba не очень хорош, я только что тестировал приведенный выше код в отдельном подразделе, следовательно, поле msg в разделе «если верно», которое будет заменено остальными подразделами, которые будут запущены после правильного ввода даты. я определил переменную svdate как элемент уровня модуля a, он вызывается на многих других этапах в более широком макросе, которые все работают нормально, я просто хочу убедиться, что пользователь может ввести только соответствующую дату перед объединением кода.

поскольку код в настоящее время стоит, он попросит меня ввести дату в поле, а затем один раз показать один из 2-х msgbox, но если значение false не вернется на этап добавить поле ввода, как я и предполагал, цикл, пока клайн не подскажет. любая помощь в этом будет признательна.

Комментарии:

1. Вопрос: как вы думаете, почему цикл должен повториться? В настоящее время он повторяется до тех пор, пока true = true. … Вам нужна переменная, которая является истинной, когда svdate в порядке, и которая является ложной, если нет. Затем ваша loop until проверка должна оценить эту переменную. Кстати @ChristoferWeber: Нормально иметь двоеточие после другого, потому что тогда оно действует как две команды в одной строке.

2. спасибо отредактировал это, так как это был просто дамп копии из моего редактора vba, сам никогда не добавлял двоеточие, поэтому не уверен, почему оно все еще не зациклилось, хотя

3. привет, айк, разве я не вставил цикл, в котором говорится, что это ответ на элемент если верно, если да, то завершите цикл, если нет, вернитесь к началу цикла, чтобы сделать его истинным (строка kloop до истинного в конце кода). если нет, то как мне это сделать, поскольку я пытаюсь убедиться, что пользователь получит сообщение об ошибке, объясняющее, почему поле ввода необходимо заполнить, а затем снова появится, пока не будет введено допустимое значение

4. Точно так же, как за этим If следует утверждение, которое возвращает true или false, Loop until делает точно то же самое. В вашем случае утверждение было true , что похоже на высказывание If True Then в If эквиваленте, в том смысле, что оно всегда будет возвращать истину. Как сказал Айк, правда = правда. В то время как вы в основном хотите Loop Until Len(svdate) = 8 And IsNumeric(svdate)

Ответ №1:

Правильное зацикливание:

 Dim svdate As String Sub inpt() dim isOK as boolean Do  svdate = InputBox("date")  If Len(svdate) = 8 And IsNumeric(svdate) Then  isOK = true  MsgBox svdate  Else  isOK = false  MsgBox ("the value should be a number in format yyyymmdd please try inputting the date again")  End If Loop Until isOK = true End Sub  

В вашем коде If -цикл находится внутри Do -цикла, поэтому Do — цикл не «знает» о результате проверки.

С помощью моего кода isOK устанавливается If -цикл, и do -цикл может его оценить.

Комментарии:

1. спасибо за это просто для того, чтобы я понял логику того, что пошло не так, а затем с моим кодом изначально, пока я вставлял оператор цикла, не было ничего, что могло бы сказать vba, что для цикла было истинное ложное значение. это правильно? я предполагаю, что логическая часть просто передает значение, которое может понять функция цикла, верно?

2. смотрите мое дополнительное объяснение.