Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 2983|回复: 5

[已解决]逐行读取txt程序报错,超出文件尾

[复制链接]
发表于 2016-8-16 11:12 | 显示全部楼层 |阅读模式
我想要在一个文本文件中直接搜索某些字符,如WDO1,WDO2出现的第一次行号,WAVE第二次出现的行号,并对该行的数据进行部分修改(如WDO1第一次出现的行,从11位字符修改7位字符,改为6666.00)不想将txt导入excel中,而是直接对txt进行操作.目前想先找到WDO1出现的行号,程序运行报错,输入超出文件尾,不太明白为什么这样,请高手帮帮忙~~~

Sub sacinp()

Set fs = CreateObject("scripting.filesystemobject")
Set a = fs.opentextfile("E:\系统\Desktop\实习\VB\" & Sheets(2).Cells(2, 15).Value)
Dim j, k, WD1 As Integer
Dim WDO1
Dim cnt As String
b = a.readall
k = UBound(Split(b, Chr(13) & Chr(10)))
j = 1
  Do While Not a.AtEndOfLine
   cnt = a.readline
   If InStr(cnt, Cells(4, 15).Value, 1) <> 0 Then
    WDO1 = cnt
    WD1 = j
   Else
   End If
   j = j + 1
  Loop
  MsgBox j
End Sub

最佳答案
2016-8-16 12:06
下面这段是找第一个出现的 WDO1 ,然后修改该行第11个字符开始的7个字符为 6666.00,然后保存。
其它的你自己琢磨下。
你的问题应该在于找到WDO1后,没有退出循环。
所以,程序继续寻找WDO1,找到后,记录的行号肯定是不一样的了。
  1. Sub sacinp()
  2. On Error Resume Next
  3. Dim Fs, a, b, fPath$
  4. Set Fs = CreateObject("scripting.filesystemobject")
  5. fPath = ThisWorkbook.Path & "" & [o2]
  6. Set a = Fs.opentextfile(fPath, 1)
  7. arr = Split(a.readall, vbCrLf)
  8. s = WorksheetFunction.Match("*" & [o4] & "*", arr, 0)
  9. If Err.Number <> 0 Then MsgBox "该文件中不存在" & [o4]: Exit Sub
  10. arr(s - 1) = Left(arr(s - 1), 10) & "6666.00" & Right(arr(s - 1), Len(arr(s - 1)) - 17)
  11. Set a = Fs.CreateTextFile(fPath, True)
  12. a.Write Join(arr, vbCrLf)
  13. a.Close
  14. Set Fs = Nothing: Set a = Nothing
  15. End Sub
复制代码

VB.zip

38.9 KB, 下载次数: 7

excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
发表于 2016-8-16 11:34 | 显示全部楼层
一次性读取文本内容后,将文本拆成数组直接操作就可以。
完事了再将数组合并成字符串内容写入文本。
回复

使用道具 举报

 楼主| 发表于 2016-8-16 11:38 | 显示全部楼层
抱歉,之前的附件似乎有点问题,这个是修正版。程序做了一些修改,但是搜索出来的行号是不对的,并不是WDO1第一次出现的位置

Sub sacinp()

Set fs = CreateObject("scripting.filesystemobject")
Set a = fs.opentextfile("E:\系统\Desktop\实习\VB\" & Sheets(2).Cells(2, 15).Value, 1)
Dim j, k, WD1 As Integer
Dim WDO1
Dim cnt As String
j = 1
  Do While Not a.AtEndOfLine
   cnt = a.readline
   If InStr(cnt, Cells(4, 15).Value) <> 0 Then
    WDO1 = cnt
    WD1 = j
   Else
   End If
   j = j + 1
  Loop
  MsgBox WD1
  MsgBox WDO1
End Sub

VB.zip

38.74 KB, 下载次数: 4

回复

使用道具 举报

 楼主| 发表于 2016-8-16 11:47 | 显示全部楼层
gufengaoyue 发表于 2016-8-16 11:34
一次性读取文本内容后,将文本拆成数组直接操作就可以。
完事了再将数组合并成字符串内容写入文本。

比如说,是按照换行符拆成一个N行1列的数组,数组中每个元素代表1行,然后将数组的元素做循环,逐步与对应字符做比较,找到该字符后,修改该数组元素,然后重新写入一个新的文本文件中。这样的思路有问题么?我VBA用的不太熟,大概会用到的语句能给一点建议么

另外我之前用过mid替换单元格内部分字符,数组中某元素能用这个函数么?

另外,如果要找的是第二次出现的位置,怎么做呢。
还有能麻烦帮我看下我回复的第二段程序有什么问题么,为什么读出来的并不是正确的那一行
回复

使用道具 举报

发表于 2016-8-16 12:06 | 显示全部楼层    本楼为最佳答案   
下面这段是找第一个出现的 WDO1 ,然后修改该行第11个字符开始的7个字符为 6666.00,然后保存。
其它的你自己琢磨下。
你的问题应该在于找到WDO1后,没有退出循环。
所以,程序继续寻找WDO1,找到后,记录的行号肯定是不一样的了。
  1. Sub sacinp()
  2. On Error Resume Next
  3. Dim Fs, a, b, fPath$
  4. Set Fs = CreateObject("scripting.filesystemobject")
  5. fPath = ThisWorkbook.Path & "" & [o2]
  6. Set a = Fs.opentextfile(fPath, 1)
  7. arr = Split(a.readall, vbCrLf)
  8. s = WorksheetFunction.Match("*" & [o4] & "*", arr, 0)
  9. If Err.Number <> 0 Then MsgBox "该文件中不存在" & [o4]: Exit Sub
  10. arr(s - 1) = Left(arr(s - 1), 10) & "6666.00" & Right(arr(s - 1), Len(arr(s - 1)) - 17)
  11. Set a = Fs.CreateTextFile(fPath, True)
  12. a.Write Join(arr, vbCrLf)
  13. a.Close
  14. Set Fs = Nothing: Set a = Nothing
  15. End Sub
复制代码
回复

使用道具 举报

 楼主| 发表于 2016-8-16 14:01 | 显示全部楼层
gufengaoyue 发表于 2016-8-16 12:06
下面这段是找第一个出现的 WDO1 ,然后修改该行第11个字符开始的7个字符为 6666.00,然后保存。
其它的你自 ...

谢谢,不明白再来请教您
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-22 23:27 , Processed in 0.351329 second(s), 12 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表