プロが教えるわが家の防犯対策術!

商品の一覧を表す、エクセルの表の内、ある行の商品の注文が中止になったとします。その時の表示の方法として、図形描画の直線で、取り消しラインを引いてあるとします。セルの書式の取り消しを使ってくれれば、簡単にその行を特定できるのでは?と思いますが、書式の取り消しラインは、文字の上しか取り消しラインを引かないので、わかりにくため、描画を使っているそうです。(これは、相手方のルールなので、変更はできないとします。)
で、セルの上に図形描画のラインが引かれているセルを特定することって出来るのでしょうか?当然、ラインは、必ずしも水平直角に引かれているとは限りません。どなたか?詳しい方がいらっしゃいましたら、教えて頂けないでしょうか?(もしかして、数学の幾何学のカテゴの方がいいのかなぁ?)
さらに、難しことを考えると切りが無いのですが、できれば、複数行にまたがったセル範囲に対して、斜めのラインで消している場合についても教えて頂ければ幸いに存じます。
宜しくお願い致します。

A 回答 (4件)

こんばんは。



オートシェープのラインだけ拾うなら。

Sub TestProc()

  Dim L  As Line
  Dim rRet As Range, rTmp As Range
  
  For Each L In ActiveSheet.Lines
    Set rTmp = Range(L.TopLeftCell, L.BottomRightCell)
    If rRet Is Nothing Then
      Set rRet = rTmp
    Else
      Set rRet = Union(rRet, rTmp)
    End If
    Set rTmp = Nothing
  Next
  If Not rRet Is Nothing Then rRet.Select
  Set rRet = Nothing
  
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
早速試してみました。
何をやっているのかを解析するのに時間がかかったのと、仕事の時間になってしまい。返事が大変遅くなりました。すみませんでした。
サンプルファイルまで作って頂き本当にありがとうございます。
ありがたく、活用させて頂きたく存じます。
ヘルプで調べれば、Rangeに引数が2つあり、サンプルでも同じような使用方法が紹介されているのですが、実際に自分が作りたいものに使用できないものだなぁ!って痛感しました。発想のレベルが違うんですね?今後とも、よろしくお願いいたします。

お礼日時:2007/04/03 18:25

ジャンプ機能を使ってオブジェクトを選択する方法があります。



1) メニューバーの「編集」→「ジャンプ」を選択します。

2) 「セル」ダイアログの「セル選択」ボタンを押します。

3) 「選択オプション」ダイアログで、「オブジェクト」のラジオボタンをオンにして「Ok」を押します。

4) シートに挿入されているオートシェイプを含むすべての「オブジェクト」が選択されます。
    • good
    • 0

直線を指定することで、その直線が引かれているセル範囲をプログラム的に知りたいとして、ユーザ定義関数を作ってみました。


ツール→マクロ→Visual Basic Editor でVBE画面に移り、挿入→標準モジュール で標準モジュールを挿入します。出てきたコードウインドウに下記マクロをコピーして貼り付けます。


水平な直線、垂直な直線、複数行にまたがった斜めの直線について、その直線の先端と終端のセル位置を返す関数です。直線の左の方が先端、右の方が終端です。

また、斜めの直線の場合は、左上から右下に向かう直線の場合は左上が先端、右下が終端。
左下から右上に向かう直線の場合は、表示方法が異なるので、確かめてください。
斜めの場合は、その直線を含む矩形範囲のセルの左上から右下に向けてのセル位置を表示します。(分かりにくい?)

これはユーザ定義関数ですが引数は、「直線 1」を調べる場合は、=Line2Cell("Line 1") のようにします。
「直線 1」は名前ボックスで分かるはずです。

'// 直線の先端を終端位置のセル座標を返す関数
Function Line2Cell(LineName As String)
  Dim TopCell As String   '// 先端セル
  Dim BottomCell As String  '// 終端セル
  
  With ActiveSheet.Shapes(LineName)
    '// 先端セル
    TopCell = Cells(.TopLeftCell.Row, .TopLeftCell.Column).Address(0, 0)
    '// 終端セル
    BottomCell = Cells(.BottomRightCell.Row, .BottomRightCell.Column).Address(0, 0)

    Line2Cell = TopCell & ":" & BottomCell
  End With
End Function


このようにセル座標を求めることはできますが、どのように使うのでしょう?
ということで、下は直線が引かれた範囲を順に表示していきます。ご参考に。

'// 直線が引かれた範囲を表示していく
Sub Line2CellPrint()
  Dim sp As shape
  Dim TopCell As String   '// 先頭セル
  Dim BottomCell As String  '// 最終セル
  
  For Each sp In ActiveSheet.Shapes
    With sp
      TopCell = Cells(.TopLeftCell.Row, .TopLeftCell.Column).Address(0, 0)
      BottomCell = Cells(.BottomRightCell.Row, .BottomRightCell.Column).Address(0, 0)
      MsgBox TopCell & ":" & BottomCell
    End With
  Next
End Sub
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
自分のマクロにどのように活用できるか、考えてみたいと思います。
本当にありがとうございました。
今後ともよろしくお願いいたします。

お礼日時:2007/04/03 18:31

罫線でない(罫線ならセルの角を必ず使っている)、


フォントの取り消しでない、なら
図形描画で書いてある線だと思います。
オートシェイプの選択、で近くをクリックすれば
線の両端に丸印が付くので、すぐわかると思います。
    • good
    • 0
この回答へのお礼

早速の回答ありがとうございます。
私の質問の仕方が悪かったのですが、VBAで捕まえようとしていました。質問者は、自分の意図するものを確実に相手に使えることについて注意を払うべきだと感じました。本当に、ご迷惑をお掛け致しました。これに懲りずに、今後とも、よろしくお願いいたします。

お礼日時:2007/04/03 08:51

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