我在我编写的两个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"
一切正常,没有任何问题:创建文件,提取信息,删除文件......第一次尝试运行时除外。
第一次尝试运行它(在刚启动的机器上)时,使用kill命令连接到该行的“运行时错误70:拒绝访问”。如果您只是取消错误消息窗口并再试一次,它可以正常工作。
我检查过以下内容:
我真的不知道问题可能是什么......没有看到第一次运行和后续运行之间的区别。
任何形式的提示都非常感激。干杯。
编辑:另一方面,我已经设法排除了FileSystemObject是问题根源的可能性,因为我在运行脚本时遇到了同样的问题而没有对文件做任何实际操作。
所以我偶然遇到了解决方案:
在新机器上首次运行时,我在命令行中使用“im”命令调用的Integrity Client正在返回有关conncection的一些信息。
此输出似乎混淆了脚本,导致它不再关闭命令窗口,从而在.txt文件上保留文件句柄。由于权限问题导致kill-command无法删除文件。
谢谢你的所有意见!仍然非常感谢。
代码问题,“在调试时或第二次”工作时经常出现在清理或后台处理中。在许多情况下,在调用相关部件后添加“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的内部进程没有使用您想要删除它时要删除的文件,最简单的方法应该是将删除延迟到其他时间,例如,Before_Close。杀死文件的另一个明显时间是在你再次使用它之前,但这是违反直觉的,因为当重用名称时,现有文件将被覆盖。我的意思是指出,没有这么可怕的删除文件,并且设计他们的程序而不是立即放弃它的MS工程师可能已经考虑过这个事实。
微软在这个问题上有答案。有问题的文件可能是开放的。 https://support.microsoft.com/en-us/help/291295/macro-code-to-check-whether-a-file-is-already-open指向文件的变量可以在不知情的情况下将其保留为人质。它不允许您删除它。将变量设置为空,然后再试一次或更好,尝试使用Microsoft的解决方案检查文件是否已打开,然后再使用kill或DeleteFile删除它。