VBA子活动时未更新文本框

时间:2012-08-16 14:33:10

标签: excel vba excel-vba

我在工作表“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子活动时更新这些文本框?

2 个答案:

答案 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"

这种方式可以让用户反馈子工作正在运行但是它可能不是最适合您的需求