Excel精英培训网

 找回密码
 注册

VBA使用FileSystemObject将读取或写入文本文件

热度 1已有 1645 次阅读2012-5-16 10:03 |个人分类:VBA| 文本文件

 有时,我们需要将一个文本文件中的数据读取到Excel单元格中,或将指定单元格的内容按指定的格式导出到文本文件中,这时,我们就需要使用Scripting.FileSystemObject对象来进行操作。在接下来的几篇里我们介绍如何使用FileSystemObject对象操作文本文件的。工欲善其事,必先利其器,那么我们就先花几篇文章来详细介绍下FileSystemObject对象。  

  一、如何创建FileSystemObject对象  首先引用MICROSOFT SCRIPTING RUNTIME

    在VBA中,是通过CreateObject函数返回FileSystemObject对象。

    示例:

Dim fso As Object  Set fso=CreateObject("Scripting.FileSystemObject")

    二、FileSystemObject主要方法介绍

    1、CreateTextFile方法:用于创建一个指定文件名,并返回一个可操作的TextStream对象。

    语法:object.CreateTextFile(filename[,overwrite[,unicode]])

参数 说明
object 必需的。为一个FileSystemObject对象的名字
filename 必需的,一个带路径的字符串表达式,为创建的文件
overwrite 可选的。Boolean值,如果为True表示覆盖已存在的文件,False表示不能覆盖。默认值为False。
unicode 可选的。Boolean值,表示文件是作为一个Unicode文件创建的还是作为一个ASCII文件创建的。如果为True则表示作为Unicode文件创建,False表示作为ASCII文件创建。默认值为False。

    示例1:在C:\FSOTest\中创建一个名为testFile的文本文件,并写入一行“CreateTextFile Test”:

Sub CreateFile() 
     Dim sFile As Object, FSO As Object     
 Set FSO = CreateObject("Scripting.FileSystemObject")   
   Set sFile = FSO.CreateTextFile("C:\FSOTest\TestFile.txt",True)  
    sFile.WriteLine ("CreateTextFile Test")   
   sFile.Close   
   Set sFile = Nothing   
   Set FSO = Nothing  
End Sub

   2、DeleteFile方法:用于删除一个指定的文件。如果指定的文件不存在,则返回一个错误信息。

   语法:object.DeleteFile(filespec[,force])

参数 说明
object 必需的。为一个FileSystemObject对象
filespec 必需的。要删除文件的名字。可以在最后的路径部件中包含通配符
force 可选的。Boolean值,如果要删除具有只读属性设置的文件,则为True。如果不能删除具有只读属性设置的文件,则为False。默认值为False

    示例2:删除示例1中创建的文本文件。

Sub DeleteFile()  
    Dim fso As Object  
    Set fso = CreateObject("Scripting.FileSystemObject")   
   fso.DeleteFile ("C:\FSOTest\TestFile.txt") 
 End Sub

   3、FileExists方法:判断指定的文件是否存在。如果存在,则返回True,若不存在,则返回False

   语法:object.FileExists(filespec)

参数 说明
object 必需的。为一个FileSystemObject对象
filespec 必需的。要确定是否存在的文件名。如果认为文件不在当前文件夹中,必须提供一个带完整的路径说明。

   示例3:判断“C:\FSOTest\”中是否存在文件“testfile.txt”:

Sub FileExist()  
    Dim fso As Object, blnExist As Boolean    
  Set fso = CreateObject("Scripting.FileSystemObject")    
  blnExist = fso.FileExists("C:\FSOTest\testfile.txt")    
  MsgBox blnExist 
 End Sub

    4、OpenTextFile方法:打开一个指定的文件并返回一个TextStream对象,该对象可能于对文件进行读操作或追加操作。

    语法:object.OpenTextFile(filename[,iomode[,create[,format]]])

参数 说明
object 必需的。始终是一个 FileSystemObject 的名字
filename 必需的。为一个文件名,包含完整路径说明
iomode 可选的。表示输入/输出方式。可为两个常数之一:ForReadingForAppending
create 可选的。Boolean 值,它表示如果指定的 filename 不存在是否可以创建一个新文件。如果创建新文件,其值为 True。若不创建文件其值为 False。缺省值为 False
format 可选的。三种 Tristate 值之一,用于指示打开文件的格式。如果省略,则文件以 ASCII 格式打开。

    参数iomode可以设置为以下值:

常数 说明
ForReading 1 打开一个只读文件。不能对此文件进行写操作
ForWriting 2 打开一个可读写操作的文件,并删除原有文本内容
ForAppending 8 打开一个文件并写到文件的尾部

    参数format可以设置为以下值:

常数 说明
TristateUseDefault -2 使用系统缺省打开文件
TristateTrue -1 以Unicode格式打开文件
TristateFalse 0 以ASCII格式打开文件

    示例4:本例说明了使用OpenTextFile方法打开testfile.txt文件,并添加文字“OpenTextFile Test”:

Sub OpenTextFile()   
   Dim fso As Object, sFile As Object      Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0   
   Set fso = CreateObject("Scripting.FileSystemObject")   
   Set sFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForAppending, TristateFalse)      sFile.Write "OpenTextFile Test"    
  sFile.Close    
  Set fso = Nothing   
   Set sFile = Nothing 
 End Sub

下面,我们将介绍FileSystemObject对象返回的TextStream对象的属性与方法,并示例如何对文本文件进行读写操作。

在这一节里,将详细介绍FileSystemObject对象在创建或打开文本文件后返回的TextStream对象的一些属性及方法。

    三、FileSystemObject对象返回的TextStream对象的属性及方法说明:

    创建TextStream对象示例:

Dim sFile As Object, fso As Object  Set fso = CreateObject("Scripting.FileSystemObject")  Set sFile = fso.CreateTextFile("C:\TestFile.txt")

    示例中的sFile便为TextStream对象。

    (一)TextStream属性:

    1、Line属性:只读属性,返回一个TextStream文件中的当前行号。文件初次打开后,在写任何东西之彰,Line的值为1。

    语法:object.Line

    2、AtEndOfStream属性:只读属性,如果文件指针在TextStream文件末尾,则返回True;否则返回False。

    语法:object.AtEndOfStream

    3、AtEndOfLine属性:只读属性,如果文件指针在TextStream文件行尾标记的前面,则返回True;否则返回False。

    语法:object.AtEndOfLine

    (二)TextStream方法:

    1、WriteLine方法:写入一个指定的字符和换行符到一个TextStream文件中。

    语法:object.WriteLine([string])

Object:必需的。表示一个TextStream对象的名字。

string:可选的。要写入文件的正文。如果省略,一个换行符被写入文件中。

    示例:打开一个文本文件并在文本文件中写入一些字符。

Sub WriteLine()      Dim fso As Object, sFile As Object      Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0      Set fso = CreateObject("Scripting.FileSystemObject")      Set sFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForAppending, TristateFalse)      sFile.WriteLine "WriteLine Test"      sFile.Close      Set fso = Nothing      Set sFile = Nothing  End Sub

    2、Write方法:写一个指定的字符串到一个TextStream文件中。指定的字符串被写入到文件中,在每个字符串之间没有插入空格或字符。使用WriteLine方法写入一个换行符或一个以换行符为结尾的字符串。

    语法:object.Write(string)

object:必需的。为一个TextStream对象的名字。

string:必需的。要写到文件中的字符串。

    示例:下列代码将一个字符串写入到文本文件中,并实现与WriteLine方法相同的效果,即加入空格或换行符。

Sub WriteTest()      Dim fso As Object, sFile As Object      Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0      Set fso = CreateObject("Scripting.FileSystemObject")      Set sFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForAppending, TristateFalse)      sFile.Write "Write Test" & vbTab & vbCrLf   '同时加入一个Tab位及一个换行符      sFile.Close      Set fso = Nothing      Set sFile = Nothing  End Sub

    3、ReadLine方法:从一个TextStream文件读取一整行(到换行符但不包括换行符)并返回得到的字符串。

    语法:string=object.ReadLine

string:返回的字符串。

object:一个TextStream对象。

    示例:打开一个文本文件,并读取内容。

Sub ReadLine()      Dim fso As Object, sFile As Object      Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0      Set fso = CreateObject("Scripting.FileSystemObject")      Set sFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForReading)      MsgBox sFile.ReadLine      sFile.Close      Set fso = Nothing      Set sFile = Nothing  End Sub

    4、Read方法:从一个TextStream文件中读取指定数量的字符并返回得到的字符串。

    语法:object.Read(characters)

object:必需的。表示为一个TextStream对象的名字。

characters:必需的。从文件中要读取的字符数。

    示例:从一个打开的文本文件中读取5个字符。

Sub ReadTest()      Dim fso As Object, sFile As Object      Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0      Set fso = CreateObject("Scripting.FileSystemObject")      Set sFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForReading)      MsgBox sFile.Read(5)      sFile.Close      Set fso = Nothing      Set sFile = Nothing  End Sub

    5、Close方法:关闭一个打开的TextStream文件。

    语法:object.Close

    6、WriteBlankLines方法:写入指定数量的换行符到一个TextStream文件中。

    语法:object.WriteBlankLines(lines)

object:必需的。指一个TextStream对象的名字。

lines:必需的。要写入的换行符数量。

    示例:在一个打开的文本文件中写入两个空行。

Sub WriteBlankLines()      Dim fso As Object, sFile As Object      Const ForReading = 1, ForWriting = 2, ForAppending = 8, TristateFalse = 0      Set fso = CreateObject("Scripting.FileSystemObject")      Set sFile = fso.OpenTextFile("C:\FSOTest\testfile.txt", ForAppending)      sFile.WriteBlankLines (2)      sFile.Close      Set fso = Nothing      Set sFile = Nothing  End Sub

    7、SkipLine方法:当读一个TextStream文件时跳过下一行。跳过一个是指读取放弃一行中的所有字符,一直到并包括该行的换行符。如果读的文件没有打开,则产生一个错误。

语法:object.SkipLine

    8、Skip方法:当读一个TextStream文件时跳过指定数量的字符。跳过的字符将不被读取。

    语法:object.Skip(characters)

object:必需的。表示一个TextStream对象的名字。

characters:必需的。当读文件时要跳过的字符的数量。

到此,我们就已经基本掌握了在VBA中如何使用FileSystemObject来读写文本文件的方法了。下面,我们将学习如何将文本文件中的数据读取到Excel中,及如何将Excel单元格中的数据写入到指定的文本文件中。

  在上两节中已经详细介绍了FileSystemObject对象的一些属性及方法。那么在这一节里,我们将举例说明如何使用VBA在Excel与文本文件中的导入导出。假设我们有如下数据表及文本文件:

    现在要实现在这两个文件中的数据按指定的格式进行导入导出。下面我们就先进行将EXCEL数据表中的内容导出到testfile.txt中,并按图中的格式显示。

    一、导出到文本文件的示例代码:

Sub Export2TxtFile()      Dim fso As Object, sFile As Object, blnExist As Boolean      Dim iRow As Integer, FileName As String      Set fso = CreateObject("Scripting.FileSystemObject") '创建FileSystemObject对象      FileName = "C:\FSOTest\testfile.txt"    '指定文本文件名  Check_FileExist:      blnExist = fso.FileExists(FileName) '判断文件是否存在      If blnExist Then          If MsgBox("指定的数据文件已存在,是否覆盖原文件?", _                      vbExclamation + vbYesNo, "提示信息") = vbNo Then              '如果不覆盖原文件,则要求指定文件名              FileName = Application.InputBox("请输入文件名:")              If FileName = "False" Then FileName = Sheet1.Name & "!$A$1"              FileName = "C:\FSOTest\" & FileName & ".txt"              GoTo Check_FileExist    '再次检查文件是否存在          Else    '如果是,则先删除原文件              fso.DeleteFile (FileName)          End If      End If      Set sFile = fso.CreateTextFile(FileName)      sFile.WriteLine ("[" & Sheet1.Range("A1").Value & "]")  '写入第一行数据      sFile.WriteBlankLines (1) '写入一个空白行      For iRow = 2 To Sheet1.Range("A65536").End(xlUp).Row          '从单元格A2开始读取数据,到数据表结尾,写入到文本文件中          sFile.WriteLine (Sheet1.Cells(iRow, 1).Value _              & "|" & Sheet1.Cells(iRow, 2).Value _              & "|" & Sheet1.Cells(iRow, 3).Value _              & "|" & Sheet1.Cells(iRow, 4).Value)      Next iRow      If MsgBox("文件已导出。是否打开该文件?", vbYesNo + vbInformation) = vbYes Then          Shell ("NotePad.exe " & FileName)   '打开文本文件      End If  End Sub

    二、将文本文件导入到Excel数据表中:

Sub ImportFromTextFile()      Dim fso As Object, sFile As Object, blnExist As Boolean      Dim FileName As String, LineText As Variant, i As Integer, iCol As Integer      Const ForReading = 1      Set fso = CreateObject("Scripting.FileSystemObject")    '创建FileSystemObject对象      FileName = "C:\FSOTest\testfile.txt"     '指定文本文件名      blnExist = fso.FileExists(FileName) '判断文件是否存在,如果不存在,则退出过程      If Not blnExist Then MsgBox "文件不存在!": Exit Sub      Set sFile = fso.OpenTextFile(FileName, ForReading) '创建并打开名为sFile的TextStream对象      '读取第一行数据      Sheet2.Range("A1").Value = Replace(Replace(sFile.ReadLine, "[", ""), "]", "")      sFile.SkipLine  '跳过第二行的空行      i = 2   '设置输入单元格的起始行号      Do While Not sFile.AtEndOfStream    '如果不是文本文件的尾端,则读取数据          LineText = Split(sFile.ReadLine, "|")   '拆分读取到的数据到数组中          For iCol = LBound(LineText) To UBound(LineText) '从数组中读取数据并写入对应的单元格              Sheet2.Cells(i, iCol + 1).Value = LineText(iCol)          Next iCol          i = i + 1   '滚动到下一个单元格行      Loop      '#这里可以加入设置单元格格式的代码      sFile.Close      Set fso = Nothing      Set sFile = Nothing  End Sub

刚表态过的朋友 (0 人)

发表评论 评论 (1 个评论)

回复 罗非鱼 2012-6-13 11:13
1、导出到文本文件:为什么要两次判断文件是否存在,没有的话他可以新建一个,我这样理解对吗?
2、导入到excel文件: LineText = Split(sFile.ReadLine, "|")   '拆分读取到的数据到数组中          For iCol = LBound(LineText) To UBound(LineText) '从数组中读取数据并写入对应的单元格              这两句不理解请解释一下    谢谢

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

GMT+8, 2024-5-6 12:45 , Processed in 0.742276 second(s), 8 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

返回顶部