我有一个Sub
从CSV读取行并将数据输出到Excel表格。或者至少它应该......
我首先清除表并使用此函数删除所有行,但我注意到第一个数据行始终保留。
Sub ClearTableData(ByRef Table As ListObject)
On Error Resume Next
Table.DataBodyRange.Offset(0, 0).Resize( _
Table.DataBodyRange.Rows.Count, _
Table.DataBodyRange.Columns.Count).Rows.Delete
On Error GoTo 0
End Sub
现在我尝试重新填充表格,但事情并不完全正确。 CSV中的第一行正确插入到表的第1行,但之后,CSV中的所有行都插入到表的下方,一行接着另一行。
我在下面的代码后插入了一个屏幕截图,以显示正在发生的事情。如何将CSV数据正确输出到表格中?
Sub UpdateTableData(ByRef Table As ListObject, ByVal resultsFileName As String)
Dim BackupResults As Integer ' Dummy to loop through the backup results file
Dim thisLine As String ' The current line being read from the backup results file
Dim newRow As ListRow ' The new table row to use
BackupResults = FreeFile()
Open resultsFileName For Input As #BackupResults ' Open the backup results file
While Not EOF(BackupResults)
Line Input #BackupResults, thisLine ' Grab the current line from '#BackupResults'
Set newRow = Table.ListRows.Add ' Add a new table row
Dim rowNum As Integer
rowNum = Table.DataBodyRange.Rows.Count ' Set the row number to output this line to
Dim parts() As String
parts = Split(thisLine, ",") ' Split 'thisLine' into invidual parts
Dim part As Variant
Dim colNum As Integer: colNum = 1
For Each part In parts ' Loop through all 'parts' and output it to the correct table column
If Trim(part) <> "" Then
newRow.Range.Cells(rowNum, colNum).Value = Trim(part) ' Output the 'part' to its cell
colNum = colNum + 1
End If
Next
Wend
Close #BackupResults ' Close the backup results file
Set newRow = Nothing ' Destroy the 'newRow' object
End Sub
答案 0 :(得分:1)
假设从仅包含标题的表开始,第一个Set newRow = Table.ListRows.Add
将在表中添加一个新的空行。 rowNum = Table.DataBodyRange.Rows.Count
则为1.因此newRow.Range.Cells(rowNum, colNum).Value = Trim(part)
会将数据放入newRow
的第1行。第1行是newRow
本身。
第二个Set newRow = Table.ListRows.Add
将再次向表中添加一个新的空行。然后rowNum = Table.DataBodyRange.Rows.Count
将为2.因此newRow.Range.Cells(rowNum, colNum).Value = Trim(part)
会将数据放入newRow
的第2行。这是newRow
下方的一行。对于Set newRow = Table.ListRows.Add
的第三次,第四次,第n次出现,情况将进一步发展。
所以结果将是你所看到的。第1行正确,然后是新添加的行和下面的数据。
代码中的newRow
已经是一个新的空行。所以rowNum
不是必需的。
newRow.Range.Cells(1, colNum).Value = Trim(part)
会将您的数据放入Range
newRow
newRow
的第一行的colNum中,这是String()
本身。