• ベストアンサー

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

  • Excelでセルの値によりチェックボックスを操作

    EXCEL2007で作業しています。 シートにチェックボックスを配置しています。 ・セルA1の値が「あ」だったら チェックボックス1にチェックを入れる。 ・チェックボックス2にチェックが入っていたら オートシェイプ2を表示させる 上記2つを実現したいです。 どちらかひとつでもおしえていただければと思います。 よろしくお願いいたします!

  • Excel shape イベント

    お世話になります。 Excelマクロについて質問です。 バージョンは2010です。 Excelのあるシートにshapeオブジェクトがいくつも配置されており、そのある一つのshapeをダブルクリックしたときに、ある関数を動かす、といったイベントを設定したいのですが、やり方がわかりません。 BeforeDoubleClick等はありますが、それらはすべてアクティブシートのセルに対するイベントなため、私のやりたいことが満たされません。 私のやりたいこと… shapeをダブルクリックし、ユーザーが任意で名前を変えたり削除できるようにしたい。 また、右クリックによるコンテキストメニューの項目追加という方法でも問題ないのですが、excel2010での独自メニュー追加が不可能になったという記事を見ましたので、方法に困っています。 上記2つの方法で、わかる方、または他に良い方法がわかる方、ご返信お願いいたします…(;_;)

  • エクセルの図形描画のこと

    エクセルのあるシートに、オートシェイプの図形とテキストボックスの文字が無数に描画してあります。これらを全てまとめて、"セルに合わせて移動やサイズ変更をしない"に一括変更するにはどうすればいいでしょうか? 対象オブジェクトを全てセレクト状態にしてから、マウス右クリックで"オブジェクトの書式設定"を選択してみると、対象が多すぎるようで書式設定ウインドウが出てきませんでした。

  • Excelのセル内にある図形を削除したいのです。

    皆様おはこんばんちわ。 セル(Ex.B2,B3,B4)をダブルクリックする度に、そのセル内にオートシェイプを描画/削除したいのです。 描画は下記(で良いのかですが)で出来たのですが、削除がどうしてもわかりません。 ------------------------------------------------------------------------- Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean) If Intersect(Target, Range("B2:B4")) Is Nothing Then Exit Sub With ActiveCell With ActiveSheet.Shapes.AddShape _ (msoShapeOval, .Left, .Top, .Width, .Height) .Fill.Visible = msoFalse .Line.Weight = 1.75 .Line.ForeColor.SchemeColor = 0 End With End With End Sub ------------------------------------------------------------------------- 既に図形があるセルをダブルクリックで削除するにはどの様な方法があるのでしょうか。 バージョンはExcel2007です。 皆様よろしくご教示ください。

  • セル範囲と図形を指定してVBAで削除するには?

    エクセルで一枚のシートに複数のオートシェイプ(○、△、□)を使用したものがあります。 オートシェイプを使用しているセルの範囲は(A1:G20)と(AP1:AX20)の二箇所なのですが、 VBAで(A1:G20)の範囲にあるオートシェイプ(○のみ)を削除する事はできますか? (A1:G20)の範囲にあるオートシェイプは全体がこのセル範囲に入っています。 手動で、オブジェクトの選択で範囲指定をした後削除という方法もあるのですが この削除の作業の前後に他のVBAを使用しているので、 VBAで削除が出来ればと思います。 いろいろ検索したのですが、セル範囲もしくは図形のいずれかを指定して 削除する方法はあったのですが、両方を指定してのVBAがわかりませんでした。 よろしくお願いいたします。

  • Excelでの図形の描画

    Visual Basicでフォームに図形を直接描画できる様に、Excelでオートシェイプなどのオブジェクトを使用しないでシートに対して直接、図形(線や円など)を描画する事は可能でしょうか?

  • VB6.0でExcelの操作。

    お世話になっております。 VB6.0上で、Excelオブジェクトの書きこみロジックを作成しているのですが、Excelオブジェクトを作成し、セルへのデータの書きこみ等は問題なくできるのですが、フォントを変えたり、線を引いたり、オートシェイプを操ったり・・・等の方法がいまいちわかりません。自分でも調べてはいるのですが、VB6.0でのそういったExcel操作事例集のようなサイトがありましたら、教えて頂けないでしょうか?

  • excel vba 名前付きセルが存在しないとき

    あるワークシートのセルに、"_1", "_2","_3","_10"のように名前をつけています。 "_8"が見つからなかったら、ループで番号を上げていき、"_10"にたどりつくようにしたいんですが、"_8"というセルが見つからなかった時の判定方法がわかりません。 On error ではない処理を使いたいのですが、 If Range("_8") = Empty Then では実行時エラー1004 "アプリケーション定義またはオブジェクト定義のエラーです" と出ます。 Rangeオブジェクトがemptyになるわけではないんでしょうか? よい方法があれば、教えてください。

  • Excelで任意セルをWindows上の左上に持ってきたい

    Excel2002で任意セルを左上にVBAで持ってきたいのですが どうすればいいでしょうか? 任意セルが含まれる行/列が入力のそれぞれ行/列タイトルに なっていて、そういうエリアがシート上にいくつか存在します。 次のエリアに飛ぶのにいちいちスクロールするのが手間なので VBAでコントロールできないかと思います。 そのセルに飛ぶのは簡単なんですが・・・

  • Excelのオートシェイプの配置

    複数のセルにまたがってオートシェイプで線を引いています。これをセルの上下中央揃えに配置したいのですが、「図形の調整」→「配置/配列」をえらんでも、上下中央揃えを選べません。 どうしたらよいのでしょうか? ちなみに、Windows XP で Excel 2002 をしようしています。 よろしくお願いします。

専門家に質問してみよう