1

我正在尝试做一个简单的循环,其中我已将一些变量声明为数组条目。我最初将它们用作要覆盖的变量,但是当我读到这些变量不会在每次循环时自动覆盖时更改了它。

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

该代码本质上是为工作表中cons_sum(i,2)的每个i或行查找Pre-Summary并在另一个工作表中汇总一些数据BOPE,然后将该总和插入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
4

2 回答 2

1

正如 Siddharth 指出的那样,您更换床单将导致cons_sum(i, 1) = "BOPE"始终是负面的。因此,虽然循环将运行 1,848 次,但它不会改变任何东西。

此外,还有几点说明:

  • 您正在使用 1848x4 数组在每一行中执行多个操作 - 但仅存储每个操作的值,之后不使用该数组。因此,您不需要 1848x4,而只需要 1x4,因为您可以重用变量
  • 与其使用数组,不如使用口语变量。这将使您的代码更容易理解
  • 您对隐藏在 VBA 公式/语句中的工作簿结构有很多假设,例如行数、名称“BOPE”等。最好将它们存储在宏开头的常量中 - 甚至最好将它们存储在设置表上的某个位置并使用命名范围引用它们
  • 您很可能忘记FALSE(or 0) 作为 match 函数的第三个参数。因此,如果列未排序,该函数可能会返回错误的值
  • 而不是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

由于我没有你的工作表,我无法调试它。另外,不确定我是否打对了名称,因为我不知道每个变量的真正含义。但它应该给你一个开始。

于 2013-02-18T08:16:40.367 回答
0

如果代码的第一次迭代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
于 2013-02-18T08:11:00.003 回答