Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Excel 闪烁屏幕VBA宏_Excel_Vba - Fatal编程技术网

Excel 闪烁屏幕VBA宏

Excel 闪烁屏幕VBA宏,excel,vba,Excel,Vba,设置 我在excel中创建了一个报告,该报告将数据从API提取到PowerPivot数据模型中,该模型运行多个pivot表和图形。除此之外,还有一个非常简单的宏更新整个工作簿,以便提取新数据 问题 当我按下我为宏制作的按钮时,报告中的标题、文本框和图像开始闪烁,一旦过程完成,它们完全消失,只有当按下它们时才会显示出来。它们似乎被隐藏起来了 我正在寻找解决这个问题的方法——在谷歌上搜索了几种方法,但似乎都不起作用 尝试过的解决方案 我尝试了几种解决方案,同时将代码插入到类似的内容中,如下图所示,并

设置

我在excel中创建了一个报告,该报告将数据从API提取到PowerPivot数据模型中,该模型运行多个pivot表和图形。除此之外,还有一个非常简单的宏更新整个工作簿,以便提取新数据

问题

当我按下我为宏制作的按钮时,报告中的标题、文本框和图像开始闪烁,一旦过程完成,它们完全消失,只有当按下它们时才会显示出来。它们似乎被隐藏起来了

我正在寻找解决这个问题的方法——在谷歌上搜索了几种方法,但似乎都不起作用

尝试过的解决方案

我尝试了几种解决方案,同时将代码插入到类似的内容中,如下图所示,并简单地围绕
应用程序进行包装

Sub startcode()
     Application.ScreenUpdating = False
     Call myrunningsub()
     Application.ScreenUpdating = True
End Sub

Sub myrunningsub()
    'MY CODE HERE
End Sub
我也测试了这个:

Private Declare Function SendMessage Lib "user32" Alias "SendMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const WM_SETREDRAW = &HB
Sub DataRefresh()
    SendMessage Application.hwnd, WM_SETREDRAW, 0&, 0&
   MY CODE HERE
    SendMessage Application.hwnd, WM_SETREDRAW, 1&, 0&        
End Sub
我的代码

Sub workbook_refreshAll()

Sheets("Employee Analysis").Range("J5") = ""

ActiveWorkbook.RefreshAll

Sheets("Employee Analysis").Range("J5").Select
ActiveCell.Formula = "=today()"

End Sub

Excel中的VBA有一些已知的最佳实践,可以使您的代码更快

#1。不要复制和粘贴

Sub workbook_refreshAll()

Sheets("Employee Analysis").Range("J5") = ""

ActiveWorkbook.RefreshAll

Sheets("Employee Analysis").Range("J5").Select
ActiveCell.Formula = "=today()"

End Sub
复制和粘贴(或粘贴特殊功能)速度较慢。使用以下命令复制和粘贴值的速度大约快25倍

    Range("A1:Z100").value = Range("A101:Z200").value
如果您这样做,您的代码可能会正常工作。如果您在多行上执行此操作,则Mamory可能有问题

#2。计算

通常,当某个单元格或某个单元格范围的前导项发生更改时,Excel将重新计算该单元格或该单元格范围。这可能会导致工作簿重新计算过于频繁,从而降低性能。您可以使用以下语句防止Excel重新计算工作簿:

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
在代码结束时,可以使用以下语句将计算模式设置回自动:

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
但是请记住,当计算模式为xlCalculationManual时,Excel不会更新单元格中的值。如果宏依赖于更新的单元格值,则必须使用
.Calculate
方法(如
工作表(1).Calculate
)强制执行计算事件

#3。屏幕更新

每次VBA将数据写入工作表时,它都会刷新您看到的屏幕图像。刷新图像会对性能造成相当大的拖累。以下命令关闭屏幕更新

    Application.ScreenUpdating = False
在宏结束时,使用以下命令重新打开屏幕更新

    Application.ScreenUpdating = True
#4忽略事件

如果对工作簿的Sheet1执行了
工作表\u更改
事件。任何时候更改工作表1上的单元格或区域时,将运行
工作表\u Change
事件。因此,如果您有一个标准宏,它可以处理Sheet1上的多个单元格,则每次更改该工作表上的单元格时,宏都必须在
工作表\u Change
事件运行时暂停。您可以想象这种行为会如何减慢宏的速度

    Application.EnableEvents = False
在代码末尾,您可以使用以下语句将
EnableEvents
模式设置回True:

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True

Excel中的VBA有一些已知的最佳实践,可以使您的代码更快

#1。不要复制和粘贴

Sub workbook_refreshAll()

Sheets("Employee Analysis").Range("J5") = ""

ActiveWorkbook.RefreshAll

Sheets("Employee Analysis").Range("J5").Select
ActiveCell.Formula = "=today()"

End Sub
复制和粘贴(或粘贴特殊功能)速度较慢。使用以下命令复制和粘贴值的速度大约快25倍

    Range("A1:Z100").value = Range("A101:Z200").value
如果您这样做,您的代码可能会正常工作。如果您在多行上执行此操作,则Mamory可能有问题

#2。计算

通常,当某个单元格或某个单元格范围的前导项发生更改时,Excel将重新计算该单元格或该单元格范围。这可能会导致工作簿重新计算过于频繁,从而降低性能。您可以使用以下语句防止Excel重新计算工作簿:

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
在代码结束时,可以使用以下语句将计算模式设置回自动:

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
但是请记住,当计算模式为xlCalculationManual时,Excel不会更新单元格中的值。如果宏依赖于更新的单元格值,则必须使用
.Calculate
方法(如
工作表(1).Calculate
)强制执行计算事件

#3。屏幕更新

每次VBA将数据写入工作表时,它都会刷新您看到的屏幕图像。刷新图像会对性能造成相当大的拖累。以下命令关闭屏幕更新

    Application.ScreenUpdating = False
在宏结束时,使用以下命令重新打开屏幕更新

    Application.ScreenUpdating = True
#4忽略事件

如果对工作簿的Sheet1执行了
工作表\u更改
事件。任何时候更改工作表1上的单元格或区域时,将运行
工作表\u Change
事件。因此,如果您有一个标准宏,它可以处理Sheet1上的多个单元格,则每次更改该工作表上的单元格时,宏都必须在
工作表\u Change
事件运行时暂停。您可以想象这种行为会如何减慢宏的速度

    Application.EnableEvents = False
在代码末尾,您可以使用以下语句将
EnableEvents
模式设置回True:

    Application.Calculation = xlCalculationManual
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True

不,这不是
with
的功能。它只是将对对象的引用存储到一个临时变量中,这个临时变量也可以手动完成。它不会将一系列更改压缩为一个复杂的更改。同意。删除。我会重写它而不是删除它。如果您实际上在每行上为多行重新查询同一对象,例如
工作表(“…”).range(“…”).Property1
工作表(“…”).range(“…”).Property2
,它确实会加快速度,而且它确实会使它看起来很干净。它只是没有将一系列变化压缩成一个的神奇特性。2号、3号和4号的组合成功了谢谢你的帮助!不,这不是
with
的功能。它只是将对对象的引用存储到