将Word Doc保存为PDF的问题“这不是有效的文件名”

时间:2012-08-29 18:40:19

标签: vba ms-word

我正在尝试将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:\”(它也不起作用)。

3 个答案:

答案 0 :(得分:3)

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

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

答案 1 :(得分: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上,否则C:\test.pdf将成为C__test.pdf

答案 2 :(得分:2)

好吧,我主要是想出了这个问题。我不知道为什么/在哪里这样做,但它正在添加一个“下一行”&#39;人物(Chr(13))。所以,在告诉它保存文件之前,我插入了一行:

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

现在它正在保存,没有任何问题。我的同事正在帮助我解决这个问题,他发现如果你采取了这个问题:

pdfNameLen = Len(pdfName)

它返回的长度比计算可见字符的数量多2(因为2个单元格条目)。他用过:

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

用于收集两个单元格值的位置,其中唯一的区别在于最后(-2而不是-1,以消除单元格格式和Char(13))。在同一时间我们说&#34;得到了它!&#34;。

谢谢,所有人,帮助!最终代码:

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