总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
上一期我们利用ListObjects对象创建了一张名为“MyTables”结构化表格“销售表”,接下来继续分享其使用:将CSV文件中数据导入到该结构化表格中
1 效果展示
实现功能:CSV数据的自动导入功能。执行代码后,根据提示信息选择要导入的CSV文件,程序便会自动读取该文件A到D列的内容,最终导入到名为“MyTables”结构化表格“销售表”
需要注意:创建结构化表格时,E列已预设计算公式,数据导入后将自动完成运算,无需人工干预,因此最终展现的是5列数据
2 代码及说明
2.1 操作步骤
打开你的.xlsm文档
按下 Alt + F11 快捷键,打开VBA编辑器
回到Excel界面,会看到“销售表”中历史数据被删除,同时将CSV文件数据全部导入
2.2 代码实现
代码虽然有点长,但整体思路还算清晰,共分为以下几步操作
通过GetOpenFilename获取CSV文件信息
在读取CSV过程中,提取或筛选出我们所需的A至D列(即CSV文件中的前四列)数据。由于CSV文件的本质是以纯文本形式存储的表格数据,其核心规则就是使用特定的分隔符(最常见的是逗号)来区分同一行中的不同数据字段(列),因此,使用split函数并指定逗号作为分隔符
将处理好的数据写入到当前工作簿中名为“MyTables”的表格(Table)的DataBodyRange(数据体区域)中
Sub ExportCSVToMyTables()Dim fso As ObjectDim filePath As StringDim lineText As StringDim dataArray() As StringDim dataCollection As CollectionDim itemArray(1 To 4) As Variant ' 用于存储每行的A~D列Dim finalData() As VariantDim i As Long, j As Long, rowIndex As LongDim targetSheet As WorksheetDim myTable As ListObjectOn Error GoTo ErrorHandlerApplication.ScreenUpdating = False' 选择CSV文件filePath = Application.GetOpenFilename("CSV Files (*.csv), *.csv", , "选择数据源文件")If filePath = "False" Then Exit Sub'读取并处理CSV文件Set dataCollection = New CollectionOpen filePath For Input As #1rowIndex = 0Do While Not EOF(1)Line Input #1, lineTextrowIndex = rowIndex + 1dataArray = Split(lineText, ",")' 提取A~D列(前四列)。如果某行列数不足,用空值填充For j = 1 To 4If UBound(dataArray) >= (j - 1) ThenitemArray(j) = dataArray(j - 1)ElseitemArray(j) = ""End IfNext j' 将本行数据加入集合(跳过表头,假设第一行是表头)If rowIndex > 1 ThendataCollection.Add Array(itemArray(1), itemArray(2), itemArray(3), itemArray(4))End IfLoopClose #1' 将集合转换为二维数组,便于写入If dataCollection.Count > 0 ThenReDim finalData(1 To dataCollection.Count, 1 To 4)For i = 1 To dataCollection.CountFor j = 1 To 4finalData(i, j) = dataCollection(i)(j - 1)Next jNext iElseMsgBox "CSV文件中未找到有效数据(除表头外)。", vbInformationExit SubEnd If' 定位“MyTables”表格并写入数据Set targetSheet = ThisWorkbook.Worksheets("销售报表") ' 根据实际情况修改工作表名称Set myTable = targetSheet.ListObjects("MyTables")If myTable Is Nothing ThenMsgBox "当前工作簿中未找到名为‘MyTables’的表格。请检查表格名称是否正确。", vbCriticalExit SubEnd If' 清空旧数据If Not myTable.DataBodyRange Is Nothing Then'myTable.DataBodyRange.ClearContentsmyTable.DataBodyRange.Columns(1).Resize(, 4).ClearContentsEnd If' 写入新数据If dataCollection.Count > 0 ThenmyTable.HeaderRowRange.Offset(1, 0).Resize(UBound(finalData, 1), UBound(finalData, 2)).Value = finalDataEnd IfApplication.ScreenUpdating = TrueMsgBox "数据已成功从CSV文件导出至‘MyTables’表格!共导入 " & dataCollection.Count & " 行数据。", vbInformationExit SubErrorHandler:Application.ScreenUpdating = TrueMsgBox "运行时错误 " & Err.Number & ": " & Err.Description & vbCrLf & "请检查文件路径、格式及表格名称。", vbCriticalEnd Sub
大家可以根据提供的代码,依葫芦画瓢进行数据导入操作了,前提是已经创建了结构化表格,创建过程参考上一期内容:【Excel VBA编程】ListObject对象:实现自动化流水线的理想载体
3 结尾
好了,今天的编程知识到此结束了,又到每日分享冷知识的时间了
今天分享的是就是CSV了:大家可能想不到,CSV格式的雏形比个人电脑的出现还早至少10年。其概念最早可追溯至1967年,在运行于OS/360环境下的IBM Fortran编译器中就已支持类似的列表方式输入/输出
本公众号一直在不间断地分享免费的编程案例和实用技巧。无论您是用来提升自动化办公效率还是想提升自我,请关注我的公众号,解锁更多的编程知识