1

いくつかの変数を配列エントリとして宣言した単純なループを実行しようとしています。私はもともとそれらを上書きする変数として使用していましたが、これらの変数はループのたびに自動的に上書きされないことを読んで変更しました。

私の問題は、このループが最初の繰り返しの後に終了することです (エラーなし)。理由が分からないようです...

コードは基本的に、シート内の各行または行を検索cons_sum(i,2)し、別のシートのデータを合計してから、その合計を に挿入します。iPre-SummaryBOPEPre-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」などです。それらをマクロの先頭の定数に格納することをお勧めします。それらを設定シートのどこかに保存し、名前付き範囲で参照することをお勧めします
  • ほとんどの場合、一致関数の 3 番目のパラメーターとしてFALSE(または) を忘れました。0したがって、列がソートされていない場合、関数は間違った値を返す可能性があります
  • 代わりにand (およびその組み合わせ)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がヒットした場合、Pre-Summary シートに戻ることはありません。

試す:

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 に答える