我在工作表“main”中有一个包含多个文本控件的大单元格。这些链接到工作表“Refs”中的命名单元格。 “main”中有一个按钮,用于启动VBA子。
一开始,子确实......
Application.ScreenUpdating = False
Application.DisplayAlerts = False
Application.Calculation = xlCalculationManual
然后它更新工作表“Refs”中名称后面的单元格每个更新都被
包围Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
RefsSheet.Cells(row_downldstat, col_downldstat) = state
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
VBA sub需要一段时间才能完成,因此我们的想法是向用户提供有关正在发生的事情的反馈。不幸的是,在VBA子返回之前,文本框不会更新。
如果我将公式= Down_State放在“主”表格的单元格中,我会看到它在VBA例程运行时更新。 Down_State与RefsSheet.Cells(row_downldstat,col_downldstat)是同一个单元格。我不喜欢使用这种方法,因为有几个文本框,整个想法是从这样的设计迁移。
请注意,文本框只是在单元格中,而不是在表单中。
我确实知道application.statusbar,但这并不是很明显。
如何在VBA子活动时更新这些文本框?
答案 0 :(得分:1)
将您的UpdateStatus
更改为此。
Sub UpdateStatus(state As String)
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
RefsSheet.Cells(row_downldstat, col_downldstat) = state
Wait 1
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.DisplayStatusBar = True
Application.StatusBar = state
End Sub
并在上面添加这个新子。
Private Sub Wait(ByVal nSec As Long)
nSec = nSec + Timer
While nSec > Timer
DoEvents
Wend
End Sub
现在测试它;)
答案 1 :(得分:0)
我不确定这是否正是您所需要的:
你说这个想法是向用户提供关于正在发生什么的反馈
如果您无法更新单元格,那么创建在代码运行时出现的用户窗体可能会很有用。
这是指向您可以使用的一种用户形式的链接,它只显示一个进度条 (这在你进行大量循环时最容易使用,但只要你不关心百分比准确度就可以用在线性代码中)
http://spreadsheetpage.com/index.php/tip/displaying_a_progress_indicator/
从链接:
PctDone = Counter / (RowMax * ColMax)
With UserForm1
.FrameProgress.Caption = Format(PctDone, "0%")
.LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
End With
'DoEvents语句负责表单更新 的DoEvents
如果您愿意,可以编辑用户表单和代码以简单地更新
.frameprogress.caption =format(pctdone, "0%")
到
.frameprogress.caption = "String of desired text"
这种方式可以让用户反馈子工作正在运行但是它可能不是最适合您的需求