重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

excelvbaで描画を始めました。
以下について2点教えて下さい。


ActiveSheet.Shapes.AddLine 200, 200, 300, 300
で直線を引きましたが、
①これを始点(200,200)から任意の長さ分だけ消す方法
②この線自体を消す方法

②については色々な線が引かれますので、
出来ましたら、引いたときにidを付けておき、
そのidを指定して削除出来れば理想です。
少なくとも一括して削除は不可です。

宜しくお願いいたします。

A 回答 (1件)

こんにちは



図形をいじったことが無いので、簡単に調べてみただけの情報です。
(…ですので、もう少し適切な方法があるかも知れません)

①線分は始点と終点で管理されていますので、「一部を消す」という考え方ではなく「どちらかの点を移動する」と考えるのが妥当でしょう。
でも、エクセルの場合は(一般の図形を扱うソフトと違って)どうやら直接これらの点を操作するメソッドが見当たりません。
直線の場合は、矩形で管理していて、その位置と幅、高さに換算して指定する必要があるようです。

>任意の長さ分だけ消す方法
任意の長さが線分に沿った長さ(実長)かX軸あるいはY軸上での長さかにもよりますが、それは換算できるでしょうから、ご提示の例で100の長さ(実長は141.4)を50にする例を以下に。

②idを利用しても良いですが、シート等と同様で、shapeオブジェクトを作成した際にエクセル側で自動的に一意の名称を付けますのでそれを利用するか、あるいは、オブジェクトそのものを変数(配列などでも可)に記憶しておくほうが簡単ではないかと思います。
(名前を用いてオブジェクトを指定することもも、ちろん可能です)

以下の例は、
 1)線分を引く
 2)作成されたオブジェクト名を表示
 3)始点を線分の長さが1/2になるように移動
 4)メッセージ表示
 5)線分を削除
の順で処理する例です。(オブジェクトを変数L1に代入しています)
(処理中のApplication.ScreenUpdating~は、描画が画面に反映されるためのおまじないですので、実質的には必要ありません。)

 Set L1 = ActiveSheet.Shapes.AddLine(200, 200, 300, 300)

 Application.ScreenUpdating = True
 MsgBox "オブジェクト名:" & L1.Name & vbLf & "始点を移動します"
 L1.ScaleHeight 0.5, 0, 2
 L1.ScaleWidth 0.5, 0, 2

 Application.ScreenUpdating = True
 MsgBox "削除します"
 L1.Delete

※ Shapeオブジェクト他のメソッド等の小異才情報に関しては、MSDNをご参照ください。
https://msdn.microsoft.com/ja-jp/vba/excel-vba/a …
    • good
    • 0
この回答へのお礼

早速有り難うございました。
また、何時も有り難うございます。

全て了解です。
少しばかりやろうとしたいこととは違いますが、
無い袖は振れずで、教えていただいた方法を使わせていただきます。

また、描画の削除についても良く分かりました。
お世話になりました。

お礼日時:2018/07/20 13:27

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!