选择形状时如何解决“对象不支持此属性或方法”错误

时间:2020-02-20 23:11:59

标签: excel vba

我在一张WEstimate上创建了3个速度计,但是当我在另一张FCalc上更改信息时,我得到了

运行时错误438。对象不支持此属性或方法

我也尝试使用Worksheets("WEstimate"),但是每当我在不需要的WEstimate工作表中输入信息时,都会继续将我发送到FCalc工作表中。希望有足够的信息。我不知道我在做什么,因此非常感谢您的帮助。谢谢。

Private Sub Worksheet_Calculate()

Application.ScreenUpdating = True

Worksheets("WEstimate").Calculate

    Worksheets("WEstimate").Shapes.Range(Array("Group 2394")).Select
    Selection.ShapeRange.Rotation = ActiveSheet.Range("W199").Value * 247
    ActiveCell.Select

    Worksheets("WEstimate").Shapes.Range(Array("Group 2312")).Select
    Selection.ShapeRange.Rotation = ActiveSheet.Range("W200").Value * 247
    ActiveCell.Select

    Worksheets("WEstimate").Shapes.Range(Array("Group 2604")).Select
    Selection.ShapeRange.Rotation = ActiveSheet.Range("W202").Value * 247
    ActiveCell.Select

End Sub

1 个答案:

答案 0 :(得分:0)

假设代码位于工作表WEstimate的后面,并且您在工作表FCalc上执行的某些操作导致WEstimate重新计算,则错误的原因是您无法Select在无效工作表上的内容。当FCalc处于活动状态时,Selection引用在FCalc上选择的任何内容。为什么使用Select SelectionActive*的经典案例是个坏主意。

因此,解决方案是重构以避免依赖Select SelectionActive*

类似这样的东西

Private Sub Worksheet_Calculate()
    'Application.ScreenUpdating = True '<~~ Why?
    'Worksheets("WEstimate").Calculate '<~~ This event is triggered by a recalc, so why do it again?

    Dim Speedo As ShapeRange
    Set Speedo = Me.Shapes.Range(Array("Group 2394")) '<~~ Can't select something on a non-active sheet
    Speedo.Rotation = Me.Range("W199").Value * 247 '<~~ ActiveSheet may not refer to this sheet
    ' ActiveCell.Select '<~~ not needed now

    Set Speedo = Me.Shapes.Range(Array("Group 2312")) 
    Speedo.Rotation = Me.Range("W200").Value * 247 

    Set Speedo = Me.Shapes.Range(Array("Group 2604")) 
    Speedo.Rotation = Me.Range("W202").Value * 247 

End Sub