For循环在第一次迭代-Excel VBA之后终止

我正在尝试做一个简单的循环,在那里我已经声明一些variables作为数组条目。 我最初使用它们作为被覆盖的variables,但是当我读取这些variables不会自动覆盖每次通过循环时改变它。

我的问题是这个循环在第一次迭代之后终止(没有错误)。 我似乎无法弄清楚为什么…

代码基本上是为每个i或排Pre-Summary表中的行findcons_sum(i,2) ,并在另一个表BOPE 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 

正如Siddharth所指出的那样,您更改表单会导致cons_sum(i, 1) = "BOPE"始终为负值。 因此,循环将运行1848次,它不会改变任何东西。

另外还有几点意见:

  • 您正在使用一个1848x4arrays在每一行中执行多个操作 – 但只存储了每个操作的值,之后不使用该数组。 因此,您不需要1848×4,但只需要1×4,因为您可以重复使用这些variables
  • 而不是使用数组,使用说话variables会更好。 这会让你的代码更容易理解
  • 你对隐藏在VBA公式/语句中的工作簿结构有很多假设,例如行数,名称“BOPE”等等。最好把它们存储在macros的开头的常量中 – 或者甚至是最好将它们存储在设置表的某个地方,并用指定的范围引用它们
  • 你很可能忘记了FALSE (或0 )作为匹配函数的第三个参数。 因此,如果该列未被sorting,该函数可能会返回错误的值
  • 您可以使用Range.ResizeRange.Offset (及其组合)来代替Range(Cells(x1,y1),Cells(x2,y2)) )。 这使得代码更容易阅读!
  • 除非你确切地知道你很高兴忽略哪个错误,否则不要使用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 

由于我没有工作表,我无法debugging它。 此外,不知道是否我击中了正确的名字,因为我不知道每个variables是真正指的是什么。 但它应该给你一个开始。

如果第一次启用代码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