【Excel VBA 编程】第88讲:TextStream与Collection联手精准定位文件位置
- 2026-09-15 03:28:37
【Excel VBA 编程】第88讲:TextStream与Collection联手精准定位文件位置“文件操作的高级编程:在第N行第M个字符后写入内容” 
参考代码如下:以上代码利用 Collection 动态、有序、轻量的特性,先按修改位置将文件拆解并暂存于不同的集合中,然后在内存中完成对目标行的修改,最后再将三个部分(linesBefore、modifiedLine、linesAfter)按原序组装并写入新文件 因此,linesBefore和linesAfter两个集合中存放的元素就非常明确了。在准备的测试数据中,我们要修改的是文件的第2行。在读取文件时,linesBefore 这个集合只用来存放第2行之前的内容,也就是第1行。所以,它里面只存了1行数据 
而集合linesAfter则是存储了从第3行开始所有内容 
执行代码后,成功将文字追加到了第2行第6个字符后面,最终效果如下: 
总是听到或看到有人问,编程好学吗?如何入门?多久能学会?它能做些什么?怎么写代码呀?执行过程中出问题了谁能帮帮我...如果你也有类似的问题那就赶快关注我的公众号,一起学起来吧!
本期是TextStream对象实践,通过具体案例帮助大家巩固所学知识,并拓展思路,学习如何灵活组合其各项属性和方法,以实现更精准、高效的文件操作目标

需求分析
实现需求:在文本文件的特定位置(第N行第M个字符处)追加新内容
例如,在D:\常用文件\test.txt文件的第2行第6个字之后增加新内容,如“ 南宋词人:”

这个需求其实蛮复杂的,没有直接能实现的方法,因为TextStream在写入模式下(ForWriting或ForAppending)的指针控制能力有限。ForWriting模式会清空原文件并从开头写入,而ForAppending模式只能在文件末尾追加
既然不能直来直去,那么就要换一种婉转的方式思考,比如,先读取再修改最后重写的策略,具体做法:
读取:通过TextStream定位到目标行和目标字符位置,并读取该行内容
修改:对读取到的行内容进行修改,在指定字符位置后插入新的文本。例如,在第6个字符后添加新的文字“ 南宋词人:”
重写:将原文件修改前的内容、修改后的行、以及原文件剩余的内容,按顺序写入新文件
接下来就顺着这个思路,编码实现

代码实现
Sub InsertInTheMiddleOfText()Dim fso As Object, readFile As Object, writeFile As ObjectDim targetLine As Integer, targetChar As IntegerDim i As Integer, currentLine As String, allContent As StringDim linesBefore As Collection, linesAfter As CollectionDim lineToModify As String, modifiedLine As String, InsertContent As String'设置添加位置及添加内容targetLine = 2targetChar = 6InsertContent = " 南宋词人:"Set fso = CreateObject("Scripting.FileSystemObject")'第一步:读取并定位Set readFile = fso.OpenTextFile("D:\常用文件\test.txt", ForReading, False, TristateTrue) ' ForReading,Unicode格式Set linesBefore = New CollectionSet linesAfter = New Collection' 读取并保存目标行之前的所有行For i = 1 To targetLine - 1If Not readFile.AtEndOfStream ThenlinesBefore.Add readFile.ReadLineElseMsgBox "文件行数不足,无法定位到第" & targetLine & "行。"readFile.CloseExit SubEnd IfNext i' 读取目标行If Not readFile.AtEndOfStream ThenlineToModify = readFile.ReadLineElseMsgBox "第" & targetLine & "行不存在。"readFile.CloseExit SubEnd If' 读取并保存目标行之后的所有行Do While Not readFile.AtEndOfStreamlinesAfter.Add readFile.ReadLineLoopreadFile.Close'第二步:修改目标行内容If Len(lineToModify) >= targetChar Then' 在第targetChar个字符后插入文本modifiedLine = Left(lineToModify, targetChar) & InsertContent & Mid(lineToModify, targetChar + 1)Else' 如果该行字符数不足,则在行尾追加modifiedLine = lineToModify & Space(targetChar - Len(lineToModify)) & InsertContentEnd If'第三步:回写到新文件,方便验证Set writeFile = fso.OpenTextFile("D:\常用文件\test_updata.txt", ForWriting, True, TristateTrue) '写入模式,文件不存在自动创建,Unicode格式' 写入目标行之前的内容For i = 1 To linesBefore.countwriteFile.WriteLine linesBefore(i)Next i' 写入修改后的目标行writeFile.WriteLine modifiedLine' 写入目标行之后的内容For i = 1 To linesAfter.countwriteFile.WriteLine linesAfter(i)Next iwriteFile.CloseSet writeFile = NothingSet fso = NothingMsgBox "内容已成功添加并保存到新文件!"End Sub



如果以上功能经常要用到,建议把它打包成一个独立的函数。这样后续再用的时候,直接调用这个函数就行了,既方便又省事

结束语
今天的分享就到这里了,咱们下期继续
公众号同时也在不间断地分享免费的编程案例,如果想学习更多的编程知识,无论是用来提升自动化办公效率还是想提升自我,都可以关注我的公众号,解锁更多的VBA技能
本文来自网友投稿或网络内容,如有侵犯您的权益请联系我们删除,联系邮箱:wyl860211@qq.com 。