• ベストアンサー

Excelの任意セル上に図形がのっているかどうか?

Excel2002です。 シート上にライン(Shapeオブジェクト)を配置していますが、 このラインにセルが引っかかっているかどうかの判定は できますでしょうか? よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.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

urourojp
質問者

補足

ご回答ありがとうございます。 >>このラインにセルが引っかかっているかどうか >どのライン? どのセルですか。  このライン = ライン(Shapeオブジェクト) どのセル = 任意のセル です。 要は両方とも任意です。 いただいたソースコードは非常に参考になります。 これを元にちょっと進めてみたいと思います。 ありがとうございました。

その他の回答 (3)

  • zap35
  • ベストアンサー率44% (1383/3079)
回答No.3

微妙に何をどうすればよいのかが分からない質問ですね。 >このラインにセルが引っかかっているかどうか どのライン? どのセルですか。  セルとラインが特定できれば、以下のように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

noname#129375
noname#129375
回答No.2

それはつまり、Shapeがセルのラインをまたいでいるか=Shapeが2つ以上のセルに干渉しているかの判定ではないですか? Shape.TopLeftCell プロパティ(オブジェクトの左上端にあるセルを取得) Shape.BottomRightCell プロパティ(オブジェクトの右下端にあるセルを取得) この2つのプロパティで取得した値(Rangeオブジェクト)を比較して、一致すればそのShapeは同一セル内に収まっているということです。 これではダメでしょうか??

urourojp
質問者

お礼

Shape.TopLeftCellというプロパティーがあったんですね。 これを使って進めてみたいと思います。 ありがとうございました。

  • koko88okok
  • ベストアンサー率58% (3839/6543)
回答No.1

アナログ的な方法ですが、枠線に乗っていると思われる列または行の「列の幅」または「行の高さ」を変更してみて下さい。 枠線に乗っていれば、「列の幅」または「行の高さ」の変更に合わせて、オブジェクトも移動します。乗っていなければ、「列の幅」または「行の高さ」だけが変化するだけで、オブジェクトは移動しないはずです。 確認した後は「元に戻す」で元に戻してください。

urourojp
質問者

補足

すみません、大事なことを書き忘れていました。 のっているかどうかの評価はVBA/マクロでやりたいのです。 よろしくお願いします。

関連するQ&A