VBA“kill file”在第一次运行时不起作用,但在所有后续运行时起作用

VBA“kill file”在第一次运行时不起作用,但在所有后续运行时起作用,vba,excel,ms-word,Vba,Excel,Ms Word,我在我编写的两个VBA脚本上遇到了一个相当奇怪的错误,我无法准确地指出问题所在 这是两个VBA宏,它们处理相同的功能,一个用于Word,一个用于Excel。 宏所做的是将一些信息解析为一个临时的.txt文件,该文件是这样创建的: Dim Appl Set Appl = CreateObject("WScript.Shell").Exec("cmd.exe /k im viewissue " & issue & " > " & "D:\temp" & issu

我在我编写的两个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文件

编辑:因此:

编辑结束

宏处理完文件后,会将其删除:

Kill "D:\temp" & issue & ".txt"
一切工作都没有任何问题:文件被创建,信息提取工作,文件被删除。。。除非你第一次尝试运行它

第一次尝试在新启动的机器上运行它时,会出现运行时错误70:使用kill命令连接到线路的访问被拒绝。 如果您只需取消错误消息窗口并重试,它就可以正常工作

我已经检查了以下内容:

.txt文件即使在第一次运行时也会创建 权限设置正确,以便能够在没有问题的情况下手动删除它 启动后Word和Excel宏上都存在相同的问题 在Word上运行带有错误消息的脚本可以消除第一次运行Excel脚本时出现的问题,反之亦然,即使在错过尝试后已删除搁浅的.txt文件 我真的不知道可能是什么问题。。。不太清楚第一次运行和后续运行之间的区别

任何一种暗示都是非常感激的。 干杯


编辑:另一方面,我已经设法排除了这种可能性,即FileSystemObject是问题的根源,因为我在运行脚本而不实际处理文件时也遇到了同样的问题。

代码问题,“在调试或第二次调试时”通常会从清理或后台处理中出现。在许多情况下,在调用相关部分后添加“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"

希望有帮助。

假设MS Office的内部流程没有在您要删除文件时完成,最简单的方法应该是将删除延迟到其他时间,例如,关闭之前。另一个明显的终止文件的时间是在再次使用它之前,但这会违反直觉,因为当重新使用该名称时,现有文件将被重写。我想指出的是,删除该文件并不是一件可怕的事情,而设计程序的微软工程师们可能已经考虑到了这一事实。

因此,我偶然发现了解决方案:

在新机器上第一次运行时,Integrity客户端(我在命令行中使用im命令调用)返回了一些有关连接的信息

此输出似乎混淆了脚本,导致它无法再次关闭命令窗口,从而保留了.txt文件的文件句柄。 导致kill命令由于权限问题而无法删除该文件

不过,谢谢你的所有意见!
仍然非常感谢。

微软在这个问题上有答案。有问题的文件可能已打开。
指向文件的变量可以在您不知道的情况下将其作为人质。它将不允许您删除它。将变量设置为nothing,然后重试,或者更好的做法是,在继续使用kill或DeleteFile删除文件之前,尝试Microsoft的解决方案检查文件是否打开。

尝试Application.Doevents before。Jochen,您将如何以及在何处准确调用该函数?感谢您的建议Jochen,但它仍然不起作用。我在第一次跑步时仍然遇到同样的问题。。。另请参阅我对上述问题描述的编辑。这是一个很好的建议,但该文件仅在脚本末尾被删除。。。我不太喜欢只在下一个脚本运行时删除旧文件的想法,因为如果脚本没有定期运行,您的计算机上会有一个文件存在很长一段时间。。。
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"