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

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

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

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

Visio

VisioはMicrosoft 製品の一つで、 設計図やダイアグラムなど図を書くためのソフトウェアです。

Q&A

解決済

1回答

234閲覧

Visio VBA で選択している図形の面積や長さを求める方法

koridentetsu

総合スコア28

VBA

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

Visio

VisioはMicrosoft 製品の一つで、 設計図やダイアグラムなど図を書くためのソフトウェアです。

1グッド

0クリップ

投稿2025/04/02 12:18

編集2025/04/02 21:31

実現したいこと

Visio Professional 2024を使い始めました。
以前のバージョン(Visio Professional 2021以前)では、[図形と面積と外周の長さ] というアドオンがあり、これを使うことで、選択している図形の長さや面積を求めることができました。複数の図形を選択している場合は、合計の長さ、合計の面積を求めることができました。
しかし、Visio Pro 2024 では仕様変更か、このアドオンが消えたようです。
そこで、Visio VBA を使って、同じ機能を実現できないかと画策しています。

発生している問題・分からないこと

Visio VBA で以下のコードを作ると、図面内にある1番目の図形の面積を求めることができます。
※仕様上、長さの値は「平方インチ」で出てくるので「cm^2」に換算するために 2.54^2倍しています。

VBA

1Sub 面積の表示() 2 MsgBox Round(ActivePage.Shapes(1).AreaIU * 2.54 ^ 2, 5) & "(cm^2)" 3End Sub

以下のようにすれば図面内の全ての図形の面積の合計値を求めることができました。

VBA

1Sub 合計面積の表示() 2 Dim N As Long, i As Long, S As Double 3 N = ActivePage.Shapes.Count 4 S = 0 5 6 For i = 1 To N 7 S = S + ActivePage.Shapes(i).AreaIU * 2.54 ^ 2 '平方インチをcm^2に換算 8 Next 9 10 MsgBox Round(S, 5) & "(cm^2)" 11End Sub

ところが、上記の方法で求めることができるのは、あくまでも「図面内の1番目の図形」や「図面内の全ての図形」の面積だけです。
沢山の図形が存在する図面内で「選択している図形の面積」を求めるにはどうすれば良いでしょうか?
(なお、複数の図形を選択している場合は選択している図形の面積の合計値を出したいです)

また、このプログラムを自作アドインとして、他の図面上でも実行できるようにしたいです。

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

このようにしたところ実行時エラーになってしまいます。

VBA

1Sub test() 2 MsgBox ActiveWindow.Selection.AreaIU * 2.54 ^ 2 3End Sub

補足

こちら( http://www.interq.or.jp/chubu/r6/visio/DVS_18_Drawing_with_Automation840.htm )で触れられている selection を使うことも試みましたが、

VBA

1Sub test2() 2 Dim selectObj 3 4 Set selectObj = ActiveWindow.Selection 5 If selectObj.Count = 0 Then 6 MsgBox "先に図形を選択してください。", , "図形を選択してください" 7 Else 8 MsgBox selectObj.Shapes(1).AreaIU * 2.54 ^ 2 9 End If 10 11End Sub

というコードだと、エラーになります。Selection の中にある Shape を指定する方法が分からず、詰まっています。

hatena19👍を押しています

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

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

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

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

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

koridentetsu

2025/04/02 14:26

Sub test2() Dim selectObj Set selectObj = ActiveWindow.Selection If selectObj.Count = 0 Then MsgBox "先に図形を選択してください。", , "図形を選択してください" Else MsgBox selectObj.Shapes(1).AreaIU * 2.54 ^ 2 End If End Sub というコードだと、エラーになってしまいます…。 Selection の中にある Shapeを指定する方法が分からず、詰まっています。
TakaiY

2025/04/02 15:16

ということであれば、質問にそのことを追記したほうが、よりよい回答を得やすいと思いますよ。 質問は編集できますので。
koridentetsu

2025/04/02 21:32

ありがとうございます。追加させていただきました。
guest

回答1

0

ベストアンサー

Selection の中にある Shapeを指定する方法

Claude AI 先生に聞いてみました。選択した図形については For Each を使うと良いようです。

vba

1Sub 選択図形の合計面積の表示() 2 Dim shp As Visio.Shape 3 Dim S As Double 4 5 ' 選択されている図形がない場合のエラー処理 6 If ActiveWindow.Selection.Count = 0 Then 7 MsgBox "図形が選択されていません。", vbExclamation 8 Exit Sub 9 End If 10 11 S = 0 12 13 ' 選択された各図形に対して処理を実行 14 For Each shp In ActiveWindow.Selection 15 S = S + shp.AreaIU * 2.54 ^ 2 '平方インチをcm^2に換算 16 Next 17 18 MsgBox Round(S, 5) & "(cm^2)" 19End Sub

Visio VBAによる選択図形の面積の算出

投稿2025/04/02 21:28

cx20

総合スコア4693

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

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

koridentetsu

2025/04/02 21:59

ありがとうございます! やりたかったことが実現できました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.31%

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

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

質問する

関連した質問