2015-07-07 2 views
0

Я пишу макрос, который начинается с ввода действительной даты. После записи даты я хочу, чтобы макрос выполнил поиск в листе для всех строк, имеющих эту дату. Затем я хочу, чтобы все соответствующие кредиты и дебетовые суммы были собраны для этих строк, а затем я хочу, чтобы эти итоги были помещены в другой рабочий лист. Это код, который я написал для этого.Excel VBA looping issue

Проблема в том, что EVENTUALLY, код будет бесконечно зацикливаться внутри «Search =, If и End If». Если я поставлю «Else: Next I» перед End If, тогда я получаю сообщение об ошибке «Else without For».

Любые предложения?

Private Sub CommandButton3_Click() 

Dim dateCheck As String 
Dim lastRow As Long 
Dim L As Integer 
Dim I As Long 
Dim shipDay As Date 
Dim search As String 
Dim usaTotal As Long 
Dim usaCredit As Long 
Dim usaDebit As Long 

dateCheck = InputBox("What Date is Ship Day 1?", "Ship Day Entry") 

If IsDate(dateCheck) Then 
    shipDay = DateValue(dateCheck) 
Else: 
    MsgBox ("Invalid Date") 
    Exit Sub 
End If ' Prompts user for ship day 1, and checks if actual date 

For L = 0 To 30 ' Execute this code for 1 month worth of dates 

    shipDay = shipDay + L 

    MsgBox shipDay 

    For I = 1 To 10000 ' Check every row of the worksheet 

     search = Worksheets("sheet1").Cells(I, 12).Value ' Variable to use InStr to check for "CAN" 


     If ((InStr(1, search, "CAN", vbBinaryCompare) = 0) _ 
      And (Worksheets("Sheet1").Cells(I, 8) = shipDay) _ 
      And (Worksheets("Sheet1").Cells(I, 6).Text = "Invoice")) Then 

      usaDebit = Worksheets("Sheet1").Cells(I, 22).Value ' Account for Debits 
      usaCredit = Worksheets("Sheet1").Cells(I, 24).Value ' Account for Credits 
      usaTotal = usaTotal + usaCredit - usaDebit ' Calculate contribution 

      ' This is where I tried placing an Else: Next I, which gives me an else without for prompts. 

     End If 

    Next I 

MsgBox (usaTotal) 
Worksheets("JUNE canada").Cells(L + 10, 4).Value = usaTotal/1000 'Enter value into sheet 
usaTotal = 0 ' Reset usaTotal value 

Next L 
+1

Итак, когда оператор IF не работает, вы просто хотите продолжить цикл For? AFAIK вы не можете сделать «next i», чтобы перейти к следующей итерации цикла. Что не так, просто оставив его как есть, без части «Else»? Таким образом, когда оператор IF не работает, он перейдет к следующему I. – BruceWayne

+0

Проблема в том, что «Next I» не возвращается к «For i = 1 to 10000». Вместо этого он возвращается к «search = worksheets» и бесконечно петляет. –

+1

Кажется, что это бесконечный цикл, почему вы так думаете? Хотя это крайне неэффективно: вместо 'To 1000' вы должны использовать' To Worksheets («sheet1»). UsedRange.Rows.Count'; если это будет вашей целью, но даже цикл 'For' не нужен, поскольку вы можете сделать это с помощью' WorksheetFunction.SumIFS' более легко. –

ответ

2

Используйте используемый диапазон вместо 10000

Dim lROw as Long 
    Do While lRow <= ws.UsedRange.Rows.Count 

     'Do stuff here. 

     lRow = lRow + 1 
     ws.Range("A" & lRow).Activate 
    Loop 

Так что ваш код будет выглядеть примерно как этот

Private Sub CommandButton3_Click() 

Dim dateCheck As String 
Dim lastRow As Long 
Dim L As Integer 
Dim I As Long 
Dim shipDay As Date 
Dim search As String 
Dim usaTotal As Long 
Dim usaCredit As Long 
Dim usaDebit As Long 

dateCheck = InputBox("What Date is Ship Day 1?", "Ship Day Entry") 

If IsDate(dateCheck) Then 
    shipDay = DateValue(dateCheck) 
Else: 
    MsgBox ("Invalid Date") 
    Exit Sub 
End If ' Prompts user for ship day 1, and checks if actual date 

For L = 0 To 30 ' Execute this code for 1 month worth of dates 

shipDay = shipDay + L 

MsgBox shipDay 

    I = 1 
    Do While I <= ws.UsedRange.Rows.Count 
     search = Worksheets("sheet1").Cells(I, 12).Value ' Variable to use InStr to check for "CAN" 

     If ((InStr(1, search, "CAN", vbBinaryCompare) = 0) _ 
      And (Worksheets("Sheet1").Cells(I, 8) = shipDay) _ 
      And (Worksheets("Sheet1").Cells(I, 6).Text = "Invoice")) Then 

      usaDebit = Worksheets("Sheet1").Cells(I, 22).Value ' Account for Debits 
      usaCredit = Worksheets("Sheet1").Cells(I, 24).Value ' Account for Credits 
      usaTotal = usaTotal + usaCredit - usaDebit ' Calculate contribution 

      ' This is where I tried placing an Else: Next I, which gives me an else without for prompts. 
     elseif instr(something, something) then 

     End If 

     I = I + 1 
     ws.Range("A" & I).Activate 
    Loop 

MsgBox (usaTotal) 
Worksheets("JUNE canada").Cells(L + 10, 4).Value = usaTotal/1000 'Enter value into sheet 
usaTotal = 0 ' Reset usaTotal value 

Next L