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

问题描述

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

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

我也尝试过使用,但每当我在工作表上输入我不想要的信息时Worksheets("WEstimate"),它都会继续将我发送到工作表。希望这是足够的信息。我不知道我在做什么,所以非常感谢任何帮助。谢谢你。WEstimateFCalc

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

标签: excelvba

解决方案


假设代码在 sheet 后面WEstimate,并且您对 sheet 采取的某些操作FCalc导致WEstimate重新计算,错误的原因是您不能Select在非活动工作表上执行某些操作。当FCalc处于活动状态时,Selection指的是在 上选择的任何内容FCalc。为什么使用Select SelectionorActive*是一个坏主意的经典案例。

因此,解决方案是重构以避免依赖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

推荐阅读