前几天同事妹子突然在群里@我,问我懂不懂宏,她经常都要把导出来的一堆csv格式数据导入到同一个Excel里处理、保存。然后我就帮她写了个宏,但是她又不懂怎么用
于是就有了上一篇推文【office技巧】宏。
原本给她写的是通过【打开一个CSV,复制到ActiveSheet里。接着打开下一个CSV】循环。
但有个缺点:默认情况下CSV用Excel直接打开,长串数字会自动转成科学记数法存储,而且过长的后面全部变成0000了。。。
于是昨晚又彻夜不眠地改了一个通用型的版本,V2.0,哈哈哈。
1、宏代码
这个功能通过宏来实现,分两种模式:
1、导入到Excel的同一个工作表中;
2、导入到Excel的不同工作表,并以CSV名称命名sheet
Sub ImportMultiCSV()
Application.ScreenUpdating = False
Dim myFile$, myPath$, i Arraycol myArray() As Integer, independent/p>
With Application.FileDialog(msoFileDialogFolderPicker)
.Title = "选择目标文件夹"
If .Show = -1 Then
myPath = .SelectedItems(1)
Else
Exit Sub
End If
End With
myPath = myPath & "\"
myFile = Dir(myPath & "*.csv")
Arraycol = InputBox("导入的csv有几列:")
'myAPP.Visible = True '是否显示打开文档
ReDim myArray(Arraycol)
For i = 0 To Arraycol
myArray(i) = 2 '或xlTextFormat
Next
independent = MsgBox("『模式1』:导入到一张表=是" & Chr(10) & "『模式2』:分开各表=否", vbYesNo) 'Yes=6, No=7
i = 0
Do While myFile <> ""
If independent = 7 Then 'Split
Set sh = Sheets.Add(, Sheets(Sheets.Count))
Else
Set sh = ActiveSheet
End If
With sh.QueryTables.Add(Connection:="TEXT;" & myPath & myFile _
, Destination:=sh.Cells(i + 1, 1))
.TextFileParseType = xlDelimited
.TextFileCommaDelimiter = True
.TextFileColumnDataTypes = myArray
.Refresh
End With
If independent = 7 Then 'Split
sh.Name = Left(myFile, Len(myFile) - 4)
Else
If i > 0 Then ActiveSheet.Rows(i + 1).Delete 'delete title
i = ActiveSheet.Cells(ActiveSheet.Rows.Count, 1).End(3).Row 'update to newest end row
End If
myFile = Dir
Loop
Application.ScreenUpdating = True
MsgBox ("全部加载完毕!")
End Sub
2、使用教学
例如我要将【新建文件夹】内的CSV全部导入:
傻瓜式步骤:
静态步骤:
然后选择导入的CSV数据有多少列(如原始列数有n列,则输入>=n的数字都可以。例如我的素材有8列,则输入8或以上数字都可以):
『模式1』所有CSV数据汇总在同一个sheet中。
『模式2』每个CSV各自成一个sheet。
『模式1』结果:
『模式2』结果:
3、动图演示
结束语
本次的【宏】可以运用到CSV、TXT在内的所有文本格式数据导入,只要将代码里的〖*.csv〗改成〖*.txt〗就行了。
原创不易,转载请保留出处。