【问题标题】:Text is being over written when it's supposed to be appended应该附加的文本被覆盖
【发布时间】:2012-06-23 00:03:38
【问题描述】:

这看起来真的很容易(我已经做了一百万次,从来没有遇到过问题),但它让我很生气。

我想根据 Excel 电子表格中的内容创建一些 SQL 脚本。为此,我创建了一个宏,它使用下面的代码读取文本文件

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim stream As TextStream
Set stream = fso.OpenTextFile(filepath, 8, False)

这是应该打开文本文件以附加并插入我的新值。

不幸的是,它总是覆盖而不是追加,这让我发疯了。

有什么想法吗?

【问题讨论】:

  • 这看起来对我来说可能很好......!
  • 你能把代码粘贴到你实际写的地方然后关闭文件吗?
  • 您的代码没有问题。 IF 文件存在,它将附加到它,否则它将创建一个 New 文件。你能确认文件是否存在吗? Just a shot in the dark:- 可能发生的情况是该文件可能不存在,您可能认为它正在覆盖而实际上是在重新创建它?
  • 我测试了你的代码,它可以工作。它没有任何问题。错误在别处。

标签: vba file-io filesystemobject


【解决方案1】:

我最近刚刚构建了一个将字符串附加到文件的函数。几周/几个月前我遇到了这个问题,发现如果使用实际单词 ForAppending,就像它在 Intellisense 中显示的那样,插入数字 8 它为我工作。

Const ForAppending = 8

Sub AppendStringToFile(ByVal strFile As String, ByVal strNewText As String, Optional intBlankLine As Integer = 1)

Dim fso as FileSystemObject, ts as TextStream

Set fso = New FileSystemObject
Set ts = fso.OpenTextFile(strFile, ForAppending, True)

With ts
    .WriteBlankLines intBlankLine
    .WriteLine (strNewText)
    .Close
End With

Set ts = Nothing
Set fso = Nothing

End Sub

【讨论】:

  • Const ForReading = 1, ForWriting = 2, ForAppending = 8
  • @Stian - 如果我没记错的话,我试过玩它,但它让我很烦,这就是我最终使用文本版本的原因。前段时间我解决了,但我认为这是我的过程,因为我记得感受到 OP 的痛苦!
  • 您应该考虑将其编辑为 Sub 并声明您的变量和常量。
  • “我认为您只需将您对 ForAppending 的编号引用从什么更改为什么?问题说8,这是正确的!你也没有声明你的变量?! -1
  • @Jean-FrançoisCorbett,如果您取消反对票,我将不胜感激。也许评论中并不清楚,但我告诉 OP 将数字更改为实际文本 ForAppending,我试图在我对 Stian 的评论中再次解决这个问题。我过去遇到过同样的问题,发现ForAppending 有效,而8 没有。至于声明变量,我不小心把它漏掉了,因为我从一个有几个函数的模块中提取了它,我在其中全局声明了它们。但是,我感谢您的意见,并将编辑我的答案以清晰和理解。
【解决方案2】:

回归基础....
Open pathname For mode [Access access] [lock] As [#]filenumber [Len=reclength]

用于您的要求:

Dim FNum As Integer

FNum = FreeFile()
Open strFile For Append As FNum

'do your stuff here
Write #FNum, MyData

Close FNum

【讨论】:

  • 基础知识非常适用于 ascii 文本,但如果您正在使用例如中文/日文/等,则会破坏结果。为此,您需要写入 Unicode 文件。为此,请将 True 作为第四个参数添加到 OpenTextFile。
【解决方案3】:

很奇怪,在this documentation中,提到了ForAppending对应的常量是8,但在底部的例子中却使用了3

试试:

Dim fso As FileSystemObject
Set fso = New FileSystemObject

Dim stream As TextStream
Set stream = fso.OpenTextFile(filepath, 3, False)

【讨论】:

  • 为什么要推测?在发布之前自己尝试一下。如果你这样做了,你会看到它不会以 3 作为参数进行编译。该旧文档中的示例存在错误;应该咨询newer FileSystemObject documentation
猜你喜欢
  • 1970-01-01
  • 2016-04-04
  • 2016-06-07
  • 1970-01-01
  • 2018-03-01
  • 2015-09-11
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多