Excel vba:信息模式窗口(阻止用户,非阻塞宏)

时间:2013-11-13 11:26:02

标签: excel vba

我有一个宏excel,可以做很多事情。其中一个是运行查询(通过ADODB.Connection)。查询可以持续很多,所以我想:

  • 显示模态信息对话框,说“运行查询3”(例如),没有任何按钮(用户无法关闭它)。它应该是对用户的阻止,但对于宏来说是非臃肿的。
  • 运行查询。
  • 关闭信息窗口。

在伪代码中:

dim cn as new ADODB.Connection
dim rs as new ADODB.Recordset

dim dia as InfoDialog
set dia = new InfoDialog "running query 3"

cn.Open cn_string
rs.Open query_string, cn, ...

dia.close

我更喜欢不需要导入新库的解决方案(vba编辑器>工具>参考)。例如,类似于'CreateObject(“WScript.Shell”)'。如果不可能,那么也欢迎库导入(最好是标准库,因为不必在用户的计算机上安装)。


更新:根据Kenda的建议,我创建了一个带有标签“Label1”的userForm“InfoDialog”,并创建了两个库函数以使其易于使用:

sub show_info(text as string)

    InfoDialog.Label1.Caption = text
    InfoDialog.Show
    DoEvents

end sub

sub close_info()

    InfoDialog.Hide

end sub

所以现在我可以写:

show_info "Connecting to db ..."
cn.Open cn_string

show_info "Running query ..."
rs.Open query_string, cn, ...

close_info

2 个答案:

答案 0 :(得分:0)

只需插入带有Label的UserForm,而不是您可以使用的代码

Form1.Show
Form1.Label1.Text="running query 3"
...
Form1.Hide

在最后一个可选的卸载表单Unload Form1

答案 1 :(得分:0)

我在运行宏时遇到了另一个问题。当我运行大型代码时,Excel 2010看起来像冻结,但宏仍然在后台运行。并且用户没有ProgressBar。所以我在Frame中使用带有蓝色BackColor的Label。 (包含:名为lblDescription的标签,名为FrameProgress的Fram,其中Label为LabelProgress) enter image description here

对于非冻结这样做: 1)在激活表单上添加Sub

Private Sub UserForm_activate()
    Call ImportDat
End Sub

2)在Module1中启动Sub

Sub ShowDialog()
    UserForm1.LabelProgress.Width = 0
    UserForm1.Show
End Sub

3)在Module1中使用此代码创建您的Sub(魔术词是DoEvents

Sub ImportDat()
Dim Counter As Integer
Dim RowMax As Integer    
Dim PctDone As Single
  Application.ScreenUpdating = False
  Counter = 1
  RowMax = 10000
  For i = 0 To RowMax -1 
    PctDone = i / RowMax
    With UserForm1
      .lblDescription = "Processing " + CStr(i + 1) + " from " + CStr(RowMax)
      .FrameProgress.Caption = Format(PctDone, "0%")
      .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
    End With
    DoEvents
  Next i
  Application.ScreenUpdating = True
  Unload UserForm1
End Sub

希望它对你有所帮助。