VBA"杀死文件"不是第一次运行,而是在以后的所有运行

时间:2017-07-07 08:31:05

标签: vba excel-vba word-vba excel

我在编写的两个VBA脚本上遇到了一个相当奇怪的错误,并且无法完全解释问题所在的位置......

它涉及两个处理相同功能的VBA宏,一个用于Word,一个用于Excel。 宏所做的是将一些信息解析为临时的.txt文件,该文件是这样创建的:

Dim Appl
Set Appl = CreateObject("WScript.Shell").Exec("cmd.exe /k im viewissue " & issue & " > " & "D:\temp" & issue & ".txt")
Appl.Terminate

随后,从.txt文件中提取一些信息,并将其写入Excel / Word文件中。

编辑:同样如此:

Set FileNum = CreateObject("Scripting.FileSystemObject").OpenTextFile("D:\temp" & issue & ".txt", 1)
   'Read some lines and write them into the Word/Excel files...
FileNum.Close

编辑结束。

宏完成文件后删除它:

Kill "D:\temp" & issue & ".txt"

一切正常,没有任何问题:创建文件,提取信息,删除文件......第一次尝试运行时除外。

第一次尝试运行它时(在新启动的计算机上),您会得到一个"运行时错误70:访问被拒绝"使用kill命令连接到该行。 如果您只是取消错误消息窗口并重试,它可以正常工作。

我检查过以下内容:

  • .txt文件已创建(即使在首次运行时)
  • 权限设置正确,以便能够手动删除它而不会出现问题
  • 启动后Word和Excel宏上的同样问题
  • 在Word上运行脚本(带有错误消息)消除了第一次运行Excel脚本时的问题,反之亦然(即使在错过尝试后已删除滞留的.txt文件)

我真的不知道问题可能是什么......没有看到第一次运行和后续运行之间的区别。

非常感谢任何提示。 欢呼声。

编辑:另一方面,我设法排除了FileSystemObject是问题根源的可能性,因为我在运行脚本时遇到了同样的问题而没有真正做到任何与文件。

4 个答案:

答案 0 :(得分:1)

所以我不小心碰到了解决方案:

在新机器上首次运行时,我在命令行中使用“im”命令调用的Integrity Client正在返回有关conncection的一些信息。

这个输出似乎混淆了脚本,导致它没有再次关闭命令窗口,从而在.txt文件上保留文件句柄。 由于权限问题导致kill-command无法删除文件。

感谢您的所有投入! 仍然非常感谢。

答案 1 :(得分:0)

代码问题,在调试时或第二次运行时有效。经常出现在清理或后台处理中。在许多情况下,它有助于添加一个' doevents'在调用相关部分之后。在您的情况下,您可以尝试:

Dim Appl
Set Appl = CreateObject("WScript.Shell").Exec("cmd.exe /k im viewissue " & issue & " > " & "D:\temp" & issue & ".txt")
DoEvents
Appl.Terminate
Doevents
Kill "D:\temp" & issue & ".txt"

希望有所帮助。

答案 2 :(得分:0)

假设MS Office的内部进程在您要删除它时想要删除的文件没有完成,最简单的方法应该是将删除延迟到其他一些时间,例如,Before_Close。杀死文件的另一个明显时间是在你再次使用它之前,但这是违反直觉的,因为当重用名称时,现有文件将被覆盖。我的意思是指出,没有这么可怕的删除文件,并且设计他们的程序而不是立即放弃它的MS工程师可能已经考虑过这个事实。

答案 3 :(得分:0)

Microsoft在此问题上有答案。有问题的文件可能已打开。 https://support.microsoft.com/en-us/help/291295/macro-code-to-check-whether-a-file-is-already-open 指向文件的变量可以在您不知道的情况下将其作为人质。它不允许您删除它。将该变量设置为无,然后重试或更好,请尝试使用Microsoft的解决方案来检查文件是否已打开,然后再使用kill或DeleteFile删除它。