VBA子活动时未更新文本框

VBA子活动时未更新文本框,vba,excel,Vba,Excel,我在工作表“main”中有一个大单元格,其中包含几个文本控件。这些单元格链接到图纸“参考”中的命名单元格。“main”中有一个按钮,用于启动VBA sub 开始时,潜艇会 Application.ScreenUpdating = False Application.DisplayAlerts = False Application.Calculation = xlCalculationManual 然后,它更新工作表“Refs”中名称后面的单元格,每个更新都由 Application.Scre

我在工作表“main”中有一个大单元格,其中包含几个文本控件。这些单元格链接到图纸“参考”中的命名单元格。“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 sub需要一段时间才能完成,因此其目的是向用户提供有关正在发生的事情的反馈。不幸的是,直到VBA子对象返回,文本框才会更新

如果我把formula=Down_状态放在“main”工作表的一个单元格中,我会看到它随着VBA例程的运行而更新。Down_State与RefsSheet.Cells(行downldstat、列downldstat)的单元格相同。我不喜欢使用这种方法,因为有几个文本框,整个想法就是从这样的设计中迁移过来

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

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


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

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

你说

这个想法是向用户提供关于发生了什么的反馈

如果无法更新单元格,那么在代码运行时创建一个用户表单可能会很有用

这里有一个指向您可以使用的userform类型的链接,它只显示一个进度条 (这在执行大量循环时最容易使用,但可以用于线性代码,只要不关心精度百分比)

从链接:

    PctDone = Counter / (RowMax * ColMax)
    With UserForm1
        .FrameProgress.Caption = Format(PctDone, "0%")
        .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
    End With
'DoEvents语句负责表单更新 多芬特

如果需要,您可以编辑userform和代码,只需更新

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


这是一种您可以向用户反馈sub正在运行的方式,但是它可能不适合您的需要

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

你说

这个想法是向用户提供关于发生了什么的反馈

如果无法更新单元格,那么在代码运行时创建一个用户表单可能会很有用

这里有一个指向您可以使用的userform类型的链接,它只显示一个进度条 (这在执行大量循环时最容易使用,但可以用于线性代码,只要不关心精度百分比)

从链接:

    PctDone = Counter / (RowMax * ColMax)
    With UserForm1
        .FrameProgress.Caption = Format(PctDone, "0%")
        .LabelProgress.Width = PctDone * (.FrameProgress.Width - 10)
    End With
'DoEvents语句负责表单更新 多芬特

如果需要,您可以编辑userform和代码,只需更新

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


这是一种您可以向用户反馈sub正在运行的方式,但是它可能不适合您的需要

将您的
更新状态更改为此

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

现在测试它;)

将您的
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

现在测试它;)

您可以在下面的单元格中显示更新。。例如,“正在处理数据时请稍候…”或自定义消息,以便用户知道发生了什么。。。sub完成处理后,清除该单元格的内容并更新文本框。或者在更新
Down_State
单元格后使用
DoEvents
,以便excel有时间更新文本框。您是否尝试过使用“tb.caption=range(“A1”).value”类型的代码强制更新?这可能有用,具体取决于您的实现和电子表格设计。@Siddharth Rout:我添加了一个doevents,但没有帮助。我可以看到您的文件吗?您可以在下面的单元格中显示更新。。例如,“正在处理数据时请稍候…”或自定义消息,以便用户知道发生了什么。。。sub完成处理后,清除该单元格的内容并更新文本框。或者在更新
Down_State
单元格后使用
DoEvents
,以便excel有时间更新文本框。您是否尝试过使用“tb.caption=range(“A1”).value”类型的代码强制更新?这可能有用,具体取决于您的实现和电子表格设计。@Siddharth Rout:我添加了一个doevents,但没有帮助。我能看到您的文件吗?哇,非常感谢!你没有笑!这是我对VBA的第一次曝光,来自C++世界。<代码>,你没有笑!<我可以笑,也可以帮你。我选择了后者,因为第一个不会完成任何事情;)请记住,我们在某一点上都是新手……我怀疑在多处理器系统上可能还会出现一个剩余的nit。在等待过程中,可以按下下载按钮启动第二次执行GetData。没什么大不了的,但我在这里已经远远超出了我的能力范围。不知道这两个执行是否共享除工作表上的单元格以外的任何变量。在任何情况下,有没有办法让GetData知道是否有另一个执行正在进行?哇,非常感谢!你没有笑!这是我对VBA的第一次曝光,来自C++世界。<代码>,你没有笑!<我可以笑,也可以帮你。我选择了后者,因为第一个不会完成任何事情;)请记住,我们在某一点上都是新手……我怀疑在多处理器系统上可能还会出现一个剩余的nit。在等待过程中,可以按下下载按钮启动第二次执行GetData。没什么大不了的,但我在这里已经远远超出了我的能力范围。不知道这两个执行是否共享除工作表上的单元格以外的任何变量。在任何情况下,GetData有没有办法知道是否有另一个执行正在进行?