2

これが私のコードです。コード自体は機能しているようですが、何らかの理由で条件ステートメントが32645行目で停止します。すべての変数をLongに切り替えてみましたが、役に立ちませんでした。

また、32646行目から開始するとコードは機能しますが、その後のランダムな行(〜18000)で停止します。停止するデータに類似点はないようです。もともと私は開始行と終了行を指定するforループを試しましたが、それも機能しなかったので、whileループを試しました(理論的には両方とも機能するはずですが、どちらも機能しないようです)。

130,000以上の行を処理できる必要がありますが、なぜこれが発生するのか考えてみてください。

問題

ループはエラーなしで実行を停止し、メッセージボックスを追加することで、行増分変数が最後の行で終了することがわかりますが、ブックによっては、条件ステートメントは任意の行数の後で評価されなくなります。

最初の実行が停止した下の行からスクリプトを実行すると、スクリプトは機能しますが、(おそらく異なる)任意の数のステップで再び機能します。

ノート

すべての変数を「Long」タイプにしました。OptionExplicitを使用しました。

data_row = CLng(InputBox("Please enter the row number of the first data entry"))
Worksheets.Add(After:=Worksheets(1)).name = "Formatted_Output"

Set ws = Sheets("Formatted_Output")
Worksheets(1).Activate
LastCol = ActiveSheet.UsedRange.Columns(ActiveSheet.UsedRange.Columns.Count).Column
LastRow = ActiveSheet.UsedRange.Rows(ActiveSheet.UsedRange.Rows.Count).row
data_col = LastCol

 'loop through entries to get account and permissions
 increment = data_row
 Do Until increment = LastRow
    If Cells(data_row, data_col) = "" Then
        data_col = data_col - 1
    Else
   ' ~> For illegal ==> access denied permission that throws errors
        If Cells(data_row, data_col).Value = "==>access denied" Then
            permissions = "access denied" 'remove illegal =
            ws.Cells(output_row, 3).Value = permissions 'print permissions to output file
        Else
            permissions = Cells(data_row, data_col).Value 'cell should be permission cell of each row
            ws.Cells(output_row, 3).Value = permissions 'print permissions to output file
        End If

        data_col = data_col - 1 'domain / account cell is now highlighted

        If InStrRev(Cells(data_row, data_col).Value, "?") > 0 Then

            account = Split(Cells(data_row, data_col).Value, "?")(1) & Str(unknown_count) ' separate domain name and unknown id
            unknown_count = unknown_count + 1 ' counting the number of unkown accounts found
            ws.Cells(output_row, 2) = account 'print unknown account Id to output

            domain_bit = Split(Cells(data_row, data_col).Value, "?")(0) '' get separate domain name from id cell
            data_col = data_col - 1 'domain second from end cell is now highlighted

            Do While data_col > 0 'generate domain from rest of row
                domain_bit = Cells(data_row, data_col).Value & domain_bit 'domain built backwards
                data_col = data_col - 1 'check next column for more of location name
            Loop

            ws.Cells(output_row, 1) = domain_bit
                'data_col = LastCol
                'data_row = data_row + 1
                'output_row = output_row + 1

        ElseIf InStrRev(Cells(data_row, data_col).Value, "\") > 0 Then

            account = Split(Cells(data_row, data_col).Value, "\")(1) 'separate account ID
            ws.Cells(output_row, 2) = account 'print account ID to oputput

            domain_bit = Split(Cells(data_row, data_col).Value, "\")(0)
            data_col = data_col - 1 'domain second from end cell is now highlighted

            Do While data_col > 0 'generate domain from rest of row
                domain_bit = Cells(data_row, data_col).Value & domain_bit 'domain built backwards
                data_col = data_col - 1 'check next column for more of location name
            Loop

            ws.Cells(output_row, 1) = domain_bit 'output to file

        Else
                         account = Cells(data_row, data_col).Value 'account is just whole cell whether empty or one word no path
            ws.Cells(output_row, 2) = account 'print account ID to oputput

            data_col = data_col - 1 'domain second from end cell is now highlighted (since no domain in account cell)
            Do While data_col > 0 'generate domain from rest of row
                domain_bit = Cells(data_row, data_col).Value & domain_bit 'domain built backwards
                data_col = data_col - 1 'check next column for more of location name
            Loop

            ws.Cells(output_row, 1) = domain_bit 'output to file
        End If

    data_col = LastCol
    data_row = data_row + 1
    output_row = output_row + 1
    End If

'Next increment
ws.Range("E" & 1) = unknown_count
increment = increment + 1

If increment = LastRow Then
    MsgBox (Str(increment) & "=" & Str(LastRow))
End If

Loop
4

1 に答える 1

1

最初の包括的なifステートメントが正常に機能していないと思います。これは、trueであることが判明した場合、data_row変数が増加せず、自動行増加を無効にすることです。

これがincrement必要な場合は、変数に関係なく増加するため、変数をifステートメント内に移動する必要がありdata_rowます。

私はfor-nextより良いと思います:

for data_row = 1 to LastRow
    'do some stuff
next

これにより、すべての行1からLastRow反復ごとに循環します。


より良い答えを追加しました:

Do Until increment > LastRow
    ...
    data_col = LastCol
    data_row = data_row + 1
    output_row = output_row + 1
    increment = increment + 1
    End If

    If increment > LastRow Then
        MsgBox (Str(increment) & ">" & Str(LastRow))
    End If
Loop
于 2013-03-06T12:02:42.150 に答える