2

我正在尝试将 Word 文档另存为 PDF,但出现错误框

“运行时错误 '-214747259 (80004005) 这不是有效的文件名。”

这是我的代码:

Option Explicit

Private Sub cmdSave_Click()

Dim equipName As String, equipError As String, fileDate As String, pdfName As String, filePath As String

filePath = "C:\"
equipName = Replace(Left(ActiveDocument.Tables(1).Cell(1, 2).Range.Text, _
    Len(ActiveDocument.Tables(1).Cell(1, 2).Range.Text) - 1), "/", "-")
equipError = Left(ActiveDocument.Tables(1).Cell(2, 2).Range.Text, Len(ActiveDocument.Tables(1).Cell(2, 2).Range.Text) - 1)
fileDate = Replace(Date, "/", "")
pdfName = equipName & "_" & equipError & "_" & fileDate

ActiveDocument.ExportAsFixedFormat OutputFileName:=filePath & pdfName & ".pdf", _
    ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
    wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
    Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
    CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
    BitmapMissingFonts:=True, UseISO19005_1:=False

End Sub

将文件保存为 PDF 的代码是我从我 SaveAs-ing 记录的宏中获取的。实际的文件路径要长得多,但为了简单起见,我将其命名为“C:\”(这也不起作用)。

4

3 回答 3

3

您在 Cell1,2 和 2,2 中的 ActiveDocument 中的文本可能包含特殊字符。如果您没有看到任何 Windows 保留字符,例如 \ / : * ?" < > | 那么你可能有一个奇怪的隐藏或白色字符。

此外,如果 DATE 有 : 在其中,那么它不会保存。您必须删除所有保留的字符,因为 Windows 文件名不能包含以下任何字符: \ / : * ? " < > |

于 2012-08-29T18:44:29.587 回答
3

这将去除不需要的字符:

Function CleanFilename(CurrentFilename As String) As String
Dim MyArray()
Dim x As Integer

    MyArray = Array("<", ">", "|", "/", "*", "\", "?", """", ":")
    For x = LBound(MyArray) To UBound(MyArray)
        CurrentFilename = Replace(CurrentFilename, MyArray(x), "_", 1)
    Next x
    CleanFilename = CurrentFilename
End Function

我不建议在完全限定的路径名​​上运行它,但是在pdfName, else上C:\test.pdf会变成C__test.pdf

于 2012-08-29T20:08:55.473 回答
2

好吧,我主要解决了这个问题。我不知道它为什么/在哪里这样做,但它正在添加一个“下一行”字符(Chr(13))。因此,在告诉它保存文件之前,我插入了以下行:

pdfName = Replace(pdfName, Chr(13),"")

现在它可以毫无问题地保存。我的同事正在帮助我解决这个问题,他发现如果你采取:

pdfNameLen = Len(pdfName)

它返回的长度比您计算可见字符的长度多 2(因为有 2 个单元格条目)。他曾经:

Left(*cell text*, Len(*cell text*) - 2)

对于它收集两个单元格值的位置,唯一的区别是在最后(-2而不是-1,以摆脱单元格格式和Char(13))。与此同时,我们说“明白了!”。

谢谢大家,帮忙!最终代码:

Option Explicit

Private Sub cmdSave_Click()

Dim equipName As String, equipError As String, fileDate As String, pdfName As String, filePath As String, pdfLen As Integer

filePath = "C:\"
equipName = Replace(Left(ActiveDocument.Tables(1).Cell(1, 2).Range.Text, _
    Len(ActiveDocument.Tables(1).Cell(1, 2).Range.Text) - 1), "/", "-")
equipError = Left(ActiveDocument.Tables(1).Cell(2, 2).Range.Text, Len(ActiveDocument.Tables(1).Cell(2, 2).Range.Text) - 1)
fileDate = Replace(Date, "/", "")
pdfName = equipName & "_" & equipError & "_" & fileDate

pdfName = Replace(pdfName, Chr(13), "")

ActiveDocument.ExportAsFixedFormat OutputFileName:=filePath & pdfName, _
    ExportFormat:=wdExportFormatPDF, OpenAfterExport:=False, OptimizeFor:= _
    wdExportOptimizeForPrint, Range:=wdExportAllDocument, From:=1, To:=1, _
    Item:=wdExportDocumentContent, IncludeDocProps:=True, KeepIRM:=True, _
    CreateBookmarks:=wdExportCreateNoBookmarks, DocStructureTags:=True, _
    BitmapMissingFonts:=True, UseISO19005_1:=False

End Sub
于 2012-08-30T13:28:18.673 回答