VBA提高篇_12 文本文件逐行读取,输入输出操作自如

本文介绍了如何使用VBA在Excel中处理文本文件,包括4步打开文本文件、读取内容到Excel、使用OpenForOutput和OpenForAppend进行写操作,以及结合DoWhile和EOF判断文件末尾的技巧。还提供了具体的代码示例,如读取以特定词开头的行、打印文件和循环工作表输出数据。

一、VBA打开文本文件的4步操作

在这里插入图片描述

  1. 打开文本文件
  • 找到指定文件并调入内存
打开指定文件 Open

Open   "文件详细路径"  	 For    Input/Output    As   #1
打开   指定文件		为了	输入 / 输出  	代号  1	
  1. 读取一行内容
  • 将每行视作一个字符串
Line    Input   #1,  s
读取一   输入	1号	作为字符串
行文本		   文件 保存到s中

vba的顺序读写模式:

  • 每执行一次Line input ,
  • 就自动向下读取新的一行,
  • 不能向回读取已经读取过的内容
Do While 尚未到达文件末尾
	Line Input #1,s
	Cell(i,1) = s
	i = i + 1
Loop
  1. 是否已到末尾?
  • 如果是末尾就不再读取
EOF 是 End of File 的缩写
EOF(n) = True/False 判断代号n是否读到了文件末尾

用逻辑变量做判断 False 可以直接写成Not EOF,True 直接写成Not EOF,具体看后边示例

4.关闭文件文件

  • 保存文件,清理内存
Close #1
'不关闭文件,则之前写入的数据可能无法真正保存到该文件中

二、文本输入Excel示例

Sub  readText()
     Open   "D:\demo\客户信息.txt"  For Input/Output   As  #1
     i = 1
     Do While  Not EOF(1)   '尚未到达文件末尾
   		Line Input #1,s
   		
   		If Left(s,2) ="北京" Then  ' 判断以北京开头的每行操作/否则不操作
   			Cell(i,1) = s
   			i = i + 1
   		End If
     Loop
   
   Close #1

End Sub

三、 Excel输出文本示例

3.1 Open For Output

打开指定文件并向其中写入数据
如果已经有同名文件,则将其内容全部清空覆盖
如果当前硬盘上没有这个文件,就新建此文件

3.2 Open For Append

打开指定文件并向其中 <<追加>> 数据
如果已经有同名文件,则保留其内容,并<<追加>>写入
如果当前硬盘上没有这个文件,就新建此文件

3.3 Print 打印文件

Sub WriteText()
    Dim i As Integer
    Open "d:\部门名单-1.txt" For Output As #1
    
    Print #1, Trim(Cells(3, 2)); '末尾有分号代表输出不换行
    Print #1, Trim(Cells(3, 3))  '末尾空白代表输出默认换行
    Print #1, Trim(Cells(4, 2))
    Print #1, Trim(Cells(4, 3))
    
    Close #1  '不关闭文件,则之前写入的数据可能无法真正保存到该文件中
End Sub

3.4 工作簿 循环工作表 循环输出文件

Sub writeTxt()
    Dim s As String, i As Long
    Dim w As Worksheet
    
    '打开指定文件(若无此文件则创建)。若已经存在该文件,
    '则之前内容全部清除。改为 For Append 可保留之前内容。
    Open "d:\demo\部门名单汇总.txt" For Output As #1
    
    '扫描每一张工作表
    For Each w In Worksheets
    
    '每张工作表从第3行开始扫描每一行
        i = 3
    
        Do While Trim(w.Cells(i, 2)) <> ""
        
        '将每一行的B列和C列内容写入文本文件,中间用一个破折号隔开
        '三个字符串之间是分号隔开,所以输出在同一行。而最后一个字符
        '后面没有任何符号,所以下一次执行Print时将换行输出。
         
            Print #1, w.Cells(i, 2); "--"; w.Cells(i, 3)
            
            i = i + 1
        Loop
    Next w

    '关闭文件,非常重要!否则可能造成数据丢失!
    Close #1

End Sub

四 、先输入后输出 Demo实战演练

Sub readAndWrite()
    Dim s As String
    '1.0读取
    '打开文件
    Open "d:\残本1.txt" For Input As #1
    Open "d:\残本2.txt" For Input As #2
   
    
    i = 3
     '读取文件
    ' #1和 #2是否末尾
    Do While Not EOF(1) Or Not EOF(2)
        If (i And 1) = 1 Then Line Input #1, s
        If (i And 1) = 0 Then Line Input #2, s
    
        Cells(i, 2) = s
        i = i + 1
    Loop
    
    '关闭文件
    Close #1, #2
    
    '2.0写出
    i = 3
    Open "d:\残本3.txt" For Output As #3
    
    Do While Cells(i, 2) <> ""
        s = Cells(i, 2).Value
        Print #3, s
        i = i + 1
    Loop
    
    Close #3
End Sub



### 如何使用 VBA 和 ADODB.Stream 实现逐行读取文本文件 通过 `ADODB.Stream` 对象可以实现高效地读取和写入文件的功能。以下是基于所提供的引用内容以及专业知识,展示如何使用 VBA 和 `ADODB.Stream` 来逐行读取文本文件。 #### 示例代码及解析 ```vba Sub ReadTextFileLineByLine(filePath As String, Optional charset As String = "utf-8") Dim streamObj As Object Set streamObj = CreateObject("ADODB.Stream") ' 打开 Stream 对象设置属性 With streamObj .Type = 2 ' 设置为文本流模式 .Mode = 3 ' 可读可写模式 If Len(charset) > 0 Then .Charset = charset ' 指定字符集编码,默认 utf-8 End If .Open ' 打开源文件 .LoadFromFile filePath ' 加载目标文件到内存中 End With ' 初始化变量用于存储每一行的内容 Dim lineContent As String Do While Not streamObj.EOS ' EOS 表示是否到达流的末尾 lineContent = streamObj.ReadText(-2) ' -2 参数表示读取至下一行结束符前的位置 Debug.Print lineContent ' 将每行内容打印到立即窗口(Immediate Window) ' 如果需要进一步处理当前行数据,则在此处添加逻辑 ' 移动指针到下一行起始位置 streamObj.SkipLine Loop ' 关闭资源释放对象 streamObj.Close Set streamObj = Nothing End Sub ``` --- #### 解析 1. **创建 `ADODB.Stream` 对象** 创建一个 `ADODB.Stream` 对象实例化后赋给变量 `streamObj`[^1]。 2. **配置对象属性** 配置 `.Type` 属性为 `2`,代表以文本方式操作;`.Mode` 设为 `3`,即允许读写访问[^2]。如果需要支持特定编码格式,可以通过 `.Charset` 属性指定编码类型,例如 UTF-8 或 GBK 编码[^3]。 3. **加载文件** 调用方法 `.LoadFromFile` 将外部文件的数据加载到该流对象内部缓冲区中[^4]。 4. **逐行读取** 利用循环结构配合条件判断语句检测是否已达到文件结尾 (`EOS`)。每次调用 `.ReadText(-2)` 方法获取从当前位置直到下一个换行符之间的全部字符作为单独的一行输出。之后执行 `.SkipLine` 命令跳转到下一新行起点继续迭代过程直至完成整个文档扫描工作为止。 5. **清理与关闭** 完成所有操作以后记得及时调用 `.Close` 方法释放占用资源,销毁对象本身以便程序能够正常退出运行状态。 --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

pigerr杨

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值