Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >VBA按行读取csv文件与分割合并

VBA按行读取csv文件与分割合并

作者头像
林万程
发布于 2018-06-26 09:22:04
发布于 2018-06-26 09:22:04
4.2K00
代码可运行
举报
运行总次数:0
代码可运行

'2017年2月1日05:43:35 '16年想开发的最后一个Excel代码经过漫长的酝酿与研究终于编写完毕,解决了超过一百万行的csv文件Excel打不开的问题,自动分割为多个sheet,并且数字超过15位不会后面全是0。 '也可以用于平常打开csv文件,速度比直接打开快一倍,还可以用于指定行数分割,多文件合并,csv批量转Excel。 ' '顺道普及:csv文件就是用逗号分隔的数据表,有回车或逗号的文本还有长数字用两个"包围(连续两个表示"本身) 'xlsx文件大小约csv的50%,打开时间约csv的30%,xlsx压缩可能变大,csv压缩后不到10%。

Sub csv分割合并() selectfiles = Application.GetOpenFilename("," & ".", , "打开", , True) '选择文件 If TypeName(selectfiles) = "Boolean" Then '若未选择则结束程序运行 Exit Sub End If

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
关闭功能
st = Time

spt = [A5]
Ln = [B5]
If spt = "" Then spt = ","
If Not (Ln > 0) Then Ln = 1048576 '用Not是为了包括非数值

Workbooks.Add
li = 2

For Each fp In selectfiles
    
    Set FileObj = CreateObject("Scripting.FileSystemObject")
    Set TextObj = FileObj.OpenTextFile(fp) '定义对象,不耗时
    
    If Not TextObj.AtEndOfLine Then '记录并写入第一个标题行
        TitleText = Split(TextObj.Readline, spt)
        [A1].Resize(1, UBound(TitleText)) = TitleText '在合并工作表时也只是替代第一行
    End If
    
    Do While Not TextObj.AtEndOfLine
        If li > Ln Then '达到一定值新建表
            Sheets.Add
            [A1].Resize(1, UBound(TitleText)) = TitleText
            li = 2
        End If
        Text = Split(TextObj.Readline, spt) '读取行并分割
        Cells(li, 1).Resize(1, UBound(Text)) = Text '测试15位以上数值会保留
        '用时:UBound()<变量<数字,用数组给区域赋值比循环快五六倍左右
        '原先有数值会增加一倍时间,跟直接打开相等
        li = li + 1
    Loop
Next
Debug.Print (Time - st) * 24 * 60 * 60
开启功能

End Sub

Sub csv转xlsx() selectfiles = Application.GetOpenFilename("," & ".", , "打开", , True) '选择文件 If TypeName(selectfiles) = "Boolean" Then '若未选择则结束程序运行 Exit Sub End If

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
关闭功能
st = Time

spt = [A5]
Ln = 1048576
If spt = "" Then spt = ","
If Not (Ln > 0) Then Ln = 1048576 '用Not是为了包括非数值

For Each fp In selectfiles
    
    Set FileObj = CreateObject("Scripting.FileSystemObject")
    Set TextObj = FileObj.OpenTextFile(fp) '定义对象,不耗时
    
    Workbooks.Add
    li = 2
    
    If Not TextObj.AtEndOfLine Then '记录并写入第一个标题行
        TitleText = Split(TextObj.Readline, spt)
        [A1].Resize(1, UBound(TitleText)) = TitleText '在合并工作表时也只是替代第一行
    End If
    
    Do While Not TextObj.AtEndOfLine
        If li > Ln Then '达到一定值新建表
            Sheets.Add
            [A1].Resize(1, UBound(TitleText)) = TitleText
            li = 2
        End If
        Text = Split(TextObj.Readline, spt) '读取行并分割
        Cells(li, 1).Resize(1, UBound(Text)) = Text '测试15位以上数值会保留
        '用时:UBound()<变量<数字,用数组给区域赋值比循环快五六倍左右
        '原先有数值会增加一倍时间,跟直接打开相等
        li = li + 1
    Loop
    Debug.Print (Time - st) * 24 * 60 * 60
    ActiveWorkbook.SaveAs Left(fp, InStrRev(fp, ".") - 1) & ".xlsx" '保存需要一倍的时间
    ActiveWorkbook.Close 0
Next
Debug.Print (Time - st) * 24 * 60 * 60
开启功能

End Sub

Function 文件打开计时器() selectfiles = Application.GetOpenFilename("," & ".", , "打开", , True) '选择文件 If TypeName(selectfiles) = "Boolean" Then '若未选择则结束程序运行 Exit Function End If 关闭功能 st = Time

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
For i = 1 To UBound(selectfiles)
Set wb = Workbooks.Open(selectfiles(i))
wb.Close 0 '不保存关闭约1.4e-11s可忽略不计
Next

Debug.Print (Time - st) * 24 * 60 * 60
开启功能

End Function

Sub 关闭功能() '关闭一些功能加快 VBA 宏的运行速度 ' On Error Resume Next '出错继续运行 ' Application.DisplayAlerts = False '禁用警告信息 ' Application.DisplayAlerts = True '启用警告信息 Application.ScreenUpdating = False '禁用屏幕更新 Application.DisplayStatusBar = False '禁用状态栏 Application.Calculation = xlCalculationManual '切换到手动计算-4135,如果中途需要计算时用Calculate Application.EnableEvents = False '禁用事件 ActiveSheet.DisplayPageBreaks = False '禁用本表分页符 End Sub

Sub 开启功能() '开启关闭的功能,调试中断可运行开启功能 Application.ScreenUpdating = True '启用屏幕更新 Application.DisplayStatusBar = True '启用状态栏 Application.Calculation = xlCalculationAutomatic '切换到自动计算-4105 Application.EnableEvents = True '启用事件 'ActiveSheet.DisplayPageBreaks = displayPageBreaksState '启用本表分页符 End Sub

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2017.02.02 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
导入文本(txt文件)的VBA代码
fileName = Application.GetOpenFilename("Excel 文件 (*.txt),*.txt")
但老师
2022/03/22
2.2K0
导入文本(txt文件)的VBA代码
VBA导入
Sub 手动导入表() selectfiles = Application.GetOpenFilename("," & ".", , "打开", , True) '选择文件 If TypeName(selectfiles) = "Boolean" Then '若未选择则结束程序运行 Exit Sub End If 关闭功能 For fi = 1 To UBound(selectfiles) Call 导入表(selectfiles(fi), 路径文件名(selectfiles(fi))) N
林万程
2018/06/21
2.6K0
VBA字典(详解,示例)「建议收藏」
如果对上面水果种类进行计数:countifs,只需要将分类汇总的值改为数值1即可,每出现一次‘+1’
全栈程序员站长
2022/07/22
6.6K1
VBA字典(详解,示例)「建议收藏」
Excel应用实践10:合并多个工作簿中的数据
我有超过50个具有相同格式的Excel文件,它们的列标题相同,并且都放置在同一文件夹,有什么快速的方法将它们合并到一个单独的Excel文件的一个工作表中?
fanjy
2019/07/19
2.5K0
VBA 发票数据解析
本小程序只适用于,解析TXT文件中保存的发票扫码结果数据! 活不多说!直接上源码: ''********************************************************
办公魔盒
2019/08/01
1.3K0
VBA 发票数据解析
Application主程序对象方法(三)
大家好,上节介绍了Application主程序对象的onkey方法和inputbox方法,本节将介绍GetOpenFilename方法。
无言之月
2019/10/13
1.7K0
VBA用字典批量查找社保数据
【问题】我们知道社保导出的数据是很多合并的单元格,如果要查找一个数据都要找很久,如果数量多了更多费时,基于以上问题,特用VBA设计一个批量查找的程序。
哆哆Excel
2022/10/25
7620
VBA用字典批量查找社保数据
Excel VBA编程
在Excel中,数据只有文本,数值,日期值,逻辑值和错误值五种类型。但是在VBA中,数据类型跟Excel不完全相同。根据数据的特点,VBA将数据分为布尔型(boolean),字节型(byte),整数型(integer),单精度浮点型(single),双精度浮点型(double),货币型(currency),小数型(decimal),字符串型(string),日期型(date),对象型等等
全栈程序员站长
2022/08/11
47.3K0
Excel VBA编程
一起学Excel专业开发21:Excel工时报表与分析系统开发(3)——自定义用户界面
一起学Excel专业开发20:Excel工时报表与分析系统开发(3)——自定义用户界面
fanjy
2019/11/07
2.1K0
一起学Excel专业开发21:Excel工时报表与分析系统开发(3)——自定义用户界面
[网友投稿] Excel数据批量写入Word
前言:这是 VBA说 微信公众号借助我的这个平台给大家分享的一篇关于Excel与Word交互的文章,希望对大家有帮助。在这里,欢迎大家投稿,与更多的人分享有用的知识。
fanjy
2019/10/09
3.6K0
[网友投稿] Excel数据批量写入Word
合并多个工作簿
很多时候,我们都有将多个工作簿合并成一个工作簿的需求。当然,根据需求的不同,合并工作簿的代码会有差异。在完美Excel中给出过多个合并工作簿的示例,有兴趣的朋友可以查阅历史文章。
fanjy
2024/02/21
3460
合并多个工作簿
VBA代码:将多个文本文件合并到当前工作表
下面分享在vbaexpress.com中收集的几段代码,用于合并文本文件并将其放置在当前工作表中。
fanjy
2024/06/04
3290
VBA代码:将多个文本文件合并到当前工作表
Excel多工作薄合并
今天要给大家介绍一下Excel多工作表合并的技巧! 由于Excel工作薄文件可以包含多个工作表,所以合并起来要比Word麻烦! 目前还无法单纯通过Excel界面的菜单工具做到,不过经过小魔方的反复研究,目前找到了三种合并的方法! 插件工具(OIIO) VBA代码(别害怕,复制黏贴就行,不用自己写) 数据透视表 由于数据透视表操作步骤相对比较繁琐,以后出数据透视表的教程时会专门来讲。 今天就给大家讲解前两种方法: 第三方插件(OIIO): ▼ ♢打开要存放的目标工作薄,点击OIIO效率专家——文件合并——合并
数据小磨坊
2018/04/10
1.4K0
Excel多工作薄合并
ExcelVBA汇总-多簿一表_to_一簿一表
哆哆Excel
2023/09/09
3120
ExcelVBA汇总-多簿一表_to_一簿一表
VBA: 多份文件的批量顺序打印(2)
文章背景:测试仪器的数据有些会以Excel文件的形式保存,工作量大时测试员会选中多份文件进行批量打印,同时可能需要删除一些无需打印的测试数据(比如空白样,错误数据等)。现在以批量打印Excel文件(.xlsx格式)为例,采用VBA编程,进行任务的实现。
Exploring
2022/09/20
1.5K0
VBA:  多份文件的批量顺序打印(2)
Vba菜鸟教程[通俗易懂]
官方文档:https://docs.microsoft.com/zh-cn/office/vba/api/overview/language-reference 代码完成后:工具-vbaproject属性-保护-查看时锁定-密码
全栈程序员站长
2022/09/05
18K0
Vba菜鸟教程[通俗易懂]
Excel应用实践11:合并多个工作簿中的数据——示例2
在上一篇文章《Excel应用实践10:合并多个工作簿中的数据》中,我们使用代码快速合并超过50个Excel工作簿文件,然而,如果要合并的工作簿中工作表的名称不相同,但位于每个工作簿的第1个工作表;并且,要在合并后的工作表的第1列中输入相对应的工作簿文件名,以便知道合并后的数据来自哪个工作簿文件。
fanjy
2019/07/19
3K0
R语言︱用excel VBA把xlsx批量转化为csv格式
笔者寄语:批量读取目前看到有以下几种方法:xlsx包、RODBC包、批量转化成csv后读入。本章来自博客:http://www.cnblogs.com/weibaar/p/4506144.html
悟乙己
2019/05/27
2.6K0
VBA收藏一常用的自定义函数
Sub 测试() If IsFileExists("D:\new_temp\") Then Debug.Print "存在" Else Debug.Print "不存在" End If End Sub '参数名称 含义 说明 'strShtName 指定工作表名称 必选 'strWbName 指定工作簿名称 可选 'Sub Demo() ' Debug.Print udfSheetExists("Sheet1") ' Debug.Print udfSheetExist
哆哆Excel
2022/10/25
6310
VBA收藏一常用的自定义函数
合并/拆分 Excel?Python、VBA轻松自动化
当你收集了 n 个人的 EXCEL 记录表,需要将它们汇成一个总表时你会怎么做呢? 如果不通过技术手段,要一个个打开再复制粘贴也太麻烦了吧! 此时就需要一个通过几秒钟的点击就能完成合并的工具。
朱小五
2020/10/09
2.5K0
合并/拆分 Excel?Python、VBA轻松自动化
相关推荐
导入文本(txt文件)的VBA代码
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验