2015-08-13 2 views
1

Я создаю вероятностный макрос, в котором пользователь вводит число игроков в карточную игру. Если я ввешу строку (ex, Joe), нецелое (ex, 15.67) или целое число меньше 0 (ex, -25), InputBox должен зацикливаться. Однако целые числа, превышающие 0, должны заканчивать цикл. (Мне нужно принудительно убить Excel, чтобы остановить InputBox вне зависимости от пользовательского ввода.)Do Do not Loop InputBox бесконечно петли

Я хочу, чтобы InputBox закрывал/выходил из Sub, когда вводится целое число, большее 0. Что я здесь делаю неправильно?

Sub GenerateCards() 
Players = InputBox("How many players? Please enter an integer.") 
    Do Until TypeName(Players) = "Integer" And Players > 0 ' why does this loop even if both conditions are met (ex, Players=5?) 
     Players = InputBox("How many players? Please enter an integer.") 
    Loop 
End Sub 

ответ

4

InputBox() всегда возвращает строку, так TypeName() всегда будет возвращать "String".

Но вы можете проверить, возвращается ли строка, которая является целым числом. Во-первых, вы можете использовать IsNumeric(), чтобы проверить, является ли строка числовым значением. Затем вы можете безопасно отбросить его до Double или Integer. Фактически, вы можете отбросить его к обоим, а затем сравнить их друг с другом. Если они одинаковы, у вас есть целочисленное значение. Например:

Sub GenerateCards() 

    Do 
     Players = InputBox("How many players? Please enter an integer.") 

     If IsNumeric(Players) Then 
      If CDbl(Players) = CLng(Players) And Players > 0 Then 
       ' Integer > 0 entered. Exit loop... 
       Exit Do 
      End If 
     End If 
    Loop 

End Sub 
+0

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

+0

ОК, я пробовал это, он работает безупречно во всех экземплярах времени выполнения. Благодаря! –