質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

Q&A

解決済

1回答

2194閲覧

ExcelVBA シートの表示倍率が100%以外の状況だとグループ化したシェイプの座標が変化してしまう

Keiichi623

総合スコア17

VBA

VBAはオブジェクト指向プログラミング言語のひとつで、マクロを作成によりExcelなどのOffice業務を自動化することができます。

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

マクロ

定義された処理手続きに応じて、どのような一連の処理を行うのかを特定させるルールをマクロと呼びます。

0グッド

1クリップ

投稿2021/04/26 22:37

編集2021/05/07 09:23

前提・実現したいこと

Excel2007のオートシェイプやテキストエリアを使い、地図シンボルと説明の大きさをそろえるマクロを作っています。通常のオートシェイプに対する処理では不具合は無かったのですが、オブジェクトをグループ化したところ、グループ内のシェイプ全体がちょっとずつ位置がズレてしまう現象が起こるようになりました。

テストではグループ化したオブジェクト(オートシェイプとテキストエリアを2セット)、念のため画像(msoPicture)1個で試し、表示倍率が100%以外の場合に同様の現象が発生することがわかりました。

発生している問題・エラーメッセージ

実行前
イメージ説明

実行後(10回実行後)
イメージ説明

該当のソースコード

ExcelVBA

1```ここに言語を入力 2Public Sub loopGroupedShape() 3 Dim sp As Shape 4 Dim spg As Shape 5 Dim gr As Collection 6 7 Set gr = New Collection 8 For Each sp In ActiveSheet.Shapes 9 If sp.Type = msoGroup Then 10 gr.Add sp 11 ElseIf sp.Type = msoPicture Then 12 sp.LockAspectRatio = msoFalse 13 Else 14 sp.LockAspectRatio = msoFalse 15 sp.Height = 25 16 If sp.Type = msoTextBox Then sp.Width = Len(sp.TextEffect.Text) * 10 Else sp.Width = 25 17 End If 18 Next 19 20 Do While gr.Count > 0 21 For Each spg In gr 22 For Each sp In spg.GroupItems 23 If sp.Type = msoGroup Then 24 gr.Add sp 25 ElseIf sp.Type = msoPicture Then 26 Else 27 sp.LockAspectRatio = msoFalse 28 sp.Height = 25 29 If sp.Type = msoTextBox Then sp.Width = Len(sp.TextEffect.Text) * 10 Else sp.Width = 25 30 End If 31 Next 32 gr.Remove 1 33 Next 34 Loop 35 36End Sub
### 試したこと ・LockAspectRatio を値設定の前後に挿入する ・Debug.Printで現在のHeightやWidthを取得して再挿入する ### 補足情報(FW/ツールのバージョンなど) MicroSoft Excel 2007 MicroSoft Excel 2010 MicroSoft Excel 2013

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Keiichi623

2021/05/07 09:01

ご調査ありがとうございます。 ふと思い立って新しいファイルで始めて見たところ、新規のシートでは発生しませんでした。 また、別のバージョンのExcel2013で同ファイルを操作したところ、再度同じ現象が発生しました。 オブジェクトのプロパティを現象が発生しているシートから発生していないシートにコピーするマクロを新規に作成しましたが、シート単位で発生の有無があることがわかりました。
FromMZ1500

2021/05/07 09:26

Excel2013で発生したということは、2007の問題ではないようですね。 ShapeのTop、Left、Height、WidthなどはSingleなので、 なにか処理を行うごとに誤差がまるめられているのかも。 処理の前に値を控えて、処理の後、値を戻してやるという最終手段は、ありますよね。
Keiichi623

2021/05/07 09:32

色々試しているうちに、何故か表示倍率に依拠していることがわかりました。 ちょっと質問を変更して表示倍率を変更して対応してみました。 FromMZ1500さんをベストアンサーに選びたかったのですが、解決済みにしてしまいました。すみません。
Keiichi623

2021/05/07 09:34

実際のところバグの根本的解決には至っていないので悩ましいところです・・・
FromMZ1500

2021/05/07 09:39

お気遣いありがとうございます。 対応策がみつかってなにより。
guest

回答1

0

自己解決

表示倍率に依拠していることが判明したため、コード中に表示倍率を一時的に100%に変更するコードを作成したところバグの発生を抑制することができました。

ExcelVBA

1Public Sub loopGroupedShape() 2Dim sp As Shape 3Dim spg As Shape 4Dim gr As Collection 5 6Set gr = New Collection 7For Each sp In ActiveSheet.Shapes 8If sp.Type = msoGroup Then 9gr.Add sp 10ElseIf sp.Type = msoPicture Then 11sp.LockAspectRatio = msoFalse 12Else 13sp.LockAspectRatio = msoFalse 14sp.Height = 25 15If sp.Type = msoTextBox Then sp.Width = Len(sp.TextEffect.Text) * 10 Else sp.Width = 25 16End If 17Next 18 19'追加箇所 20 xzoom = ActiveWindow.Zoom 21 ActiveWindow.Zoom = 100 22 23Do While gr.Count > 0 24For Each spg In gr 25For Each sp In spg.GroupItems 26If sp.Type = msoGroup Then 27gr.Add sp 28ElseIf sp.Type = msoPicture Then 29Else 30sp.LockAspectRatio = msoFalse 31sp.Height = 25 32If sp.Type = msoTextBox Then sp.Width = Len(sp.TextEffect.Text) * 10 Else sp.Width = 25 33End If 34Next 35gr.Remove 1 36Next 37Loop 38 39'追加箇所 40ActiveWindow.Zoom = xzoom 41 42 43End Sub 44

根本的な解決には至っていませんが、ひとまず完了とします。
FromMZ1500様、ご対応ありがとうございました。

投稿2021/05/07 09:28

Keiichi623

総合スコア17

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問