【问题标题】:Exit condition not triggering in Do Until loop在 Do Until 循环中未触发退出条件
【发布时间】:2013-09-10 15:24:02
【问题描述】:

我正在尝试编写一个应用程序,它需要一个报告(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

但是程序永远不会停止运行。

知道为什么吗?

【问题讨论】:

  • 要么这两个单元格永远不会真正为空,要么[various statements here] 修改了i 的值。
  • 感谢您的回复。我添加了实际代码而不是 [这里的各种语句]。
  • 请注意,不需要 i = i-1。当删除一行时,工作簿的行向上移动,因此之前的第 i+1 行变为第 i 行。

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


【解决方案1】:

在您的内部执行 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循环来检查你是否已经用完了数据,如果有就停止执行。

【讨论】:

  • Stewbob 的基本前提是正确的,他的逻辑比我的更有意义。我已经编辑了我的第一篇文章以包含最终代码,并将此问题标记为已回答。
猜你喜欢
  • 2011-07-05
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-08
  • 1970-01-01
  • 1970-01-01
  • 2017-12-07
相关资源
最近更新 更多