- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
#3です。よく見たらA-D列間でしたね。 Set toCell = Range("$C:$C").Find(Target.Value, LookIn:=xlValue, LookAt:=xlWhole) の$C:$Cのところを、 $D:$D に変更願います。
その他の回答 (4)
- imogasi
- ベストアンサー率27% (4737/17069)
エクセルで罫線というのはシートの1セルの中(斜線)と回りの罫線です。旨くつながれば複数セルにも続けられる。 セル間に線を引く仕組みはありません。マイクロソフトが正面を切って仕組みを設けないとダメです。 質問の言葉遣いがおかしいのです。 (1)従って、VBAででも出来ないか、検討しないといけない。 関数はセルの値だけを問題にするので、ハナから問題外です。 図形の直線もセル幅、行高を変えると、それにつれて結合を変えてくれないので普通の先はダメです。 (2)結合線(コネクタ)を考えることになります (3)それとセルにF、G列にデータを入れた時に、即時反応的に、線を引くことを望むのでしょうが、VBAのイベントという仕組みを使わないといけない。VBAでもイベントは初心者の範囲外の課題。 (4)F,G列のデータが変更されたり、抹消されたりしたときに、引きなおしたり、抹消したりの、VBAでの組み込みも 簡単ではない。 ーー ですから、質問者は普通には出来ないことの確信ができず、VBAが必要なことなどを知らないから、こんな質問をするのであって、一応あきらめるべきでしょう。 ーーー 興味に任せてやってみた。 コード例 図形(オートシェイプ)のコネクタを使っています。 Private Sub Worksheet_Change(ByVal Target As Range) Dim t1, t2 'Worksheets("Sheet1").DrawingObjects.Delete If Target.Column = 7 Then 'G列なら i = Target.Offset(0, -1) 'A列の行番号 'MsgBox i 'A列の行番号 f1 = Cells(i, "A").Left + Cells(i, "A").Width f2 = Cells(i, "A").Top + Cells(i, "A").Height / 2 '---- c = Val(Cells(1, Target.Value).Column) 'D列の行番号 'MsgBox c 'D列の行番号 t1 = Cells(1, "C").Left t2 = Cells(c, "D").Top - f2 + Cells(c, "D").Height / 2 ActiveSheet.Shapes.AddConnector(msoConnectorStraight, f1, f2, t1, t2).Select End If Selection.ShapeRange.Line.Weight = 3.25 '線の太さ Selection.ShapeRange.Line.DashStyle = msoLineDash '点線 End Sub ーーーー 私のテストデータ例 F,G列 1 c 2 d 5 e 7 e 7 h 8 c 8 g 9 f 11 a 4 c 1 b 2 j 3 aa 12 l ーー 結果 略。実際やってみてください。 ーーーー このコードにも欠点が色々在ります。 (1)G列でZ以後の指定はどうするのか(質問に書いてない)。無いという前提か。上記コードではAAでうまく行くが、この指定方法自然かな。 (2)F、G列でデータを変更した場合、旧の線の抹消がうまく行かない。 私の知恵が足りない、わけではないと思う。変更前のそのセルのデータはイベントではとらえられ無いと思う。 (3)図形(オートシェイプ)の書式設定で、プロパティの「セルに合わせて・・変更する」をONにすると、セル幅・行高の変更に 結合線が付いていってくれるが、場合によっては、うまく行かなかった場合があった。 (4)線の色や線の先頭・後尾の形を矢印にするなどは、マクロの記録を採って、上記コードに加えれば出来る。(参考)
- mitarashi
- ベストアンサー率59% (574/965)
罫線ではなくて、コネクタで引く事例です。目的のシートのシートモジュールに記載して下さい。 TOの列に入力した際に、FROMの列に数値が入力されていれば、それぞれC列、A列から検索して結線します。 シートのイベントについては、参考URLなどをご覧下さい。 Private Sub Worksheet_Change(ByVal Target As Range) Dim fromCell As Range, toCell As Range If Target.Cells.Count > 1 Then Exit Sub If Target.Value = "" Then Exit Sub If Intersect(Target, Range("$G:$G")) Is Nothing Then Exit Sub If Target.Offset(0, -1).Value = "" Then Exit Sub Set fromCell = Range("$A:$A").Find(Target.Offset(0, -1).Value, LookIn:=xlValue, LookAt:=xlWhole) If fromCell Is Nothing Then Exit Sub Set toCell = Range("$C:$C").Find(Target.Value, LookIn:=xlValue, LookAt:=xlWhole) If toCell Is Nothing Then Exit Sub connectCell fromCell, toCell End Sub Private Sub connectCell(myCell1 As Range, myCell2 As Range) Dim rect1 As Shape, rect2 As Shape, connectLine As Shape Set rect1 = drawRect(myCell1) Set rect2 = drawRect(myCell2) Set connectLine = ActiveSheet.Shapes.AddConnector(msoConnectorStraight, 0, 0, 1, 1) With connectLine .Line.Weight = 4.5 .Line.DashStyle = msoLineDash .ConnectorFormat.BeginConnect rect1, 4 .ConnectorFormat.EndConnect rect2, 2 End With rect1.Delete rect2.Delete End Sub Private Function drawRect(myCell As Range) As Shape With myCell Set drawRect = ActiveSheet.Shapes.AddShape(msoShapeRectangle, .Left, .Top, .Width, .Height) End With End Function
- Hirorin_20
- ベストアンサー率20% (136/648)
VBAで行います。 入力セルのデータが変わったときのアテンションに記載する。 このアテンションでオートシェイブの線を引きます。
- 23567
- ベストアンサー率27% (326/1181)
マウスで範囲指定して、右クリックで罫線を選んで引けますが自動設定は無理と思います
お礼
参考になりました。 ありがとうございます。