- ベストアンサー
Excelの任意セル上に図形がのっているかどうか?
Excel2002です。 シート上にライン(Shapeオブジェクト)を配置していますが、 このラインにセルが引っかかっているかどうかの判定は できますでしょうか? よろしくお願いします。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#03です。先のマクロを少しスリムにしましたので再掲します Sub Macro1() Const trg As String = "A1" Dim res Dim psw As Boolean Dim idx As Integer With ActiveSheet For idx = 1 To .Shapes.Count If .Shapes(idx).Type = msoLine Then Set res = Intersect(.Range(trg), Range(.Shapes(idx).TopLeftCell, _ .Shapes(idx).BottomRightCell)) If Not res Is Nothing Then psw = True Exit For End If End If Next idx If psw Then MsgBox "ラインが" & trg & "と重なっています" Else MsgBox "重なっていません" End If End With End Sub
その他の回答 (3)
- zap35
- ベストアンサー率44% (1383/3079)
微妙に何をどうすればよいのかが分からない質問ですね。 >このラインにセルが引っかかっているかどうか どのライン? どのセルですか。 セルとラインが特定できれば、以下のようにIntersect関数で範囲重複があるかないかを判定すればよいと思いますが、質問には一切書かれていないので想像で書かなければなりませんね。回答する側はurourojpさんのPC画面は見えませんので… Intersect(.Range("A1"), Range(.Shapes(1).TopLeftCell, .Shapes(1).BottomRightCell)) 以下のマクロは2行目で指定しているセルに、かかっているシェイプの「ライン」があるかないかを判定するサンプルです。質問には「ライン」と明記されていますので、「ライン」以外のシェイプは無視するようにしています。また色々余分に書き込みすぎていますが、基本は上に書いた通りです。部分的にでもご参考になれば… Sub Macro1() Const trg As String = "A1" Dim res, act Dim psw As Boolean Dim idx As Integer Set act = Selection With ActiveSheet Application.ScreenUpdating = False For idx = 1 To .Shapes.Count .Shapes(idx).Select If TypeName(Selection) = "Line" Then Set res = Intersect(.Range(trg), Range(.Shapes(idx).TopLeftCell, _ .Shapes(idx).BottomRightCell)) If Not res Is Nothing Then psw = True Exit For End If End If Next idx act.Select Application.ScreenUpdating = True If psw Then MsgBox "ラインが" & trg & "と重なっています" Else MsgBox "重なっていません" End If End With End Sub
それはつまり、Shapeがセルのラインをまたいでいるか=Shapeが2つ以上のセルに干渉しているかの判定ではないですか? Shape.TopLeftCell プロパティ(オブジェクトの左上端にあるセルを取得) Shape.BottomRightCell プロパティ(オブジェクトの右下端にあるセルを取得) この2つのプロパティで取得した値(Rangeオブジェクト)を比較して、一致すればそのShapeは同一セル内に収まっているということです。 これではダメでしょうか??
お礼
Shape.TopLeftCellというプロパティーがあったんですね。 これを使って進めてみたいと思います。 ありがとうございました。
- koko88okok
- ベストアンサー率58% (3839/6543)
アナログ的な方法ですが、枠線に乗っていると思われる列または行の「列の幅」または「行の高さ」を変更してみて下さい。 枠線に乗っていれば、「列の幅」または「行の高さ」の変更に合わせて、オブジェクトも移動します。乗っていなければ、「列の幅」または「行の高さ」だけが変化するだけで、オブジェクトは移動しないはずです。 確認した後は「元に戻す」で元に戻してください。
補足
すみません、大事なことを書き忘れていました。 のっているかどうかの評価はVBA/マクロでやりたいのです。 よろしくお願いします。
補足
ご回答ありがとうございます。 >>このラインにセルが引っかかっているかどうか >どのライン? どのセルですか。 このライン = ライン(Shapeオブジェクト) どのセル = 任意のセル です。 要は両方とも任意です。 いただいたソースコードは非常に参考になります。 これを元にちょっと進めてみたいと思います。 ありがとうございました。