将CSV输出到Excel表格

时间:2015-07-02 11:42:10

标签: excel csv

我有一个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

What is currently happening

1 个答案:

答案 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()本身。