2016-01-18 3 views
1

У меня есть проблема с выбранным для цикла случаем. Петля отлично работает в первый раз, вплоть до случая 18. Тем не менее, всякий раз, когда я пытаюсь перезапустить цикл, набрав «Y», он будет перезапускать цикл в обычном режиме, но появляется ошибка, когда я пытаюсь введите значение в поле сообщения.Ошибка выбора случая цикла

Я смущен, почему код работает в первый раз, но не второй.

Sub MessageBoxFunction() 

Dim wbThis As Workbook 
Dim wsThis As Worksheet 
Dim msgBox As Variant 
Dim txt1, txt2 As String 
Dim rng1, rng2 As Range 
Dim i, iA, iB As Integer 

Set rng1 = Range("A1") 
Set rng2 = Range("A1") 
txt2 = rng1.Value 


Do Until IsEmpty(rng1) 
Set rng1 = rng1.Offset(1, 0) 
Loop 

For i = 1 To 18 
Select Case i 
Case 1 
    msgBox = InputBox("Do You Want To Input Information? (Y/N)") 
    txt1 = CStr(msgBox) 
    If InStr(1, msgBox, "N", 1) > 0 Then 
     i = 17 
     End If 
Case 2 To 17 
    msgBox = InputBox(txt2) 
    txt1 = CStr(msgBox) 
    iA = i - 2 
    iB = i - 1 
    rng1.Offset(0, iA).Value = txt1 
    txt2 = rng2.Offset(0, iB).Value 
Case 18 
    msgBox = InputBox("Do You Want To Input Additional Information (Y/N)") 
    txt1 = CStr(msgBox) 
    If InStr(1, msgBox, "Y", 1) > 0 Then 
     rng1 = rng1.Offset(1, 0) 
     txt2 = rng2.Value 
     i = 1 
     End If 

End Select 
Next i 

End Sub 
+0

Неправильная практика использования встроенных имен функций в качестве имени переменной: 'MsgBox' является встроенной функцией! – PatricK

+0

О да, вы правы. Никогда не замечал, что –

ответ

2

Вы не устанавливать диапазон на этой линии в case 18

rng1 = rng1.Offset(1, 0) 

Этом должен работать на вас.

Sub MessageBoxFunction() 

Dim wbThis As Workbook 
Dim wsThis As Worksheet 
Dim msgBox As Variant 
Dim txt1, txt2 As String 
Dim rng1 as Range, rng2 As Range 
Dim i, iA, iB As Integer 

Set rng1 = Range("A1") 
Set rng2 = Range("A1") 
txt2 = rng1.Value 


Do Until IsEmpty(rng1) 
Set rng1 = rng1.Offset(1, 0) 
Loop 

    For i = 1 To 18 
    Select Case i 
    Case 1 
     msgBox = InputBox("Do You Want To Input Information? (Y/N)") 
     txt1 = CStr(msgBox) 
     If InStr(1, msgBox, "N", 1) > 0 Then 
      i = 17 
      End If 
    Case 2 To 17 
     msgBox = InputBox(txt2) 
     txt1 = CStr(msgBox) 
     iA = i - 2 
     iB = i - 1 
     rng1.Offset(0, iA).Value = txt1 
     txt2 = rng2.Offset(0, iB).Value 
    Case 18 
     msgBox = InputBox("Do You Want To Input Additional Information (Y/N)") 
     txt1 = CStr(msgBox) 
     If InStr(1, msgBox, "Y", 1) > 0 Then 
      Set rng1 = rng1.Offset(1, 0) 
      txt2 = rng2.Value 
      i = 1 
      End If 

    End Select 
    Next i 

    End Sub 

Это должно быть так.

Dim rng1 as Range 
Set rng1 = rng1.Offset(1, 0) 
+0

Я не понять это. Почему я должен сделать другой объект диапазона? –

+0

Почему исходный объект с именем rng1 не работает, если он уже был создан? –

+0

В исходном коде вы не указали, какой тип переменной «rng1», поэтому VBA назначает его как любой из этих «Вариант/Объект/Диапазон». Без «Set» он становится переменной «Variant», и вы не можете использовать функцию «Смещение», поэтому вы получаете ошибку. –

1

Вы можете использовать окно сообщения при запросе Y/N вместо ввода:

If MsgBox("Do You Want To Input Additional Information", vbYesNo) = vbYes then 
...... 
End if 
+0

О, спасибо за сообщение об этой функции. –

+0

Что мне нужно для ввода функции для работы? Будет ли работать Y/N или пользователь должен ввести Да/Нет –

+0

В этом окне сообщения отображаются две кнопки с параметрами «Да» и «Нет», поэтому пользователю просто нужно щелкнуть один из них. –

Смежные вопросы