VBA Do Until循环有时会失败

时间:2014-07-23 05:32:38

标签: excel vba excel-vba

我正在编写一些非常基本的Excel VBA宏来处理在工作表上拆分和合并大型工作簿。我已经把它解决了,但我间歇性地发生了故障(大约10次中有10次),我似乎无法可靠地重现,更不用说修复了。

我感兴趣的文件夹中有205个左右的单片工作簿,宏使用Dir()循环遍历它们,当它到达空文件名时结束。除了有时它没有。

偶尔会在随机点停止浏览这些文件。我已经看到它发生在60-190之间的导入,它只是停止执行,没有错误或警告。

有没有人碰过类似的东西?这是excel中的内存问题吗?我在这里失去了理智。在循环中添加一个计时器以减慢它的速度并没有帮助。我合并的文件夹中没有打开的文件。抑制合并过程中弹出的警报不是问题。

这是循环的代码:

    strFilename = Dir(myPath & "\*.xlsx", vbNormal)

    If Len(strFilename) = 0 Then Exit Sub

    Do Until strFilename = ""
        Set wbSrc = Workbooks.Open(fileName:=myPath & "\" & strFilename, UpdateLinks:=False)
        Set wsSrc = wbSrc.Worksheets(1)
        wsSrc.Copy after:=wbDst.Worksheets(wbDst.Worksheets.Count)
        wbSrc.Close False
        strFilename = Dir()
    Loop

1 个答案:

答案 0 :(得分:6)

非常感谢Rory对移位键提示的评论(当然还有所有其他帮助)。没有使用Shift键的宏运行,但偶尔我使用alt-tabbed,我使用alt-shift-tab或其他组合使用shift并打破它由于Excel'&#34 ;打开时没有转变"安全规则。

microsoft support页面上的文档解决了这个问题,包括检测Shift键何时被保持并在Do Until中运行另一个循环,阻止open被释放直到它被释放。

最终相关代码:

'Declare API
Declare Function GetKeyState Lib "User32" _
(ByVal vKey As Integer) As Integer
Const SHIFT_KEY = 16

Function ShiftPressed() As Boolean
'Returns True if shift key is pressed
    ShiftPressed = GetKeyState(SHIFT_KEY) < 0
End Function

...

    Do Until strFilename = ""
        Do While ShiftPressed()
            DoEvents
        Loop
        Set wbSrc = Workbooks.Open(fileName:=myPath & "\" & strFilename, UpdateLinks:=False)
        Set wsSrc = wbSrc.Worksheets(1)
        wsSrc.Copy after:=wbDst.Worksheets(wbDst.Worksheets.Count)
        wbSrc.Close False
        strFilename = Dir()
    Loop