我需要能够遍历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循环遍历每个单元格。因此,在找到的第一个空单元格上,它将继续到下一个空单元格,依此类推。
这是插入表中的结果。
直到第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 = ""
有关任何澄清,请通知我。
答案 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: