如何使用VBA从Notepad++全选CSV数据并复制到Excel且保留前导零
VBA实现CSV导入保留前导零方案
原代码存在的问题
CreateObject("shell.application").Open只是调用系统默认程序打开文件,无法直接获取Notepad++内的文本内容file_name是Dir函数返回的文件名字符串,不存在readall方法,运行会直接触发类型错误- 缺少全选复制、粘贴、分列、校验的核心逻辑
可直接运行的实现代码
完全匹配你手动操作的流程,所有字段默认保留文本格式,不会丢失前导零:
Sub 导入CSV保留前导零() Dim newWb As Workbook Dim file_path As String, file_name As String Dim notePadPath As String ' ------------- 配置参数,可根据实际情况修改 ------------- notePadPath = "C:\Program Files\Notepad++\notepad++.exe" ' 你的Notepad++安装路径 file_path = "C:\Users\User Name\Desktop\" ' CSV文件存放路径 ' ------------------------------------------------------ ' 1. 新建工作簿,所有单元格预设置为文本格式 Set newWb = Workbooks.Add newWb.Sheets(1).Cells.NumberFormat = "@" ' 2. 匹配目标CSV文件 file_name = Dir(file_path & "Inquiries*") If file_name = "" Then MsgBox "未找到匹配的CSV文件", vbExclamation Exit Sub End If ' 3. 用Notepad++打开目标CSV文件 Shell """" & notePadPath & """ """ & file_path & file_name & """", vbNormalFocus ' 等待Notepad++加载完成,电脑性能差可以把等待时间调长 Application.Wait Now + TimeValue("00:00:02") ' 4. 发送快捷键全选、复制CSV内容 SendKeys "^a", True ' 全选 SendKeys "^c", True ' 复制 Application.Wait Now + TimeValue("00:00:01") ' 5. 切回Excel粘贴内容 AppActivate newWb.Name newWb.Sheets(1).Range("A1").Select SendKeys "^v", True ' 粘贴 Application.Wait Now + TimeValue("00:00:01") ' 6. 执行分列功能,默认所有列设为文本格式 ' 有多少列就加多少个Array(列序号, xlTextFormat)即可 newWb.Sheets(1).Columns("A:A").TextToColumns _ Destination:=Range("A1"), _ DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, _ Comma:=True, _ FieldInfo:=Array(Array(1, xlTextFormat), Array(2, xlTextFormat), Array(3, xlTextFormat)) ' 7. 校验步骤:清空内容后重新粘贴,确认绿色三角标识正常显示 newWb.Sheets(1).Cells.Clear SendKeys "^v", True MsgBox "导入完成,所有字段前导零已保留", vbInformation End Sub
注意事项
- 如果CSV分隔符不是逗号,修改
TextToColumns中的分隔符参数即可 - 不想依赖Notepad++的话,也可以用ADODB.Stream直接读取CSV文本内容逐行写入,稳定性比SendKeys更高,也能100%保留前导零
内容的提问来源于stack exchange,提问作者bgado
相关产品推荐
相关产品推荐

