1

我在“主”表中有一个大单元格,其中包含几个文本控件。这些链接到工作表“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 子处于活动状态时更新这些文本框?

4

2 回答 2

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

现在测试它;)

于 2012-08-16T15:53:51.950 回答
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"

这是您可以向用户反馈子正在运行的一种方式,但它可能不是您的需求的最佳选择

于 2012-08-16T15:32:50.570 回答