Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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
Vba 运行Excel宏时显示完成百分比_Vba_Excel - Fatal编程技术网

Vba 运行Excel宏时显示完成百分比

Vba 运行Excel宏时显示完成百分比,vba,excel,Vba,Excel,我在宏中使用“工作表更改”事件,每次用户由于访问大数据范围而在下拉列表中选择一个选项时,运行该事件大约需要15-20秒。我想在Excel中显示一个非常基本的%完成状态,让用户知道它正在处理。使用默认的Excel Application.StatusBar就足够了,但它在我的工作簿上不可见 我的工作隐藏/显示列宏: Private Sub Worksheet_Change(ByVal Target As Range) Dim R, V If Target.Address = ("$K$7") T

我在宏中使用“工作表更改”事件,每次用户由于访问大数据范围而在下拉列表中选择一个选项时,运行该事件大约需要15-20秒。我想在Excel中显示一个非常基本的%完成状态,让用户知道它正在处理。使用默认的Excel Application.StatusBar就足够了,但它在我的工作簿上不可见

我的工作隐藏/显示列宏:

Private Sub Worksheet_Change(ByVal Target As Range)

Dim R, V
If Target.Address = ("$K$7") Then
    V = [K7].Value
    For Each R In Range("R3:GJU3")
        If IsError(R.Value) Then
            R.EntireColumn.Hidden = True
        Else
            R.EntireColumn.Hidden = R.Value <> V
        End If
    Next
End If

End Sub
Private子工作表\u更改(ByVal目标作为范围)
暗R,V
如果Target.Address=(“$K$7”),则
V=[K7]。值
对于范围内的每个R(“R3:GJU3”)
如果IsError(R值),则
R.EntireColumn.Hidden=True
其他的
R.entireclumn.Hidden=R.值V
如果结束
下一个
如果结束
端接头
我在一个单独的线程中发现了下面的代码,但不确定如何根据上面的宏修改代码

以下代码记入@eykanal处

选项显式
子状态栏()
作为整数的Dim x
将我的计时器调暗为双精度
'根据需要更改此循环。
对于x=1到250
“虚拟循环只是为了浪费时间。
'用实际代码替换此循环。
我的定时器=定时器
做
循环计时-MyTimer<0.03
Application.StatusBar=“进度:”&x&“共250个:”&格式(x/250,“百分比”)
多芬特
下一个x
Application.StatusBar=False
端接头

按如下方式更新您的代码

Private Sub Worksheet_Change(ByVal Target As Range)

Dim R, V
Dim x As Range
Dim counter As Long
counter = 1

If Target.Address = ("$K$7") Then
    V = [K7].Value
    Set x = Range("R3:GJU3")

    For Each R In Range("R3:GJU3")
        If IsError(R.Value) Then
            R.EntireColumn.Hidden = True
        Else
            R.EntireColumn.Hidden = R.Value <> V
        End If
        DoEvents
        Application.StatusBar = Format(counter / x.Columns.Count, "Percent")
        counter = counter + 1
    Next R
End If

End Sub
Private子工作表\u更改(ByVal目标作为范围)
暗R,V
Dim x As范围
昏暗的柜台一样长
计数器=1
如果Target.Address=(“$K$7”),则
V=[K7]。值
设置x=范围(“R3:GJU3”)
对于范围内的每个R(“R3:GJU3”)
如果IsError(R值),则
R.EntireColumn.Hidden=True
其他的
R.entireclumn.Hidden=R.值V
如果结束
多芬特
Application.StatusBar=格式(计数器/x.Columns.Count,“百分比”)
计数器=计数器+1
下一个R
如果结束
端接头

您可以为ProgressBar使用一个Userform,结果是

我的Progressbar位于用户表单的下部。 循环时,需要增加进度条的宽度(此处为蓝色按钮)


执行此操作的代码是基本的(简单的树规则)。

这不是进度条,而是状态栏中的显示百分比。对于progressbar,您需要知道如何使用userforms。第二件事,你的代码太慢了。使用vba数组。@PatrickLepelletier我不熟悉vba数组。你有没有一个例子可以加速我的宏?在谷歌或StackOverflow上搜索。你会发现很多例子。我不能在这里添加此代码,因为这不是线程的问题。(或做一个新的)嗨-谢谢你的回复。我用你的代码更新了,但没有看到状态栏动态变化。工作表在运行宏时看起来相同,然后只显示“100”。它在运行时不显示%progression。请使用我所做的修改再试一次与以前一样--功能保留,但不会动态显示任何进度。这一次的最终结果是“100.00%”宏运行完毕。好的,还有一个修改。我正试图避免这些事件,因为它会减慢事情的发展。试试看是否对您有效现在进度正在动态显示,但是它似乎与我的show/hide columns宏的计时断开连接。例如,我的show/hide columns宏已完成,并且完成百分比约为4%将继续运行…正如您所说,速度也非常慢。
Private Sub Worksheet_Change(ByVal Target As Range)

Dim R, V
Dim x As Range
Dim counter As Long
counter = 1

If Target.Address = ("$K$7") Then
    V = [K7].Value
    Set x = Range("R3:GJU3")

    For Each R In Range("R3:GJU3")
        If IsError(R.Value) Then
            R.EntireColumn.Hidden = True
        Else
            R.EntireColumn.Hidden = R.Value <> V
        End If
        DoEvents
        Application.StatusBar = Format(counter / x.Columns.Count, "Percent")
        counter = counter + 1
    Next R
End If

End Sub