Do Until循环中不会触发退出条件

时间:2013-09-10 15:24:02

标签: vb.net visual-studio-2010 excel

我正在尝试编写一个应用程序来获取报告(Excel工作表),操作一行,然后转到下一行,然后是下一行等,然后在前两个单元格后退出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

然而程序永远不会停止运行。

知道为什么吗?

1 个答案:

答案 0 :(得分:2)

在你的内部执行until..loop,你检查三个不同的条件,如果不满足所有这三个条件,你的代码将继续删除工作表的顶行。这会导致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循环来检查你是否已经用尽了数据,如果有的话就停止执行。