将CSV输出到Excel表格

将CSV输出到Excel表格,excel,csv,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, _ Tab

我有一个
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
子UpdateTableData(ByRef表作为ListObject,ByVal resultsFileName作为字符串)
Dim BackupResults作为Integer“虚拟对象在备份结果文件中循环
Dim thisLine As String“从备份结果文件中读取的当前行
Dim newRow As ListRow'要使用的新表行
BackupResults=FreeFile()
以#BackupResults'打开备份结果文件的形式打开输入的结果文件名
而不是EOF(备份结果)
行输入#BackupResults,此行“从#BackupResults”获取当前行”
Set newRow=Table.ListRows.Add“添加新表行”
将rowNum设置为整数
rowNum=Table.DataBodyRange.Rows.Count'设置要将此行输出到的行号
将部分()设置为字符串
零件=拆分(thisLine,“,”)将“thisLine”拆分为两个零件
变光零件
Dim colNum作为整数:colNum=1
对于零件中的每个零件,循环遍历所有零件,并将其输出到正确的表列
如果修剪(部分)”,则
newRow.Range.Cells(rowNum,colNum).Value=Trim(part)'将“part”输出到其单元格
colNum=colNum+1
如果结束
下一个
温德
关闭#BackupResults'关闭备份结果文件
Set newRow=Nothing'销毁“newRow”对象
端接头

假设从一个只有标题的表开始,第一个
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行。这是
新行下方的一行。第三次、第四次、第n次出现的
Set newRow=Table.ListRows.Add也将是这种情况

所以结果就是你所看到的。第1行更正,然后添加n个新的行及其下面的数据


代码中的
newRow
已经是一个新的空行。因此,
rowNum
是不必要的

newRow.Range.Cells(1, colNum).Value = Trim(part)

将您的数据放入第一行的列中,放入您的
新行的
范围,即
新行的
本身。

为什么不使用标准Excel数据->从文本导入功能?此外,Range.ClearContents可能很方便(而不是Rows.Delete)。您无法将数据导入到表中,因此,除了删除数据行,我每次都必须使用数据创建一个新表,这似乎是一项更大的工作。如果我错了,请纠正我…通常将CSV文件导入Excel很容易。即使不使用任何VBA,也可以单击CSV文件并选择“使用Excel打开”选项,将数据输入Excel工作表。此外,如果需要,还可以使用导入规范通过VBA执行文本文件导入(但CSV情况下很可能不是这样)。使用宏录制器构建一个proto,然后润色Sub。请问候,代码中的
newRow
已经是一个新的空行了。因此,
rowNum
是不必要的。尝试
newRow.Range.Cells(1,colNum).Value=Trim(part)'将“part”输出到其单元格中
@AlexBell-是的,这很简单,但不能满足我的需要。例如,我希望使用的表是命名的,几个单元格引用该表以向用户显示某些数据。为我的scarario使用导入数据方法只会让事情变得更困难。谢谢,这正是我需要的。我误解了
Cells()
的用法,但这很好地解决了问题。