3

レポート (Excel ワークシート) を取得し、行を操作し、次の行に移動し、次の行などに移動し、次の最初の 2 つのセルが次のセルになるまで Do Until ループを終了するアプリケーションを作成しようとしています。次のように行が空です (処理する行がこれ以上ないことを示します)。

Imports Excel = Microsoft.Office.Interop.Excel

Dim MSExcel As New Excel.Application
MSExcel.Visible = True

Dim WorkbookA As Excel.Workbook
Dim WorksheetA As Excel.Worksheet

Dim i As Integer = 2 'Skipping header row
Dim Split() As String
Dim SomeStrings() As String = {"StringA", "StringB"} 'etc... an array of strings

WorkbookA = MSExcel.Workbooks.Open(TextBox1.Text)
WorksheetA = WorkbookA.Sheets.Item(1)

Do Until WorksheetA.Cells(i, 1).Value = "" And WorksheetA.Cells(i, 2).Value = ""

'~~If Column A cell does not contain 'valueA' or Column E cell does not contain 'valueB', delete the row
        Do Until InStr(WorksheetDisplay.Cells(i, 1).Value, "ValueA") <> 0 And InStr(WorksheetDisplay.Cells(i, 5).Value, "ValueB") <> 0 _
            And InStr("somenumbershere", Strings.Left((WorksheetDisplay.Cells(i, 3).Value), 1)) <> 0 'Only keeps entries that begin with a certain number
            WorksheetDisplay.Rows(i).Delete() 'Otherwise we delete the row
        Loop

        For Each Str As String In SomeStrings
            If Str = WorksheetDisplay.Cells(i, 3).Value Then
                Split = Strings.Split(WorksheetDisplay.Cells(i, 3).Value, " ")
                WorksheetDisplay.Cells(i, 3).Value = Split(0) & " some text here"
            End If
        Next

        i = i + 1

Loop

ただし、プログラムの実行が停止することはありません。

理由はありますか?

4

1 に答える 1

2

3 つの異なる条件をチェックしている内部の do until..loop で、これらの 3 つの条件がすべて満たされていない場合、コードはワークシートの一番上の行を削除し続けます。これにより、Excel はワークシートの下部に行を追加し続けます。

したがって、この内側の do ループは永久に実行される可能性があり、外側の do ループが空白セルの存在を評価することを防ぎます。ロジックのより良い配置は次のようになります。

Do Until WorksheetA.Cells(i, 1).Value = "" And WorksheetA.Cells(i, 2).Value = ""
  If InStr(WorksheetDisplay.Cells(i, 1).Value, "ValueA") <> 0 And InStr(WorksheetDisplay.Cells(i, 5).Value, "ValueB") <> 0 _
            And InStr("somenumbershere", Strings.Left((WorksheetDisplay.Cells(i, 3).Value), 1)) <> 0 'Only keeps entries that begin with a certain number
    WorksheetDisplay.Rows(i).Delete() 'Otherwise we delete the row
    'Decrement i so that the row that used to be beneath the row just deleted is not skipped.
    i = i - 1
  Else
    For Each Str As String In SomeStrings
      If Str = WorksheetDisplay.Cells(i, 3).Value Then
        Split = Strings.Split(WorksheetDisplay.Cells(i, 3).Value, " ")
        WorksheetDisplay.Cells(i, 3).Value = Split(0) & " some text here"
      End If
    Next
  End If
  i = i + 1
Loop

どのような種類のデータセットに対してテストする必要があるかわからないため、このコードは実行していません。ただし、基本的に、行を削除した場合は、外側の do ループに戻ってデータが不足しているかどうかを確認し、不足している場合は実行を停止する必要があります。

于 2013-09-11T13:30:14.877 に答える