【问题标题】:Text boxes not being updated while VBA sub activeVBA 子活动时文本框未更新
【发布时间】:2012-08-16 14:33:09
【问题描述】:

我在工作表“main”中有一个大单元格,其中包含多个文本控件。这些链接到工作表“Refs”中的命名单元格。 “main”中有一个按钮,用于启动 VBA sub。

一开始,子做...

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 子程序需要一段时间才能完成,因此我们的想法是向用户提供有关正在发生的事情的反馈。不幸的是,在 VBA 子返回之前,文本框不会更新。

如果我将公式 =Down_State 放在“主”工作表的单元格中,我会看到它随着 VBA 例程的运行而更新。 Down_State 与 RefsSheet.Cells(row_downldstat, col_downldstat) 相同。我不喜欢使用这种方法,因为有几个文本框,整个想法是从这样的设计中迁移出来。

请注意,文本框只是在单元格中,而不是在表单中。

我确实知道 application.statusbar 但这不是很明显。

如何在 VBA 子处于活动状态时更新这些文本框?

【问题讨论】:

  • 您可以在下面的单元格中显示更新。例如“正在处理数据时请稍候...”或自定义消息,以便用户知道发生了什么...一次子完成处理,清除该单元格的内容并更新文本框。
  • 或在更新Down_State 单元格后使用DoEvents,以便excel 有时间更新文本框。
  • 您是否尝试过使用“tb.caption = range("A1").value”类型的代码强制更新?根据您的实施和电子表格设计,这可能很有用。
  • @Siddharth Rout:我添加了一个 doevents 但没有帮助。
  • 我可以看到你的文件吗?

标签: vba excel


【解决方案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

现在测试它;)

【讨论】:

  • 哇,非常感谢!而你没有笑!这是我第一次接触来自 c++ 世界的 VBA。
  • And you didn't laugh! 我可以笑也可以帮你。我选择了后者,因为第一个不会完成任何事情;)请记住,我们都曾在某个时候或其他时候都是新手...
  • 我怀疑多处理器系统上可能还会出现一个剩余的 nit。在等待期间,可以按下下载按钮启动 GetData 的第二次执行。没什么大不了的,但我在这里超出了我的深度。不知道这两个执行是否共享工作表上单元格以外的任何变量。无论如何,GetData 有什么方法可以知道是否有另一个执行正在进行中?
【解决方案2】:

我不确定这是否正是您想要的:

你说

这个想法是向用户提供关于正在发生的事情的反馈

如果您无法更新单元格,也许创建一个在代码运行时出现的用户表单可能会很有用。

这里是您可以使用的一种用户表单的链接,它只是显示一个进度条 (这在您进行大量循环时最容易使用,但可以在线性代码中使用,只要您不关心百分比准确度)

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 语句负责表单更新 做事件

如果你愿意,你可以编辑用户表单和代码来简单地更新

   .frameprogress.caption =format(pctdone, "0%")

   .frameprogress.caption = "String of desired text"

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

【讨论】:

    猜你喜欢
    • 2018-08-16
    • 2018-02-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多