shapeに設定された数式をVBAで変更したい時があり、試行錯誤した結果をメモとして残します。
自分としての結論
shapeのFormulaプロパティを設定する場合はハードコーディング(内容をコード内に直接記述すること)で記述する。変数での設定は不可。
きっとExcelのバグでしょう。
※2020/07/04 追記:コメント欄でのご指摘により、変数にFormulaを代入する際、末尾に半角スペースが入ってしまうバグが原因でした。代入後trim関数で半角スペースを除去することで解決しました。
環境
OS:Windows 10 Home
製品:Microsoft 365
※上記は自宅PCで、職場PC(Office 2016)でも同じ症状だったので環境起因ではないでしょう。
試したコード
仕事の素材は直接出せないので、状況を再現したもので説明します。
下図のように、Sheet1にあるオレンジ色の画像に数式(=Sheet3!A1:B2)が設定されています。
コードを示します。
10~12行目でShapeのFormulaを設定しています。
コード内コメントの通り、数式をハードコーディングした部分は問題なかったのですが、変数fmlに代入して設定するとエラー1004が発生しました。
Sub testShapeFormula()
Dim shp As Shape
Dim fml As Variant
Set ash = ActiveSheet
'For Each shp In ash.Shapes
'shpNm = shp.Name
fml = ash.Shapes(1).DrawingObject.Formula ' shapeの数式取得
fml = "=" & Replace(fml, "Sheet2", "Sheet1") ' 数式の編集
With ash.Shapes(1).DrawingObject
.Formula = "=Sheet3!A1:B2" ' shapeに数式を設定(1) OK!
.Formula = "=Sheet1!A1:B2" ' shapeに数式を設定(2) OK!
.Formula = fml ' shapeに数式を設定(3) NG... エラー1004
End With
'Next
End Sub
実際の仕事素材ではshapeが複数あるので、for eachも試しています。もしかしたらfor eachが悪い?!という観点でもデバッグしたので、コード内ではfor eachがコメントアウトされています。
幸い今回の改修では数式の参照範囲は変わらないのでハードコーディングでもギリギリ対応可能な内容ですが、範囲が可変的なものだとかなり厳しいのではないかと思います。
ShapeのFormulaをVBAで編集なんて普通に使っていたらほぼ遭遇しない事象だからバグが放置されてるのかな?お願いしますYO MSさん!
え、これでできるよ??などツッコミありましたらお願いしますm(__)m