【问题标题】:How to know when a file has been created before it is renamed in VBA for Windows如何在 VBA for Windows 中重命名文件之前知道何时创建文件
【发布时间】:2018-03-28 15:36:47
【问题描述】:

这个我一直很头疼,还没搞定。

我使用 VBA 宏创建了许多文件,并随时重命名它们(这与在旧版本的 Excel (2003) 中创建 PDF 相关,使用需要初始文件名作为默认文件名的外部 PDF 编写器,如果你想知道)

我希望宏等到文件创建后再尝试重命名。然后我希望宏等到文件重命名后再创建另一个文件。这并不像听起来那么容易。像 Do While Dir(Filename)"" - Loop 和 Do While Dir(Filename)="" 这样的尝试会产生路径文件访问错误(同样,它自身运行的结果 - 它适用于恢复)或锁定计算机....

非常感谢任何帮助。

Sub RenameIt(Cpy As String, CName As String)

    Do
    Loop Until Dir(Worksheets("Workpad").[b1] & "NEW INVOICES\FOR EMAILING\To Email.pdf") <> ""

    Name Worksheets("Workpad").[b1] & "NEW INVOICES\FOR EMAILING\To Email.pdf" As Worksheets("Workpad").[b1] & _
    "NEW INVOICES\FOR EMAILING\" & CName & Cpy & ".pdf"

    Do While Dir(Worksheets("Workpad").[b1] & "NEW INVOICES\FOR EMAILING\To Email.pdf") <> ""
    Loop

End Sub

...创建文件路径访问错误

Sub RenameIt(Cpy As String, CName As String)

    On Error Resume Next
    Do
        Err.Clear
        Do
        Loop Until Dir(Worksheets("Workpad").[b1] & "NEW INVOICES\FOR EMAILING\To Email.pdf") <> ""

        Name Worksheets("Workpad").[b1] & "NEW INVOICES\FOR EMAILING\To Email.pdf" As Worksheets("Workpad").[b1] & _
        "NEW INVOICES\FOR EMAILING\" & CName & Cpy & ".pdf"

        Do While Dir(Worksheets("Workpad").[b1] & "NEW INVOICES\FOR EMAILING\To Email.pdf") <> ""
        Loop
    Loop Until Err.Number = 0

End Sub

...在创建第一个文件(未重命名)后锁定计算机

【问题讨论】:

  • 如何启动外部 PDF 创建器?
  • 你好。感谢您的关注。 PDF 创建器 (Bullzip) 作为打印机安装,因此 PDF 是由 VBA 作为常规打印作业创建的。

标签: excel vba


【解决方案1】:

回顾一下。情况是您启动了一个开始写入文件的异步进程,并且您希望在异步进程完成后重命名该文件。但是,您不知道该过程何时完全完成。看起来好像打印过程创建了文件,然后开始写入它。在此期间,操作系统保持文件锁定并且无法重命名。

您当前的解决方案不会测试Name 操作是否成功。当文件被锁定时它将失败。您需要在手术后立即检查。

Sub RenameIt(Cpy As String, CName As String)

  Do
    Wscript.Sleep 100
  Loop Until Dir(Worksheets("Workpad").[b1] & "NEW INVOICES\FOR EMAILING\To Email.pdf") <> ""

  Do
    Wscript.Sleep 100
    Name Worksheets("Workpad").[b1] & _
         "NEW INVOICES\FOR EMAILING\To Email.pdf" _
      As Worksheets("Workpad").[b1] & _
         "NEW INVOICES\FOR EMAILING\" & CName & Cpy & ".pdf"
  Loop Until Err.Number = 0

End Sub

应该可以解决问题。这样做是重复的,直到文件不再被打印过程锁定。对于人类来说,它的睡眠时间可以忽略不计,但对于计算机来说却足够长,每次迭代。您可能还想添加一个循环计数器,以确保操作在一定时间后中止并出现错误,而不是挂起。

【讨论】:

  • 感谢您的帮助
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-03-23
  • 2020-02-03
  • 1970-01-01
  • 1970-01-01
  • 2014-03-16
  • 2013-02-12
  • 1970-01-01
相关资源
最近更新 更多