1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

VBAでPicturesクラスのFormulaプロパティが変数を使って設定できない件(多分Excelのバグ)

Last updated at Posted at 2020-06-27

shapeに設定された数式をVBAで変更したい時があり、試行錯誤した結果をメモとして残します。

自分としての結論

shapeのFormulaプロパティを設定する場合はハードコーディング(内容をコード内に直接記述すること)で記述する。変数での設定は不可。
きっとExcelのバグでしょう。
※2020/07/04 追記:コメント欄でのご指摘により、変数にFormulaを代入する際、末尾に半角スペースが入ってしまうバグが原因でした。代入後trim関数で半角スペースを除去することで解決しました。

環境

OS:Windows 10 Home
製品:Microsoft 365
※上記は自宅PCで、職場PC(Office 2016)でも同じ症状だったので環境起因ではないでしょう。

試したコード

仕事の素材は直接出せないので、状況を再現したもので説明します。
下図のように、Sheet1にあるオレンジ色の画像に数式(=Sheet3!A1:B2)が設定されています。
vba.png

コードを示します。
10~12行目でShapeのFormulaを設定しています。
コード内コメントの通り、数式をハードコーディングした部分は問題なかったのですが、変数fmlに代入して設定するとエラー1004が発生しました。

testShapeFormula.bas
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

PictureクラスのFormulaプロパティを設定できません。

実際の仕事素材ではshapeが複数あるので、for eachも試しています。もしかしたらfor eachが悪い?!という観点でもデバッグしたので、コード内ではfor eachがコメントアウトされています。

幸い今回の改修では数式の参照範囲は変わらないのでハードコーディングでもギリギリ対応可能な内容ですが、範囲が可変的なものだとかなり厳しいのではないかと思います。
ShapeのFormulaをVBAで編集なんて普通に使っていたらほぼ遭遇しない事象だからバグが放置されてるのかな?お願いしますYO MSさん!
え、これでできるよ??などツッコミありましたらお願いしますm(__)m

1
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?