我有一个循环作业,但在循环中我想使用excel vba单击命令按钮这可能是

时间:2017-09-10 16:14:26

标签: excel excel-vba vba

我有一个循环作业但是在循环中我想用excel vba单击命令按钮这可能吗?

Sub workbook_open()
Dim c As Boolean
Dim choice As Range
Dim counter As Integer
Application.ExecuteExcel4Macro "SHOW.TOOLBAR(""Riboon"",true)"
Sheets("psr").Activate

Do
    If choice = ActiveSheet.Shapes.Range(Array("psrnew")).Select Then
        psrnew_reqinfo.Show
        c = False
    Else
        counter = counter + 1
        Range("A1").Value = counter
        'Application.Wait (Now + TimeValue("00:00:05"))
   End If
Loop Until c = True
End Sub

1 个答案:

答案 0 :(得分:0)

这里的问题实际上是关于中断代码的执行并将控制权传递给操作系统以处理消息队列(您的按钮点击事件将耐心地等待)。执行此操作的功能是DoEventshttps://msdn.microsoft.com/en-us/vba/language-reference-vba/articles/doevents-function)。

您拨打DoEvents的频率完全取决于您。很明显,你调用的越多(即中断你自己的代码),你的日常工作就越慢。还有其他与DoEvents相关的问题,但文档应指出正确的方向。

作为您的场景的一个示例,您需要三个例程:一个处理按钮单击(如果它是一个ActiveX按钮,我假设其代码在包含您的按钮的工作表后面),一个在您的模块中使用click事件(在示例代码中,它将模块级别标志更改为False),而模块中的另一个用于运行循环(如果标志为False则结束)。所以......

模块代码

Option Explicit

Private mLeaveLoop As Boolean

Public Sub Main()
    Const LIMIT As Long = 1000000
    Dim counter As Long

    mLeaveLoop = False
    counter = 1
    Do
        counter = counter + 1
        DoEvents
        If counter = LIMIT Then Exit Do 'emergency exit to avoid infinite loop
    Loop Until mLeaveLoop

    Debug.Print "Stopped at " & counter
End Sub

Public Sub ConsumeButtonClick()
    mLeaveLoop = True
End Sub

和您的图纸代码

Option Explicit

Private Sub CommandButton1_Click()
    ConsumeButtonClick
End Sub