Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/16.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 工作表\u更改设置目标范围缓慢_Vba_Excel - Fatal编程技术网

Vba 工作表\u更改设置目标范围缓慢

Vba 工作表\u更改设置目标范围缓慢,vba,excel,Vba,Excel,我有一个excel宏,用于根据另一个SO问题在“工作表更改”功能中管理excel中的按钮可见性 问题在于,尽管宏可以工作,但它使Excel工作表的更新变得相当滞后。我已成功地将慢度限定为一行: Set rUpdated = Range(Target.Dependents.Address) 这将设置更新为变量的单元格范围,以便稍后在脚本中迭代。如果我用这一行调用脚本,我发现这就是所有延迟的地方。这句话似乎很简单,但有没有更好的方法呢 全面披露: Private Sub Worksheet_Cha

我有一个excel宏,用于根据另一个SO问题在“工作表更改”功能中管理excel中的按钮可见性

问题在于,尽管宏可以工作,但它使Excel工作表的更新变得相当滞后。我已成功地将慢度限定为一行:

Set rUpdated = Range(Target.Dependents.Address)
这将设置更新为变量的单元格范围,以便稍后在脚本中迭代。如果我用这一行调用脚本,我发现这就是所有延迟的地方。这句话似乎很简单,但有没有更好的方法呢

全面披露:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rUpdated As Range
    Dim shp As Shape
    Dim rCell As Range
    Set rUpdated = Range(Target.Dependents.Address)
    If Not rUpdated Is Nothing Then
        For Each rCell In rUpdated
            If rCell.Column = 1 Then
                'Look at each shape in the sheet and cross-reference with rCell.
                For Each shp In Target.Parent.Shapes
                    If shp.TopLeftCell.Row = rCell.Row Then
                        shp.Visible = (rCell.Value <> "")
                        Exit For 'Exit the loop - the correct button has been found.
                    End If
                Next shp
            End If
        Next rCell
    End If
End Sub
Private子工作表\u更改(ByVal目标作为范围)
变暗更新为范围
将shp变暗为形状
变暗rCell As范围
Set rUpdated=范围(Target.Dependents.Address)
如果没有更新,则什么都不是
对于rUpdated中的每个rCell
如果rCell.Column=1,则
'查看表格中的每个形状,并与rCell交叉引用。
对于Target.Parent.Shapes中的每个shp
如果shp.TopLeftCell.Row=rCell.Row,则
shp.Visible=(rCell.Value“”)
“退出循环”的退出-找到了正确的按钮。
如果结束
下一个小水电
如果结束
下一个rCell
如果结束
端接头

因此,如果我理解正确,您希望在行中的单元格发生更改时显示一个按钮。我能想到的唯一能让它慢下来的事情是,那就是必须检查许多
rCell
Shapes
。我不知道你的文件是什么结构。因此,我的想法是:不要每次都看所有的形状,我会用一种模式来命名它们,你可以用它们所在的行来识别它们,这样你就可以用这个名称来称呼它们(即
Row2
,用于第
2
行中的按钮)

Private子工作表\u更改(ByVal目标作为范围)
变暗更新为范围
将shp变暗为形状
变暗rCell As范围
作为对象的Dim obj
Set rUpdated=范围(Target.Dependents.Address)
如果没有更新,则什么都不是
对于rUpdated中的每个rCell
如果rCell.Column=1,则
出错时继续下一步
Set obj=ActiveSheet.OLEObjects(“行”和rCell.Row)
如果Err.Number=0,则
obj.Visible=(rCell.Value“”)
如果结束
如果结束
下一个rCell
如果结束
端接头

因此,如果我理解正确,您希望在行中的单元格发生更改时显示一个按钮。我能想到的唯一能让它慢下来的事情是,那就是必须检查许多
rCell
Shapes
。我不知道你的文件是什么结构。因此,我的想法是:不要每次都看所有的形状,我会用一种模式来命名它们,你可以用它们所在的行来识别它们,这样你就可以用这个名称来称呼它们(即
Row2
,用于第
2
行中的按钮)

Private子工作表\u更改(ByVal目标作为范围)
变暗更新为范围
将shp变暗为形状
变暗rCell As范围
作为对象的Dim obj
Set rUpdated=范围(Target.Dependents.Address)
如果没有更新,则什么都不是
对于rUpdated中的每个rCell
如果rCell.Column=1,则
出错时继续下一步
Set obj=ActiveSheet.OLEObjects(“行”和rCell.Row)
如果Err.Number=0,则
obj.Visible=(rCell.Value“”)
如果结束
如果结束
下一个rCell
如果结束
端接头

我将该配置替换为以下单行(和配套行):


我运行了一次该函数并将其删除。一旦完成,我的形状现在可以通过名称来引用,我不再需要在每个形状和每个目标之间循环的延迟。工作表中出现的延迟现在是最小的。

我将该配置替换为以下单行(和配套行):


我运行了一次该函数并将其删除。一旦完成,我的形状现在可以通过名称来引用,我不再需要在每个形状和每个目标之间循环的延迟。工作表中的延迟现在最小。

引用的单元格是否总是在同一行中?如果是这样,编写一个自定义函数可能会更快,该函数会获取更改单元格的地址并检查当前行中的公式。否,引用的单元格可能是电子表格的全高。然而,我真的只关心一行。我只是需要一种比调用
Target更好的方法。依赖项你引用的单元格是否总是在同一行?如果是这样,编写一个自定义函数可能会更快,该函数会获取更改单元格的地址并检查当前行中的公式。否,引用的单元格可能是电子表格的全高。然而,我真的只关心一行。我只需要一种比调用
Target更好的方法。通过所有rCells或Shapes的依赖项似乎不会导致速度缓慢。如果我将sub限制为单行
Set rUpdated=Range(Target.Dependents.Address)
,则会得到所有的慢度。我测试了你的代码,它运行时也有类似的延迟。当它运行到这一行时,你应该在一个干净的
工作簿中测试它,只需要一些参考,看看性能是否仍然很差。后面还有什么运行吗?在一个干净的工作簿中测试,其中只复制了单元格公式。只有VBA代码是工作表\u change宏中的这一行。诚然,可能有很多依赖项,因为公式中有很多对其他单元格的引用,但我不能改变这一点,因为这会破坏工作表的功能和用途。例如,一个公式引用8个单元格,一次单元格更新最多可更新16个单元格。没有VBA时没有性能问题。检查所有RCELL或形状似乎不会导致速度缓慢。如果我
Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rUpdated As Range
    Dim shp As Shape
    Dim rCell As Range
    Dim obj As OLEObject

    Set rUpdated = Range(Target.Dependents.Address)
    If Not rUpdated Is Nothing Then
        For Each rCell In rUpdated
            If rCell.Column = 1 Then
                On Error Resume Next
                Set obj = ActiveSheet.OLEObjects("Row" & rCell.Row)
                If Err.Number = 0 Then
                    obj.Visible = (rCell.Value <> "")
                End If
            End If
        Next rCell
    End If
End Sub
On Error Resume Next
ActiveSheet.Shapes("buttonRow" & Target.Row).Visible = (ActiveSheet.Cells(Target.Row, 1).Value <> "")
Function renamebuttons()
    For Each shp In ActiveSheet.Shapes
        shp.name = "buttonRow" & shp.TopLeftCell.Row
    Next shp
End Function