プロが教える店舗&オフィスのセキュリティ対策術

Excel2002です。

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

よろしくお願いします。

A 回答 (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

この回答への補足

ご回答ありがとうございます。

>>このラインにセルが引っかかっているかどうか
>どのライン? どのセルですか。 

このライン = ライン(Shapeオブジェクト)
どのセル = 任意のセル

です。

要は両方とも任意です。

いただいたソースコードは非常に参考になります。
これを元にちょっと進めてみたいと思います。
ありがとうございました。

補足日時:2007/12/29 23:24
    • good
    • 0

微妙に何をどうすればよいのかが分からない質問ですね。


>このラインにセルが引っかかっているかどうか
どのライン? どのセルですか。 

セルとラインが特定できれば、以下のように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
    • good
    • 0

それはつまり、Shapeがセルのラインをまたいでいるか=Shapeが2つ以上のセルに干渉しているかの判定ではないですか?



Shape.TopLeftCell プロパティ(オブジェクトの左上端にあるセルを取得)
Shape.BottomRightCell プロパティ(オブジェクトの右下端にあるセルを取得)

この2つのプロパティで取得した値(Rangeオブジェクト)を比較して、一致すればそのShapeは同一セル内に収まっているということです。

これではダメでしょうか??
    • good
    • 0
この回答へのお礼

Shape.TopLeftCellというプロパティーがあったんですね。

これを使って進めてみたいと思います。

ありがとうございました。

お礼日時:2007/12/29 23:30

アナログ的な方法ですが、枠線に乗っていると思われる列または行の「列の幅」または「行の高さ」を変更してみて下さい。



枠線に乗っていれば、「列の幅」または「行の高さ」の変更に合わせて、オブジェクトも移動します。乗っていなければ、「列の幅」または「行の高さ」だけが変化するだけで、オブジェクトは移動しないはずです。

確認した後は「元に戻す」で元に戻してください。

この回答への補足

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

よろしくお願いします。

補足日時:2007/12/28 23:42
    • good
    • 0

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

このQ&Aを見た人はこんなQ&Aも見ています