0

しばらく取り組んできた VBA マクロがあります。ほぼ目的の場所に到達しましたが、現在は for ループがスキップされています。数値をチェックしてから for ループに入り、一連の行をループして特定の情報を探すように設定しました。ブレークポイントを使用すると、IF ステートメントをチェックしてから For ステートメントにヒットすることがわかりますが、End If までスキップし、for ループ内にあるものにヒットすることはありません。マクロ全体ではなく、問題のコードを次に示します (全体が必要な場合は追加できます)。

        If (BranchNumber) Like "0" Or (BranchNumber) Like "1" Or (BranchNumber) Like "2" Or (BranchNumber) Like "3" Or (BranchNumber) Like "4" Or (BranchNumber) Like "5" Then

        fRow = Sheets(2).Range("A188").End(xlUp).Row

        For f = fRow To 3 Step -1
        Range("A" & f).Select
            For CountDown = 0 To 30 Step 1
                If (Range("A" & f).Value) Like Tellers(CountDown) Then
                    TellerName(count) = Range("B" & f).Value
                    MsgBox (CountDown)
                    MsgBox (Tellers(CountDown))
                    MsgBox (count)
                    MsgBox (TellerName(count))
                    MsgBox (TellerTotal(count))
                    If (BranchNumber) Like "0" Then
                        TellerTotal(count) = Range("C" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "1" Then
                        TellerTotal(count) = Range("D" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "2" Then
                        TellerTotal(count) = Range("E" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "3" Then
                        TellerTotal(count) = Range("F" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "4" Then
                        TellerTotal(count) = Range("G" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "5" Then
                        TellerTotal(count) = Range("H" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                End If
            Next
        Next f
    End If

これは最初にヒットした For ループでありfor f = fRow To 3 Step -1、最後までスキップしEnd Ifて for ループ内のコードを実行せずに続行します。何が起こっているのですか?

さて、いくつかの質問を明確にするために、残りのマクロを追加します。

Sub GetInfo()
Dim NumberBranches
Dim Branch
Dim Tellers(30), TellerTotal(30), TellerName(30)
Dim count As Long
Dim CountDown
Dim l, f As Long
Dim lRow, fRow As Long
Dim BranchNumber As Long
Dim Branches As Long
Dim lngIndex As Long
Dim strPath() As String

NumberBranches = Array("1", "2", "3", "4", "5", "6", "7", "8", "9", "11", "12", "13", "16", "18", "19", "20")

For Branches = 0 To 15 Step 1
    BranchNumber = InputBox("What is the branch number?", "Branch Number", NumberBranches(Branches))

    Branch = Application.GetOpenFilename("Excel files (*.xls), *.xls")
    'Application.ScreenUpdating = False
    Workbooks.Open FileName:=Branch
    strPath() = Split(path, "\")
    lngIndex = UBound(strPath)
    Branch = Mid(Mid(Branch, InStrRev(Branch, "/") + 1), InStrRev(Branch, "\") + 1)
    Windows(Branch).Activate

    lRow = Sheets(1).Range("A200").End(xlUp).Row
    MsgBox (lRow)
    count = 0
    For l = lRow To 1 Step -1
    MsgBox (l)
    MsgBox (lRow)
    Sheets(1).Activate
    Range("A" & l).Select
        If (BranchNumber) Like "19" Then
            If (Range("B" & l).Value) Like "TC:*" Then
                Tellers(count) = Replace(Range("B" & l).Value, "TC: ", "")
                count = count + 1
            End If
            If (Range("H" & l).Value) Like "TC:*" Then
                Tellers(count) = Replace(Range("H" & l).Value, "TC: ", "")
                count = count + 1
            End If
        End If
        If BranchNumber <> "19" Then
            If (Range("A" & l).Value) Like "TC:" Then
                Tellers(count) = Range("B" & l).Value
                count = count + 1
            End If
            If (Range("H" & l).Value) Like "TC:" Then
                Tellers(count) = Range("I" & l).Value
                count = count + 1
            End If
        End If
    Next l

    Windows("TellerTranCounts.xlsm").Activate
    Sheets(2).Activate

    If (BranchNumber) = "0" Or (BranchNumber) = "1" Or (BranchNumber) = "2" Or (BranchNumber) = "3" Or (BranchNumber) = "4" Or (BranchNumber) = "5" Then
        fRow = Sheets(2).Range("A188").End(xlUp).Row
        MsgBox (fRow)
        MsgBox (f)
        For f = fRow To 3 Step -1
        MsgBox (f)
        Range("A" & f).Select
            For CountDown = 0 To 30 Step 1
                If (Range("A" & f).Value) Like Tellers(CountDown) Then
                    TellerName(count) = Range("B" & f).Value
                    MsgBox (CountDown)
                    MsgBox (Tellers(CountDown))
                    MsgBox (count)
                    MsgBox (TellerName(count))
                    MsgBox (TellerTotal(count))
                    If (BranchNumber) Like "0" Then
                        TellerTotal(count) = Range("C" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "1" Then
                        TellerTotal(count) = Range("D" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "2" Then
                        TellerTotal(count) = Range("E" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "3" Then
                        TellerTotal(count) = Range("F" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "4" Then
                        TellerTotal(count) = Range("G" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                    If (BranchNumber) Like "5" Then
                        TellerTotal(count) = Range("H" & f).Value
                        MsgBox (TellerTotal(count))
                        count = count + 1
                    End If
                End If
            Next
        Next f
    End If
    If (BranchNumber) Like "6" Or (BranchNumber) Like "7" Or (BranchNumber) Like "8" Or (BranchNumber) Like "9" Or (BranchNumber) Like "11" Or (BranchNumber) Like "12" Then
        fRow = Sheets(2).Range("A375").End(xlUp).Row

        For f = fRow To 189 Step -1
        Range("A" & f).Select
            For CountDown = 0 To 30 Step 1
                If (Range("A" & f).Value) Like Tellers(CountDown) Then
                    TellerName(count) = Range("B" & f).Value
                    If (BranchNumber) Like "6" Then
                        TellerTotal(count) = Range("C" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "7" Then
                        TellerTotal(count) = Range("D" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "8" Then
                        TellerTotal(count) = Range("E" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "9" Then
                        TellerTotal(count) = Range("F" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "11" Then
                        TellerTotal(count) = Range("G" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "12" Then
                        TellerTotal(count) = Range("H" & f).Value
                        count = count + 1
                    End If
                End If
            Next
        Next f
    End If
    If (BranchNumber) Like "13" Or (BranchNumber) Like "16" Or (BranchNumber) Like "18" Or (BranchNumber) Like "19" Or (BranchNumber) Like "20" Or (BranchNumber) Like "51" Then
        fRow = Sheets(2).Range("A562").End(xlUp).Row

        For f = fRow To 377 Step -1
        Range("A" & f).Select
            For CountDown = 0 To 30 Step 1
                If (Range("A" & f).Value) Like Tellers(CountDown) Then
                    TellerName(count) = Range("B" & f).Value
                    If (BranchNumber) Like "13" Then
                        TellerTotal(count) = Range("C" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "16" Then
                        TellerTotal(count) = Range("D" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "18" Then
                        TellerTotal(count) = Range("E" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "19" Then
                        TellerTotal(count) = Range("F" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "20" Then
                        TellerTotal(count) = Range("G" & f).Value
                        count = count + 1
                    End If
                    If (BranchNumber) Like "51" Then
                        TellerTotal(count) = Range("H" & f).Value
                        count = count + 1
                    End If
                End If
            Next
        Next f
    End If
    Dim Counted
    Dim InputCount
    Dim BranchName As String

    If BranchNumber Like "1" Then
        BranchName = "Swinney Teller Report"
        Sheets(3).Activate
    End If
    If BranchNumber Like "2" Then
        BranchName = "Decatur Teller Report"
        Sheets(4).Activate
    End If
    If BranchNumber Like "3" Then
        BranchName = "Tillman Teller Report"
        Sheets(5).Activate
    End If
    If BranchNumber Like "4" Then
        BranchName = "Huntington Teller Report"
        Sheets(6).Activate
    End If
    If BranchNumber Like "5" Then
        BranchName = "Medical Park Teller Report"
        Sheets(7).Activate
    End If
    If BranchNumber Like "6" Then
        BranchName = "West Jefferson Teller Report"
        Sheets(8).Activate
    End If
    If BranchNumber Like "7" Then
        BranchName = "New Haven Teller Report"
        Sheets(9).Activate
    End If
    If BranchNumber Like "8" Then
        BranchName = "Waynedale Teller Report"
        Sheets(10).Activate
    End If
    If BranchNumber Like "9" Then
        BranchName = "Scottsville Teller Report"
        Sheets(11).Activate
    End If
    If BranchNumber Like "11" Then
        BranchName = "Columbia City Teller Report"
        Sheets(12).Activate
    End If
    If BranchNumber Like "12" Then
        BranchName = "Danville Teller Report"
        Sheets(13).Activate
    End If
    If BranchNumber Like "13" Then
        BranchName = "Mattoon Teller Report"
        Sheets(14).Activate
    End If
    If BranchNumber Like "16" Then
        BranchName = "Lima Teller Report"
        Sheets(15).Activate
    End If
    If BranchNumber Like "18" Then
        BranchName = "Stellhorn Crossing Teller Report"
        Sheets(16).Activate
    End If
    If BranchNumber Like "19" Then
        BranchName = "Wayne Haven Teller Report"
        Sheets(17).Activate
    End If
    If BranchNumber Like "20" Then
        BranchName = "Hopkinsville Teller Report"
        Sheets(18).Activate
    End If

        Range("B1").Value = BranchName
        Range("B2").Formula = "=Today()"
        ActiveCell.NumberFormat = "[$-409]mmmm-yy;@"
        Range("A5").Value = "Totals"
        Range("B5").Value = "Name of Employee"
        Range("C5").Value = "Error"
        Range("D5").Value = "Percent"
        Counted = 6
        For InputCount = 0 To 30 Step 1
            If TellerName(InputCount) <> "" Then
                Range("A" & InputCount + 6).Value = TellerTotal(InputCount)
                Range("A" & InputCount + 6).NumberFormat = "#,##0"
                Range("B" & InputCount + 6).Value = TellerName(InputCount)
                Range("D" & InputCount + 6).Formula = "=if(A" & InputCount & "<>0,(A" & InputCount & "-C" & InputCount & ")/A" & InputCount & ",""N/A"")"
                Range("D" & InputCount + 6).NumberFormat = "0.000%"
                Counted = Counted + 1
            End If
        Next
        Range("A" & Counted).Formula = "=sum(A6:A" & Counted & ")"
        Range("B" & Counted).Value = "Total Tellers"
        Range("C" & Counted).Formula = "=sum(C6:C" & Counted & ")"
        Range("D" & Counted).Formula = "=if(A" & Counted & "<>0,(A" & Counted & "-C" & Counted & ")/A" & Counted & ",""N/A"")"
        Range("D" & Counted).NumberFormat = "0.000%"
        Columns("A:D").Select
        Selection.Columns.AutoFit
        Call Format(Counted)
        Call FormatBorder(Counted)
        Range("A1").Select
        Windows(Branch).Activate
        Windows(Branch).Close (False)
Next

サブ終了

かなり長いことは承知していますが、これがすべてです。トラブルシューティング用にいくつかのメッセージ ボックスを追加しました。通常はありません。

何が起きているかというと、ユーザーにブランチ番号を入力してから、そのブランチからファイルを開くように求めます。ファイルを実行し、そこから情報を取得するコードがあります。(このコードは for ループを使用して正常に動作します)。引き出された情報と支店番号に基づいて、メイン ワークブックの出納係の名前と合計を探す場所を選択し、支店番号によって決定されたシートにこのすべての情報を挿入します。次に、次のブランチ番号とファイルの要求を最初からやり直します。これは、16 個のブランチ ファイルすべてがメイン ファイルに処理されるまで続きます。これを行うためのより高速な方法があると確信していますが、まだこれを機能させていないため、最適化については今のところ心配していません。私はそれが機能する必要があります。

4

3 に答える 3

0

fRow の値を調べましたか。ループの開始時に変数 fRow が変数 f より小さい可能性があるため、ループを開始する条件が満たされることはありません。

于 2013-10-23T12:47:45.127 に答える
0

エラーは次の行にあります。

fRow = Sheets(2).Range("A188").End(xlUp).Row

多くの場合、これは最後に使用された行を取得しますが、A1 から A188 までのすべてのデータがデータで満たされている場合、空白のセルが見つからないため、それが範囲の一番上のセルであるため、計算は 1 を返します。検索を終了します。

これには、データがどのように表示されるかに応じて、3 つの解決策があります。

  1. 常に 188 行を超えるデータがある場合は、計算を行わずに fRow を 188 に設定します。
    fRow = 188
  2. データに欠落がない場合は上から下へ、上から下へ数えて
    fRow = Sheets(2).Range("A1").End(xldown).Row
    188以上かどうかを調べる
  3. ギャップがある場合は、最後の可能な行
    fRow = Sheets(2).cells(sheets(2).Usedrange.Rows.Count+1,1).End(xlUp).Row
    を過ぎてから検索し、188 を超えているかどうかを確認し、そうでない場合は 188 に設定します。
于 2013-10-23T14:27:40.483 に答える
0

変数 fRow は、列の最初の空でないセルの行の値を想定していることに注意してくださいfRow = Sheets(2).Range("A188").End(xlUp).Row

したがって、fRow の値は 1 ~ 188 であり、ループ ステートメントFor f = fRow To 3 Step -1は fRow が 3 より大きい場合にのみ機能します。

ループに入る前に fRow の値を確認してください。

また、IF BranchNumber は 1、2、3、4、または 5 しか指定できません。すでに 1 であることがわかっている場合は、2 かどうかを確認する必要はありません。Else 条件を使用します。

If (BranchNumber) Like "1" Then
   TellerTotal(count) = Range("C" & f).Value
   MsgBox (TellerTotal(count))
   count = count + 1
   ElseIf (BranchNumber) Like "2" Then
        TellerTotal(count) = Range("E" & f).Value
        MsgBox (TellerTotal(count))
         count = count + 1
   End If      
End If
于 2013-10-23T13:47:51.653 に答える