【问题标题】:Save a query as text tab delimited but include ".ail2" in the saved name. (ACCESS)将查询另存为以制表符分隔的文本,但在保存的名称中包含“.ail2”。 (使用权)
【发布时间】:2018-10-29 21:37:14
【问题描述】:

我想从 access 数据库中将查询导出为文本文件,但使用 vba。问题是我需要以 .ail2 的名称保存它。

基本上我想要它的形式:"currentdate_version.ail2".txt(引号非常重要,否则它将不起作用)。

例如,今天的第一个版本如下所示:

“20182910_1.ail2”.txt

我已尝试手动导出并将其另存为,但导出向导似乎不喜欢保存名称中的引号。因此,我一直在导出它(使用我标记为 test1 的自定义保存导出 - 它包括每列的标题,将文本限定符设置为“无”,字段分隔符设置为“制表符”,文件格式为“分隔” )。

我在访问中使用以下代码,第一部分只是确保当前日期的文件夹存在。

Private Sub ExportExcel()


    Dim myQueryName As String
    Dim myExportFileName As String
    Dim strSheets As String
    Dim sFolderPath As String
    Dim filename As Variant
    Dim i As Integer

    strSheets = Format(Date, "yyyymmdd")

    sFolderPath = "M:\AIL2Files\" & strSheets & ""

    Dim fdObj As Object

    Set fdObj = CreateObject("Scripting.FileSystemObject")
    If fdObj.FolderExists("" & sFolderPath & "") Then
    Else
        fdObj.CreateFolder ("" & sFolderPath & "")
    End If
    i = 1
    filename = Dir(sFolderPath & "\*" & i & ".txt")

    Do While Len(filename) > 0
    filename = Dir(sFolderPath & "\*" & i & ".txt")
    i = i + 1
    Loop


    myQueryName = "001_querytest"
    myExportFileName = "" & sFolderPath & "\" & Chr(34) & "" & strSheets & "_" & i & ".ail2" & Chr(34) & ".txt"
    DoCmd.TransferText acExportDelim, "test1", myQueryName, myExportFileName, True




End Sub

test1 没有被拾取,即使它是“保存的导出”。我认为我做错了这部分......但即使我仍然认为保存不会成功并且不会包含引号。

谢谢。

编辑:

我已尝试执行以下操作:

DoCmd.TransferText transferType:=acExportDelim, TableName:=myQueryName, filename:=myExportFileName, hasfieldnames:=True

它现在保存,但再次不包括所需的引号。有趣的是,当我在即时窗口中键入 ?myExportFileName 时,它会显示我想要的文件名,但是当我得到它的形式时,该命令显然无法正常工作:

_20181029_1#ail2_

相反...

如果我使用另存为,这里是图片:

我最终得到:

【问题讨论】:

  • 文件名不能包含引号(参见reserved characters 列表)。如果引号真的很重要,我认为你应该重新设计你的代码,不要让它们变得必要。
  • 我认为会是这种情况......我担心它是不可能的,虽然 .ail2 文件被不同的软件使用并且如果我去“另存为”它就可以工作文本文件并将其与引号一起保存...它可以工作,我得到了我的 ail2 文件...
  • 我真的看不出还有哪些软件可能在使用包含引号的文件名,因为操作系统禁止使用引号。很遗憾地告诉您,您将永远无法使用名称中的引号来保存文件(无论是在 VBA 中,也不是手动,也不是因为操作系统会拒绝您)。如果需要引号的代码位是您的,我强烈建议您更改它。
  • 它通过包含引号将文件转换为 .ail2 文件。问题是如果我不遵循这种方法,格式就会被破坏,其他软件将无法正确读取。看我上面的照片...
  • 当然可以直接保存为.ail2。如果 .ail2 是您的文件的预期扩展名,这实际上就是您应该做的。

标签: ms-access vba


【解决方案1】:

这里有一些误解。

Windows 文件名不能包含双引号 ", 句点。你也不需要它们。只需将您的文件保存为filename.ail2

这是执行“另存为”时得到的结果。 Tell Explorer to show file extensions,你会发现你没有"filename.ail2".txt,而是filename.ail2

你只需要

myExportFileName = sFolderPath & "\" & strSheets & "_" & i & ".ail2"

test1 没有被提取,即使它是“已保存的导出”。

DoCmd.TransferText 不使用保存的导出,而是使用导出规范。请参阅此处了解区别:
Can I programmatically get at all Import/Export Specs in MS Access 2010?

附录

DoCmd.TransferText 在给定非法文件名时可能会引发运行时错误,但显然它试图通过_ 交换非法字符来挽救这一天,因此_20181029_1#ail2_ (.txt)

【讨论】:

  • 感谢您的回答。我已使用您建议的方法合并了导出规范。我现在收到“运行时错误 '3027'' - 无法更新。数据库或对象是只读的。在调试时,它会突出显示我修改过的内容:DoCmd.TransferText transferType:=acExportDelim, SpecificationName:="034_AILFILE Export Specification", TableName:=myQueryName, filename:=myExportFileName, hasfieldnames:=True。我已将数据库选择为“从不缓存”,但仍然出现此错误...
  • 当我尝试直接保存为 .ail2 文件时似乎发生了错误...如果我保存为 ail2.txt 它会导出,但显然是 txt 文件...我是努力看看如何直接保存为 .ail2 文件...
【解决方案2】:

解决方法是首先使用DoCmd.TransferText 将文件保存为.txt,但运行shell 并重命名。像这样:

myExportFileName = sFolderPath & "\" & strSheets & "_" & i & ".txt"



DoCmd.TransferText TransferType:=acExportDelim, SpecificationName:="034_AILFILE Export Specification", TableName:=myQueryName, filename:=myExportFileName, HasFieldnames:=True

Set wshShell = CreateObject("Wscript.Shell")
strDocuments = wshShell.SpecialFolders("M:\AIL2Files\" & strSheets & "")
oldFileName = myExportFileName
newFileName = sFolderPath & "\" & strSheets & "_" & i & ".ail2"

Name oldFileName As newFileName

无疑有更简洁的方法可以做到这一点,但我想这种方法可用于保存任何具有非传统扩展名但基本上遵循 .txt 文件格式的文件。

【讨论】:

  • DoCmd.TransferText 拒绝另存为.ail2 实际上很有可能,它可能有一组固定的允许扩展名,如 .txt 和 .csv。因此,您导出为 .txt 并重命名为 .ail2 的方法是一种合理的解决方法,我也会这样做。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多