我有一个宏excel,可以做很多事情。其中一个是运行查询(通过ADODB.Connection)。查询可以持续很多,所以我想:
在伪代码中:
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
答案 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)
对于非冻结这样做: 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
希望它对你有所帮助。