经验: 编程确实如李笑来所说,有很多知识前置,所以少年,努力学习吧,除了这个也没啥其他难度。

 

1 比较 三种打开txt文件方法

 

  • (1)语句直接打开文件,最简单   open filename  for append as #1
  • (2)对象fso的方法    fso.opentextfile()    还有 fso.createtextfile()
  •          fso是一套通用的  textStream 对象 ,这个对象可以很多方法   .close  .read .write等等 
  •          操作文件,需要先   set 对象变量=fso.opentextfile() 才行
  •  (3)workbooks 特定对象的快捷方法     workbooks.opentext  filename:=       实测,语法很严格,必须是workbooks,
  •           实际效果是,新生成一个EXCEL的workbook文件,且打开这个TXT作为第一个激活sheet

 

2 open相关

我在这里搜了搜 https://docs.microsoft.com/zh-cn/office/vba/Language/Reference/User-Interface-Help/printstatement

2.1 open相关的总结:

  • open语句:open  filename  for append as #1
  • open函数,好像VBA并没有 open()函数
  • 相关对象.open()方法,各种各样-----对象.openText,FileSystemObject.opentextfile,对象.openXml,对象.openDatabase,比如 workbook.openText
  • 属性相关插件addin的属性,isopen
  • object.open事件,触发

 

2.2 open语句

MSDN的DOC解释

https://docs.microsoft.com/zh-cn/office/vba/language/reference/user-interface-help/open-statement?redirectedfrom=MSDN


2.3 测试过程 open  filename for  tristate as #1

  • open "" for input  是读文件
  • open "" for output  是读文件
  • open "" for random 或  open ""   也就是默认是random ?不知道为啥要 random...
  • 实际写法,经常会 as   #1 
  • open "" for append access write as #1
  • open  ""  for append as #1

 

从txt中读取全部内容

Sub test_jackma1()

Dim s As String

Open "C:\Users\Administrator\Desktop\test101.txt" For Input As #1
Do While Not EOF(1)
Line Input #1, s
Debug.Print s
Loop
Close #1


End Sub

读取部分内容--读取几行

  •       初始位置,应该是取决于 光标位置,
  •       如果是新打开的文件,一般就是在文件开头第1行,
  •       其他保存过的文件,看关闭时光标最后停留的位置作为下次打开的初始位置?
Sub test_jackma1()

Dim s As String

Open "C:\Users\Administrator\Desktop\test101.txt" For Input As #1


Line Input #1, s
Debug.Print s
Line Input #1, s
Debug.Print s
Line Input #1, s
Debug.Print s


Close #1


End Sub

 

循环逐行读(没有实现自动读最大行数等)

Sub test_jackma1()

Dim s As String

Open "C:\Users\Administrator\Desktop\test101.txt" For Input As #1

For i = 1 To 10 Step 1
Line Input #1, s
Debug.Print s
Next i


Close #1


End Sub

往里写内容(可以用 write 或 print ?)

Sub test_jackma1()

Dim s As String

Open "C:\Users\Administrator\Desktop\test101.txt" For Append As #1

 Write #1,
 Write #1, 888
 Write #1, 999

Close #1

End Sub

 

open "" for append  会在最后一行直接追加(可以用 write 或 print ?)

Sub test300()

Open "C:\Users\Administrator\Desktop\test101.txt" For Append As #1
Print #1, "a,b,c"
Close #1

End Sub

open "" for output  会覆盖文件内容

Sub test300()

Open "C:\Users\Administrator\Desktop\test101.txt" For Output As #1
Print #1, "5"
Close #1

End Sub

 

2.4 open语句的 mode的配置  tristate

  • for  read       对应0
  • for   write      对应1
  • for  append   对应8
  • for  random 不知道有啥用,反正是不能write,也不能read,我都试过

 

2.5 open语句的状态的配置 tristate

  • access write
  • access read 
  • access  read write
  • 默认是?

 

2.6 open语句的共享状态 state

  • shared
  • locked read


 

3  open 语句相对应的 close ,write,read (简写 CL WR  RE )

 

3.1 close 相关

  • close 语句close #1
  • object.close方法
  • beforeclose

 

3.2 write相关

  • write 语句     
  • writeline  
  • fso.write      不能这样空行       
  • fso.writeline         
  • 没有这样的方法  fso.print                                                                                           
Sub jackma2()
    Dim fso1, f1
    Set fso1 = CreateObject("Scripting.FileSystemObject")
    Set f1 = fso1.OpenTextFile("C:\Users\Administrator\Desktop\test101.txt", 8, TristateFalse)
    'f1.Write     ' write 这样会报错
    f1.Writeline  'writeline这样是可以的
    f1.Writeline "Hello world!"

    'f1.Print "Hello world!"    '没有这样的方法 fso.print


    f1.Close
End Sub

相关文件操作总结,对于fso对象

  • f.close        (见上面)
  • f.write         (见上面)
  • f.writeline    (见上面)
  • f.read
  • f.readall
  • f.readline
  • f.skipline       光标跳到下一行
  • f.skip   5        光标往后跳几个字节
Sub jackma2()
    Dim fso1, f1
    Dim x1
     
    Set fso1 = CreateObject("Scripting.FileSystemObject")
    Set f1 = fso1.OpenTextFile("C:\Users\Administrator\Desktop\test101.txt", 1, False)

    x1 = f1.readline
    Debug.Print x1
    
    f1.Close
End Sub
Sub jackma2()
    Dim fso1, f1
    Dim x1
     
    Set fso1 = CreateObject("Scripting.FileSystemObject")
    Set f1 = fso1.OpenTextFile("C:\Users\Administrator\Desktop\test101.txt", 1, False)

    x1 = f1.readline
    Debug.Print x1
    f1.skipline
    x1 = f1.readline
    Debug.Print x1
    f1.Skip 1
    x1 = f1.readline
    Debug.Print x1
    
    f1.Close
End Sub

 

3.3 input相关

  • line input 语句
  • all input ?

 

3.4 read 相关

  • readall
  • readline

 

3.5 print相关

  • 1 之前只知道  debug.print  xxx   比  msgbox   xxxx 好用
  • 2 现在才知道 print可以往文件里写入内容

 

'这一段是微软的手册的官方介绍
Open "TESTFILE" For Output As #1 ' Open file for output. 
Print #1, "This is a test" ' Print text to file. 
Print #1, ' Print blank line to file. 
Print #1, "Zone 1"; Tab ; "Zone 2" ' Print in two print zones. 
Print #1, "Hello" ; " " ; "World" ' Separate strings with space. 
Print #1, Spc(5) ; "5 leading spaces " ' Print five leading spaces. 
Print #1, Tab(10) ; "Hello" ' Print word at column 10.


 

 

4 open作为对象的方法,属性,或事件

 

4.1 对比 workbooks.opentext 和 fso.opentextfile()

  •  workbooks.opentext  filename:=      实测,语法很严格,必须是workbooks,实际效果是,新生成一个EXCEL的workbook文件,且打开这个TXT作为第一个激活sheet
  • fso是一套通用的  textStream 对象 ,这个对象可以很多方法   .close  .read .write等等                                                        操作文件,需要先   set 对象变量=fso.opentextfile() 才行

 

4.2对象.openText 方法

  •  workbooks.opentext 因为是创建了一个新的excel文件!!!所以只能用workbooks的写法
  •  
  • Workbooks.OpenText filename:="DATA.TXT", _ dataType:=xlDelimited, tab:=True
  • 不支持thisworkbook.opentext 和 activeworkbook.opentext
  • 而只支持thisworkbook.saveas 和 activeworkbook.saveas

 

Sub jackma3()

Workbooks.OpenText Filename:="C:\Users\Administrator\Desktop\test101.txt"
'只能是 workbooks.opentext
'不能是 thisworkbook.opentext  或者  activeworkbook.opentext

End Sub

会生成1个新EXCEL表,也就是所谓的 workbook,同时把这个txt 读入到第一个sheet里,sheet命名,内容都读txt的

 

4.3  FileSystemObject 对象下的各种方法,其中包括 fso.opentextfile

 

_Object_参数始终是**TextStream** 对象的名称。

 

Sub OpenTextFileTest
    Const ForReading = 1, ForWriting = 2, ForAppending = 8
    Dim fs, f
    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.OpenTextFile("c:\testfile.txt", ForAppending, TristateFalse)
    f.Write "Hello world!"
    f.Close
End Sub

FilesystemObject对象的OpenTextFile方法(CreateTextFile也是

FilesystemObject .OpenTextFile 默认会用系统的编码读取文本,默认一般都是ANSI,想改成中文也正常显示,必须把文本转换成Unicode,同时OpenTextFile方法也设置成Unicode的方法读取。

OpenTextFile方法
该方法可以打开指定的文件并返回一个TextStream对象,可以读取此对象或将其追加到文件中。语法如下:
Object.OpenTextFile(filename[,iomode[,create[,format]]])
OpenTextFile方法的参数说明

 

  • object 必选。应为FileSystemObject对象的名称。 
  • filename 必选。字符串表达式,指明要打开的文件名称。 (其实是文件完整路径)
  • iomode 可选。输入/输出模式,:forReading,forwriting,forAppending 分别代码是 1,2,8
  • create 可选。Boolean值,指出当指定的filename不存在时是否能够创建新文件。允许时为True,否则为False,默认False。 
  • format 可选。三个Tristate值之一,指出以何种格式打开文件。
  • format默认,或=0,ASC2格式,format=2以系统默认格式打开文件,format=-1,以Unicode格式打开文件
  • 应该是 false/0 为ASC2模式,而true/1或其他,都是unicode模式

 

CreateTextFile 方法

写文件默认也不支持中文编码,用ASCII写中文字符的时候可能会报错,也一样要设置CreateTextFile 方法的编码。

FileSystemObject.CreateTextFile(filename[,overwrite[,unicode]])
FolderObject.CreateTextFile(filename[,overwrite[,unicode]])

 

  • filename    必需。需创建文件的名称。
  • overwrite    可选的。指示能否覆盖已有文件的布尔值。True 指示可覆盖文件,False 指示不能覆盖文件。默认是 True 。
  • unicode    可选的。指示文件是作为 Unicode 还是 ASCII 文件来创建的布尔值。True 指示文件作为 Unicode 文件创建,而 False 指示文件被作为 ASCII 文件创建。默认是 False。
  • 默认或-2 默认格式,0是ASC2模式, -1 是unicode模式
  • 应该是 false/0 为ASC2模式,而true/1或其他,都是unicode模式

 

 

 

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐