【问题标题】:VBA Excel cell refresh problem before ScreenUpdating falseScreenUpdating false之前的VBA Excel单元格刷新问题
【发布时间】:2020-07-04 11:19:05
【问题描述】:

我遇到了一个问题,应该没什么大不了的,但即使看起来很简单,我也没有找到解决方法。

我有一个代码应该遍历文件夹中的文件并将其内容复制到 1 个最终文件中。

为避免屏幕闪烁,我在开始循环之前使用Application.ScreenUpdating = False,并在循环结束时将其恢复为 True。

我也在A1中写,“处理中请稍候”,循环结束时我清空A1。

我通过放置在 MySheet 上的活动 x 命令按钮调用函数 LoopThroughFiles。

问题是“A1”单元格上的消息并不总是出现!有时它会出现,有时它不会。大多数情况下,我第一次启动代码时它会出现,而不是在 3-4 次测试后它会停止出现,而不是在几次测试后它会再次出现,依此类推。这是随机的。 这是我注意到的:

如果我删除 Application.ScreenUpdating = False,它总是会出现。 如果我在 Application.ScreenUpdating = False 之前放置一个断点或一个消息框,它也总是出现。

我认为Application.ScreenUpdating = False,在A1.value =“Processing please wait”之后来得太快了,所以A1被填满了,但是Application.ScreenUpdating = False来得太快,所以在之前生效A1 的内容出现,屏幕不刷新。 我尝试在 Application.ScreenUpdating = False 之前放置一个 Doevents,但仍然存在同样的问题,知道如何解决这个问题并让 A1 内容始终出现在 Application.ScreenUpdating = False 之前?

这是我的代码的样子

Private Sub CommandButton1_Click()
Call LoopThroughFiles
End Sub

Public Function LoopThroughFiles() As String
'Declare Variables etc...

'I change the Value of A1
With ThisWorkbook.Sheets(MySheet).Range("A1")
.Font.Color = -16776961
.Font.Bold = True
.Value = "Processing, Please Wait ..."
End with

Application.ScreenUpdating = False

'MyLoop
'The Rest of code

Application.ScreenUpdating = True
'I clear A1
With ThisWorkbook.Sheets(MySheet).Range("A1")
.Value = vbNullString
.Font.ColorIndex = xlAutomatic
.Font.Bold = False
End with

End function

【问题讨论】:

    标签: excel vba


    【解决方案1】:

    试着放

    Application.ScreenUpdating = True
    

    将内容写入 A1 后。这看起来像

    With ThisWorkbook.Sheets(MySheet).Range("A1")
    .Font.Color = -16776961
    .Font.Bold = True
    .Value = "Processing, Please Wait ..."
    End with
    Application.ScreenUpdating = True
    Application.ScreenUpdating = False
    
    

    【讨论】:

    • 我也试过了,没用,我把 screenupdating = true 后跟 doevents 放在 screenupdating flase 之前,它也没有用...不知道我是否应该做一个do 事件循环或 debug.print 循环使其变慢或类似的东西?但老实说,我没有找到合适的方法,这就是我在这里问的原因
    • 我也想过等待或睡眠,但知道刷新需要多长时间吗?避免浪费时间?除了在 vba 上进行屏幕更新之外,还有其他指令可以刷新单元格内容的新值吗?
    • 这很奇怪,我也遇到过这个问题,只需要 ScreenUpdating = True 才能禁用它出现。我认为您尝试睡觉或等待 1 秒,看看是否有任何变化
    • 我同意这很奇怪,我只是提供了我使用的解决方案,您可以在上面查看,感谢您的帮助
    【解决方案2】:

    如果它可以帮助某人,我通过添加一个循环来减慢代码来解决我的问题。 我不喜欢使用等待,因为等待至少 1 秒,我不需要等待 1 秒 我不喜欢使用 Sleep,因为它是一个 API,我更喜欢使用原生 vba,这样对版本的兼容性会更好 我必须在 debug.print 或 doevents 循环之间进行选择,我更喜欢这样做:

    Dim cptWait as integer
    For cptWait = 1 To 75
    Debug.Print "Wait 75"
    Next cptWait
    

    所以函数变成了这样

    Public Function LoopThroughFiles() As String
    'Declare Variables etc...
    
    'I change the Value of A1
    With ThisWorkbook.Sheets(MySheet).Range("A1")
    .Font.Color = -16776961
    .Font.Bold = True
    .Value = "Processing, Please Wait ..."
    End with
    
    Dim cptWait as integer
    For cptWait = 1 To 75
    Debug.Print "Wait 75"
    Next cptWait
    
    Application.ScreenUpdating = False
    
    'MyLoop
    'The Rest of code
    
    Application.ScreenUpdating = True
    'I clear A1
    With ThisWorkbook.Sheets(MySheet).Range("A1")
    .Value = vbNullString
    .Font.ColorIndex = xlAutomatic
    .Font.Bold = False
    End with
    
    End function
    

    感谢所有试图提供帮助的人

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 1970-01-01
      • 2013-04-18
      相关资源
      最近更新 更多