2013-02-18 133 views
1

我想做一個簡單的循環,在那裏我已經聲明瞭一些變量作爲數組條目。我最初使用它們作爲被覆蓋的變量,但是當我讀到這些變量不會在循環中每次都自動覆蓋時就改變了它們。For循環在第一次迭代後終止-Excel VBA

我的問題是這個循環在第一次迭代之後終止(沒有錯誤)。我似乎無法在另一片BOPE弄清楚爲什麼...

的代碼基本上找到cons_sum(i,2)每個i,或在Pre-Summary錶行和總結了一些數據,然後插入到總和Pre-Summary

這是我的第一篇文章,我自學vba所以請原諒任何代碼失敗。

這是我的代碼:

Option Explicit 

Sub Create_GAR080() 
    Consmonth = Sheets("GAR080").Range("B2").Value 

    Sheets("Pre-Summary").Select 

    LastRow_summary = Cells(Rows.Count, "A").End(xlUp).Row 
    LastRow = 156 
    LastCol = 16 

    Dim cons_sum() As Variant 
    ReDim cons_sum(LastRow_summary, 4) 

    For i = 1 To LastRow_summary Step 1 

     cons_sum(i, 1) = Cells(i, 2).Value & "" 'pulls participant 
     cons_sum(i, 2) = cons_sum(i, 1) & Cells(i, 1) ' participant and gas gate concatenated 

     If cons_sum(i, 1) = "BOPE" Then 
      Sheets(cons_sum(i, 1)).Select 

      cons_sum(i, 3) = WorksheetFunction.Match(cons_sum(i, 2), Sheets(cons_sum(i, 1)).Range("A:A")) ' find participant gas gate combo 

      cons_sum(i, 4) = Application.Sum(Sheets(cons_sum(i, 1)).Range(Cells(cons_sum(i, 3), 5), Cells(cons_sum(i, 3), 16))) 

      If cons_sum(i, 4) > 0 Then 
       Sheets("Pre-Summary").Cells(i, 4).Value = cons_sum(i, 4) 
      End If 
     End If 
    Next i 

    On Error Resume Next 
End Sub 
+1

在循環之前在'Lastrow_summay'上執行'debug.print'。我懷疑你正在循環行A和頂行之間的行數,也就是說,循環遍歷第一行。 – Bingo 2013-02-18 04:33:09

+0

嗨賓果,LastRow_Summary出現爲1848年,這是我的預期.. – user2081943 2013-02-18 04:48:16

+3

我看到的一個直接的問題是使用'選擇'當你說'表格(cons_sum(i,1))。選擇',你因爲你的'cons_sum(i,1)= Cells(i,2).Value'會改變表單,因爲它會引用錯誤的表單。我會建議看看這個鏈接。你真的應該避免使用'.Select' http://stackoverflow.com/questions/10714251/excel-macro-avoiding-using-select另外pleassssssssssssssssssssse避免使用'在錯誤恢復下一個'因爲不必要的原因:) – 2013-02-18 07:04:46

回答

0

如果第一itiration代碼Sheets(cons_sum(i, 1)).Select被擊中,你永遠不會回到前彙總表。

嘗試:

Option Explicit 

Sub Create_GAR080() 
    Consmonth = Sheets("GAR080").Range("B2").Value 

    Sheets("Pre-Summary").Select 

    LastRow_summary = Cells(Rows.Count, "A").End(xlUp).Row 
    LastRow = 156 
    LastCol = 16 

    Dim cons_sum() As Variant 
    ReDim cons_sum(LastRow_summary, 4) 

    For i = 1 To LastRow_summary Step 1 
     Sheets("Pre-Summary").Select 

     cons_sum(i, 1) = Cells(i, 2).Value & "" 'pulls participant 
     cons_sum(i, 2) = cons_sum(i, 1) & Cells(i, 1) ' participant and gas gate concatenated 

     If cons_sum(i, 1) = "BOPE" Then 
      Sheets(cons_sum(i, 1)).Select 

      cons_sum(i, 3) = WorksheetFunction.Match(cons_sum(i, 2), Sheets(cons_sum(i, 1)).Range("A:A")) ' find participant gas gate combo 

      cons_sum(i, 4) = Application.Sum(Sheets(cons_sum(i, 1)).Range(Cells(cons_sum(i, 3), 5), Cells(cons_sum(i, 3), 16))) 

      If cons_sum(i, 4) > 0 Then 
       Sheets("Pre-Summary").Cells(i, 4).Value = cons_sum(i, 4) 
      End If 
     End If 
    Next i 

    On Error Resume Next 
End Sub 
1

由於亞洲時報Siddharth所指出的,你的牀單的變化將導致cons_sum(i, 1) = "BOPE"永遠是負面的。因此,循環將運行1848次,它不會改變任何東西。

此外,幾個備註:

  • 您使用的是1848x4陣列中的每一行做多操作 - 但只存儲每個操作的價值,而不是事後使用數組。因此,您不需要1848x4,但只需要1x4,因爲您可以重複使用變量
  • 而不是使用數組,使用說話變量會更好。這會讓你的代碼更容易理解
  • 你對隱藏在VBA公式/語句中的工作簿結構有很多假設,例如,行數,名稱「BOPE」等。最好將它們存儲在宏的開頭的常量中 - 或者甚至更好地將它們存儲在設置表中的某個地方,並用指定範圍引用它們
  • 您很可能忘記FALSE(或0)作爲匹配函數的第三個參數。因此,如果列沒有排序,函數可能會返回錯誤的值
  • 而不是Range(Cells(x1,y1),Cells(x2,y2))您可以使用Range.ResizeRange.Offset(及其組合)。這使代碼更容易閱讀!
  • 請勿使用On Error Resume Next除非您確切知道您很高興忽視哪些錯誤!即使使用它,也可以在允許產生錯誤的操作之後立即使用另一個On Error語句。

考慮到這一點,我返工你的代碼如下:

Sub Create_GAR080_reworked() 
    Const cStrTerm As String = "BOPE" 

    Dim wsData As Worksheet 
    Dim lngRowCount As Long, i As Long 
    Dim strParticipantGasID As String 
    Dim lngParticipantGasCombo As Long 
    Dim dblSum As Double 

    Set wsData = Sheets(cStrTerm) 

    With Sheets("Pre-Summary") 
     lngRowCount = .Cells(Rows.Count, 1).End(xlUp).Row 
     For i = 1 To lngRowCount 

      If .Cells(i, 2) = cStrTerm Then 
       strParticipantGasID = cStrTerm & .Cells(i, 1) ' participant and gas gate concatenated 

       lngParticipantGasCombo = WorksheetFunction.Match(_ 
        strParticipantGasID, wsData.Range("A:A"), 0) ' find participant gas gate combo 

       dblSum = Application.Sum(_ 
        wsData.Range("E1:P1").Offset(lngParticipantGasCombo - 1)) 

       If dblSum > 0 Then 
        .Cells(i, 4).Value = dblSum 
       End If 
      End If 
     Next i 
    End With 
End Sub 

由於我沒有你的工作,我不能調試。此外,不知道我是否擊中了正確的名稱,因爲我不知道每個變量實際上指的是什麼。但它應該給你一個開始。

+0

這就是太好了,謝謝你的幫助! – user2081943 2013-02-19 03:04:02