我在编写的两个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命令连接到该行。 如果您只是取消错误消息窗口并重试,它可以正常工作。
我检查过以下内容:
我真的不知道问题可能是什么......没有看到第一次运行和后续运行之间的区别。
非常感谢任何提示。 欢呼声。
编辑:另一方面,我设法排除了FileSystemObject是问题根源的可能性,因为我在运行脚本时遇到了同样的问题而没有真正做到任何与文件。
答案 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删除它。