我在一张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
答案 0 :(得分:0)
假设代码位于工作表WEstimate
的后面,并且您在工作表FCalc
上执行的某些操作导致WEstimate
重新计算,则错误的原因是您无法Select
在无效工作表上的内容。当FCalc
处于活动状态时,Selection
引用在FCalc
上选择的任何内容。为什么使用Select
Selection
或Active*
的经典案例是个坏主意。
因此,解决方案是重构以避免依赖Select
Selection
或Active*
类似这样的东西
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