将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()
的用法,但这很好地解决了问题。