Excel 如何在VBA for Windows中重命名文件之前知道文件是何时创建的

Excel 如何在VBA for Windows中重命名文件之前知道文件是何时创建的,excel,vba,Excel,Vba,我这一次头痛得很厉害,还没好 我使用VBA宏创建了许多文件,并在运行时对它们进行了重命名(这与旧版本Excel(2003)中的PDF创建有关,使用外部PDF编写器要求初始文件名为默认文件名,以防您感到奇怪) 我希望宏在尝试重命名文件之前等待文件创建完成。然后,我希望宏在创建另一个文件之前等待文件重命名。这并不像听起来那么容易。像Do While Dir(文件名)“-Loop和Do While Dir(文件名)=”这样的尝试要么生成路径文件访问错误(同样,是自动运行的结果-在恢复时工作),要么锁定

我这一次头痛得很厉害,还没好

我使用VBA宏创建了许多文件,并在运行时对它们进行了重命名(这与旧版本Excel(2003)中的PDF创建有关,使用外部PDF编写器要求初始文件名为默认文件名,以防您感到奇怪)

我希望宏在尝试重命名文件之前等待文件创建完成。然后,我希望宏在创建另一个文件之前等待文件重命名。这并不像听起来那么容易。像Do While Dir(文件名)“-Loop和Do While Dir(文件名)=”这样的尝试要么生成路径文件访问错误(同样,是自动运行的结果-在恢复时工作),要么锁定计算机

任何帮助都将不胜感激

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
子重命名EIT(Cpy作为字符串,CName作为字符串)
做
循环至目录(工作表(“工作板”)[b1]“新发票\用于发送电子邮件\至Email.pdf”)“”
将工作表(“工作台”)[b1]、“用于发送电子邮件的新发票\发送至Email.pdf”命名为工作表(“工作台”)[b1]、_
“新发票\用于发送电子邮件\”&CName&Cpy&“.pdf”
Do While Dir(工作表(“工作板”)[b1]和“新发票\用于发送电子邮件\至Email.pdf”)“”
环
端接头
…创建文件路径访问错误

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
子重命名EIT(Cpy作为字符串,CName作为字符串)
出错时继续下一步
做
呃,明白了
做
循环至目录(工作表(“工作板”)[b1]“新发票\用于发送电子邮件\至Email.pdf”)“”
将工作表(“工作台”)[b1]、“用于发送电子邮件的新发票\发送至Email.pdf”命名为工作表(“工作台”)[b1]、_
“新发票\用于发送电子邮件\”&CName&Cpy&“.pdf”
Do While Dir(工作表(“工作板”)[b1]和“新发票\用于发送电子邮件\至Email.pdf”)“”
环
循环直到错误号=0
端接头

。。。在创建第一个文件(未重命名)后锁定计算机。这种情况是,您启动了一个异步进程,该进程开始写入文件,并且希望在异步进程完成后重命名该文件。但是,您不知道该过程何时完全完成。看起来好像打印过程创建了该文件,然后开始写入该文件。在此期间,操作系统将锁定文件,并且无法重命名该文件

您当前的解决方案不会测试
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
子重命名EIT(Cpy作为字符串,CName作为字符串)
做
Wscript.Sleep 100
循环至目录(工作表(“工作板”)[b1]“新发票\用于发送电子邮件\至Email.pdf”)“”
做
Wscript.Sleep 100
命名工作表(“工作台”)[b1]和_
“新发票\用于发送电子邮件\至Email.pdf”_
作为工作表(“工作台”)[b1]和_
“新发票\用于发送电子邮件\”&CName&Cpy&“.pdf”
循环直到错误号=0
端接头

我们应该做到这一点。重复此操作,直到文件不再被打印过程锁定。对于人类来说,睡眠时间可以忽略不计,但对于计算机来说,每次迭代都足够长。您可能还需要添加一个循环计数器,以确保操作在一定时间后会因错误而中止,而不是挂起。

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