0

..................................................... ..................................................... ..................................................... ...... 最新消息...... PPS我刚读到 的比只是.. 这就是我要尝试的。但我真的很想知道如何在循环中使用,意思是“如何关闭在循环中使用的文件?” 要清楚大局,请继续阅读。 ..................................................... ..................................................... ..................................................... …………FileSystem.FileCopy FileCopyFileCopyFileCopy

(使用 Windows 10 专业版、Word 365 专业版)

的在线帮助FileCopy Src, Dest说它... 将文件复制SrcDest[但] 不适用于当前打开的文件。两个 ... 文件都必须关闭 [by]Close语句。

但是,该页面上Close提供的链接的在线帮助连接到Open 语句的 Close 的帮助,它说它“关闭以前用 the 打开的文件”语句,而不是语句。OpenFileCopy

所以我很困惑如何处理这段代码,它将 Document 中的第一个代码模块复制到备份位置,而不是第二个

图#1:关于应该被复制的内容的信息

在此处输入图像描述

图#2:没有原始错误信息On Error

在此处输入图像描述

(我不知道为什么所有这些空白行。它们不在我的身体里。)

请暂时忽略所有的 OnError 东西

当应该复制第二个代码模块时,执行停止并出现错误“找不到文件”。

Sub BackupModules()
    Dim prj As VBProject
    Dim comp As VBComponent
    Dim code As CodeModule
    Set prj = ThisDocument.VBProject
    Dim k As Integer, n As Integer
    Dim Destination As String, Prefix As String
    Prefix = "junk"
    k = 0: n = 0
On Error GoTo x
    For Each comp In prj.VBComponents
On Error GoTo x
        k = k + 1
        If comp.Type = vbext_ct_StdModule Then
          n = n + 1
          Destination = Prefix & n
          MsgBox "Copying Standard module " & n & " of " & k & " components encountered: <" & comp.Name & "> to " _
                 & Destination & "; # lines: " & comp.CodeModule.CountOfLines
On Error GoTo x
          FileCopy comp.Name, Destination
          MsgBox "Success"
          Close
        Else

x: If Err.Number <> 0 Then: _
msg = "Error # " & Str(Err.Number) & " was generated by " _
& Err.Source & Chr(13) & Err.Description: _
MsgBox msg, , "Error", Err.HelpFile, Err.HelpContext: On Error GoTo 0: Close:

       End If
    Next

End Sub

然后我开始尝试(如你所见很多)On Error Goto x放置在不同的地方(一次一个,然后全部,如图所示)和开始x: If Err...放置在Else块内的看起来令人讨厌但语法和逻辑正确的行。

图#3:使用后的错误信息On Error

在此处输入图像描述

(FWIW,我刚刚NormalErr.Source上面的错误消息部分发现。在线帮助说,“当您的代码中发生意外错误时,会自动填写 Source 属性。对于标准模块中的错误, Source 包含项目名称。对于类模块中的错误,Source 包含一个带有 project.class 形式的名称。”实际上,代码位于 Normal Project 的模块中。)

图#4:导致错误的行On Error没有陷阱 在此处输入图像描述

那么怎么了?我已经尝试了我能想到的一切。我能找到的唯一帮助Close没有提到它与FileCopy. 我的Close用法没有引起错误,但确实Close关闭了源文件和目标文件?肯定不是。第一次使用FileCopy工作,文件(可能)没有关闭,因此第二次使用FileCopy失败。文档说FileCopy在打开的文件上使用会导致错误。

On Error Goto x或 to0既不在这里也不在那里。这就是为什么我一开始就说不要理他们。

问题显然是“如何关闭中提到的两个文件FileCopy?”

PS根据开场白,我不会这样做。 我想我可以使用Open ... For Input As File#1并指定模块的名称,如果它可以随时用于编码,也可以Open ... For Output As File#2用于目标,使用For循环复制行数(如果可用),然后Close两者都复制。但我希望在我尝试之前能解决我的问题,因为肯定FileCopy应该在一个循环中工作(而不是因为关闭不当)。

4

1 回答 1

0

感谢@TimWilliams,他向我提示Export,我最后的“备份所有模块”例程非常简单。

Sub BackupModules()
    Dim comp As VBComponent
    Dim prj As VBProject:     Set prj = ThisDocument.VBProject
    Dim fso As Object:        Set fso = CreateObject("Scripting.FileSystemObject")
    Dim destPrefix As String: destPrefix = "C:\Users\Dov\Google Drive\Word\Modules\"
    Dim destFilePath As String

    For Each comp In prj.VBComponents
        If comp.Type = vbext_ct_StdModule Then
            destFilePath = destPrefix & comp.Name & " " & Year(Now) & " " & Month(Now) & " " & Day(Now)
            Debug.Print "Copying Standard module <" & comp.Name & "> to <" & destFilePath & ">"
            comp.Export (destFilePath)
        Else
            Debug.Print "Skipping component # " & k & ", <" & comp.Name & ">, type " & comp.Type
       End If
    Next
End Sub
于 2020-02-02T17:32:04.980 回答