退出循环并在找到第一个空单元格时继续到下一行

时间:2018-06-21 06:07:33

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

我需要能够遍历Excel工作表,并在第一个null或空值处循环,我希望循环退出并继续下一行。

                'Add the rows'
                        For Each cell In worksheetRow
                            If cell.Value Is Nothing Then
                                For index = _dataTable.Rows.Count - 1 To 0
                                    Dim deleteRow = _dataTable.Rows(index)
                                    If _dataTable.Rows.Contains("NULL") Then
                                        deleteRow.Delete()
                                    End If
                                Next
                                GoTo executeInsert
                            Else
                                row(cell.Start.Column - 2) = cell.Value.ToString.Trim()
                            End If
                        Next cell
                    Next

executeInsert:          Try
                            Company.Applications.ProductionEngine.BusinessAccess.BankTargetsConfigurationBusinessAccess.ExecuteLoadFileData(_dataTable, _year)

问题在于,For Each循环遍历每个单元格。因此,在找到的第一个空单元格上,它将继续到下一个空单元格,依此类推。

这是插入表中的结果。

New Table

直到第13行,在第一个空值出现之前,我要退出循环并转到我的下一行代码,该代码负责保存到目前为止循环收集的内容,直到第12行的最右边单元格值为'2018'。

为了完整起见,这是连接到数据库并保存数据的下一个代码块。找到第一个空值出现后,这是我需要去的地方。

                    Try


Company.Applications.ProductionEngine.BusinessAccess.BankTargetsConfigurationBusinessAccess.ExecuteLoadFileData(_dataTable, _year)
                    Catch ex As Exception
                        'The data insert failed'
                        InformationBox1.ShowErrorMessage("An internal error occured. Please refresh the page and try again.")
                    End Try
                    InformationBox1.ShowSuccessMessage("Data Uploaded")

我已经尝试过了,而且行得通。问题是,如果稍后将某些内容添加到工作表中,并且行数变为148,这将无济于事。

                    For rowNumber As Integer = 1 To 147
                        Dim worksheetRow = _worksheet.Cells(rowNumber, 2, rowNumber, 4)
                        Dim row As DataRow = _dataTable.Rows.Add()
                        For Each cell In worksheetRow
                            row(cell.Start.Column - 2) = cell.Value.ToString.Trim()
                        Next
                    Next

我也尝试过,但是行不会增加。读取工作表中的每一行并将其添加到第一行,每条记录都会覆盖前一行,因此这里总会有一行。

                   Dim rowCounter As Integer = 0
                    While rowCounter < _worksheet.Dimension.End.Row
                        Dim worksheetRow = _worksheet.Cells(1, 2, _worksheet.Dimension.End.Row, 4)
                        Dim row As DataRow = _dataTable.Rows.Add()
                        For Each cell In worksheetRow
                            If cell.Value IsNot Nothing Then
                                row(cell.Start.Column - 2) = cell.Value.ToString.Trim()
                            End If
                            rowCounter += 1
                        Next
                    End While

最后,我尝试了Do Loop。我得到与上面的While循环相同的结果。

                    Do
                        Dim worksheetRow = _worksheet.Cells(1, 2, _worksheet.Dimension.End.Row, 4)
                        Dim row As DataRow = _dataTable.Rows.Add()
                        For Each cell In worksheetRow
                            row(cell.Start.Column - 2) = cell.Value.ToString.Trim()
                        Next
                    Loop Until _worksheet.Cells.Value = ""

有关任何澄清,请通知我。

3 个答案:

答案 0 :(得分:0)

很难理解您到底想达到什么目的,所以我不得不假设您的变量(例如工作表行)已正确定义...

  

此外,您的代码中有一个错误。 .Start不是以下内容的属性   代码中的范围对象(cell.Start.Column - 2)。这将导致   如果您未提供输入数据,我将无法纠正错误   也没有预期的结果。

     

我想您正在尝试将列向右偏移2,但是请根据您要达到的目标进行相应更改

     

.ToString也是如此,这不是VBA中的Range对象方法。除非您在自己的类属性中的某个位置定义了它们,并且没有将其包含在此处的代码中。就像使用偏移一样,听起来好像您正在尝试在此处使用CStr()函数,但是再一次,由于没有预期的输出,我只能在这里猜测。

无论哪种方式,这些都是很小的潜在错误,您应该能够照顾好自己。通常,您的循环应如下所示:

For each cell in worksheetRow
    If IsEmpty(Cell) Then
        Exit For ' this will exit the entire for loop after reachign an empty cell
    End If
    row.Offset(0, -2) = CStr(Trim(cell.Value))
Next cell

如果要跳过空单元格,而不是退出整个for循环,请在单元格中使用第二个dowhile循环作为继续-在此堆栈问题中找到示例:Continue For loop

答案 1 :(得分:0)

有没有。如果该行不包含任何内容,只需删除该行。

这是最终代码。

                For rowNumber As Integer = 1 To _worksheet.Dimension.End.Row
                    Dim worksheetRow = _worksheet.Cells(rowNumber, 2, rowNumber, 4)
                    Dim row As DataRow = _dataTable.Rows.Add()

                    For Each cell In worksheetRow
                        If cell.Value Is Nothing Then
                            row.Delete()
                            GoTo executeInsert
                        Else
                            row(cell.Start.Column - 2) = cell.Value.ToString.Trim()
                        End If
                    Next cell
                Next 

//executeInsert is the connection/insert data method

感谢您的帮助。

答案 2 :(得分:-1)

我不确定,但是也许您可以做类似的事情:

For Each cell In rng
    ' do some stuff
    If myCondition Then GoTo exitFor
 Next cell
 exitFor: