问与答77: 为什么使用VBA操作文件时会出现“输入超出文件尾”错误?

2020-02-18 12:08:38 浏览数 (1)

Q:在《VBA专题08: 使用VBA操作文本文件》中,我们讲解了如何使用VBA来创建、修改、读取文本文件等操作。我们在示例代码中创建的文本文件内容都是英文,因此一切顺利。然而,如果我们创建的文本文件是中文,结果如何呢?如下面的代码,创建一个含有中文内容的文本文件:

代码语言:javascript复制
Sub CreateTextFile()
    Dim iFileNumber As Integer
    Dim strFilePath As String
   
    '创建的文件的路径和名字
    strFilePath = "C:MyFile.txt"
   
    '确定下一个可用的文件序号
    iFileNumber = FreeFile
   
    '打开文本文件
    Open strFilePath For Output As iFileNumber
   
    '写入文本
    Print #iFileNumber, "你好!"
    Print #iFileNumber, "这是由VBA创建的文本文件."
    Print #iFileNumber, "完美Excel."
   
    '保存并关闭文件
    Close iFileNumber
End Sub

然后,使用下面的代码来读取该文件:

代码语言:javascript复制
Sub ExtractTextFormFile()
    Dim iFileNumber As Integer
    Dim strFilePath As String
    Dim strFileContent As String
      
    '文本文件的路径
    strFilePath = "C:MyFile.txt"
   
    '确定下一个可用的文件序号
    iFileNumber = FreeFile
   
    '打开文件
    Open strFilePath For Input As iFileNumber
   
    '将文件内容存储到字符串变量中
    strFileContent = Input(LOF(iFileNumber),iFileNumber)
   
    '输出文件内容
    MsgBox strFileContent
   
    '关闭文件
    Close iFileNumber
End Sub

会发生错误,如下图1所示。

图1

这如何解决呢?

A:文本文件包含英文内容可以,但包含中文内容却不行,其原因显而易见,就是文本文件中存在中文。这是由于VB内部采用Unicode编码方式的问题,使用下面的代码解决:

代码语言:javascript复制
Sub ExtractTextFormFile1()
    Dim iFileNumber As Integer
    Dim strFilePath As String
    Dim strFileContent As String
      
    '文本文件的路径
    strFilePath = "C:MyFile.txt"
   
    '确定下一个可用的文件序号
    iFileNumber = FreeFile
   
    '打开文件
    Open strFilePath For Input As iFileNumber
   
    '将文件内容存储到字符串变量中
    strFileContent = StrConv(InputB(LOF(iFileNumber),iFileNumber), vbUnicode)
   
    '输出文件内容
    MsgBox strFileContent
   
    '关闭文件
    Close iFileNumber
End Sub

运行正常,结果如下图2所示。

图2

有人说,可以将文件内容先读取到文本框控件内,然后将该控件的内容再转到变量中,这样就可以解决了。我没有试过这种方法,有兴趣的朋友可以试一下。

0 人点赞