- ベストアンサー
エクセルで複数のセルに一本の斜線を引く方法
- エクセルで複数のセルに一本の斜線を引く方法について知りたいです。
- 伝票のような表で、データの入っていない行を斜線で表現したい場合、特別なマクロを使用する方法を教えてください。
- データの入っていない行を抹消するために、エクセルで斜線を引く方法を知りたいです。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
「特別」なものではありませんが。 例えば ・表の範囲 : A1:E20 ・調べる列 : 表の第1列(A列) ・判定方法 : セルの値がエラー値か否か ・斜線の向き: 右上がり ・起動方法 : 手動 の場合。 '---------------↓ ココカラ ↓--------------- Sub Sample() Dim myRng As Range Dim myCol As Range Dim myTmp As Object Dim myCnt As Integer '表の範囲を指定 Set myRng = ActiveSheet.Range("A1:E20") '調べる列を指定 Set myCol = myRng.Columns(1) '古い斜線を消す For Each myTmp In ActiveSheet.Shapes If myTmp.Name = "myLine" Then myTmp.Delete Next myTmp '「データが無い行」を数える For Each myTmp In myCol.Cells If IsError(myTmp.Value) Then myCnt = myCnt + 1 Next myTmp '「データが無い行」が無ければ抜ける If myCnt = 0 Then Exit Sub '最初の「データが無い行」の位置を調べる myCnt = myCol.Cells.Count - myCnt + 1 '右上がりの斜線を引く With ActiveSheet.Shapes.AddLine( _ myRng.Cells(myCnt, myRng.Columns.Count).Offset(0, 1).Left, _ myRng.Cells(myCnt, myRng.Columns.Count).Offset(0, 1).Top, _ myRng.Cells(myRng.Rows.Count, 1).Offset(1, 0).Left, _ myRng.Cells(myRng.Rows.Count, 1).Offset(1, 0).Top) '(消すときのために)名前をつけておく .Name = "myLine" End With End Sub '---------------↑ ココマデ ↑--------------- 以下のようにしてシートモジュールに記述すれば全自動になります。 (再計算時に描画更新) ※運用方法によっては重くなるかもしれません。 '---------------↓ ココカラ ↓--------------- Private Sub Worksheet_Calculate() Dim myRng As Range Dim myCol As Range Dim myTmp As Object Dim myCnt As Integer Set myRng = ActiveSheet.Range("A1:E20") Set myCol = myRng.Columns(1) For Each myTmp In ActiveSheet.Shapes If myTmp.Name = "myLine" Then myTmp.Delete Next myTmp For Each myTmp In myCol.Cells If IsError(myTmp.Value) Then myCnt = myCnt + 1 Next myTmp If myCnt = 0 Then Exit Sub myCnt = myCol.Cells.Count - myCnt + 1 With ActiveSheet.Shapes.AddLine( _ myRng.Cells(myCnt, myRng.Columns.Count).Offset(0, 1).Left, _ myRng.Cells(myCnt, myRng.Columns.Count).Offset(0, 1).Top, _ myRng.Cells(myRng.Rows.Count, 1).Offset(1, 0).Left, _ myRng.Cells(myRng.Rows.Count, 1).Offset(1, 0).Top) .Name = "myLine" End With End Sub '---------------↑ ココマデ ↑--------------- 以上ご参考まで。
その他の回答 (3)
- hige_082
- ベストアンサー率50% (379/747)
斜線を引きたい範囲を選択し 下記の何れかを実行 Sub 右下がり() Dim LineSTop As Single Dim LineSLeft As Single Dim LineETop As Single Dim LineELeft As Single With Selection LineSTop = .Cells(1, 1).Top LineSLeft = .Cells(1, 1).Left LineETop = .Cells(.Rows.Count, .Columns.Count).Top + .Cells(.Rows.Count, .Columns.Count).Height LineELeft = .Cells(.Rows.Count, .Columns.Count).Left + .Cells(.Rows.Count, .Columns.Count).Width End With ActiveSheet.Shapes.AddLine(LineSLeft, LineSTop, LineELeft, LineETop).Select End Sub Sub 右上がり() Dim LineSTop As Single Dim LineSLeft As Single Dim LineETop As Single Dim LineELeft As Single With Selection LineSTop = .Cells(.Rows.Count, 1).Top + .Cells(.Rows.Count, .Columns.Count).Height LineSLeft = .Cells(.Rows.Count, 1).Left LineETop = .Cells(1, .Columns.Count).Top LineELeft = .Cells(1, .Columns.Count).Left + .Cells(.Rows.Count, .Columns.Count).Width End With ActiveSheet.Shapes.AddLine(LineSLeft, LineSTop, LineELeft, LineETop).Select End Sub
お礼
ご回答ありがとうございました。 何となくそれらしいことはできるのですが やっぱり 斜線を引く範囲がわかりません。
- DOUGLAS_
- ベストアンサー率74% (397/534)
>普通はオートシェイプを使えばできますよね。 >データの入っていない行を抹消する意味で斜線を引く 普通は斜線を引いた方が簡単かと存じますね。 で、 >マクロで可能でしょうか? お示しの手作業を [新しいマクロの記録] で記録してみられたら、何が不明なのかはっきりすると存じますが、 ・「斜線を引く」範囲 をどう指定するかではなかろうかと存じます。 例えば、下記のようなことで似たようなことができますので、いろいろと試行錯誤なさってみてください。 Range("A2:E20").Borders(xlDiagonalDown).LineStyle = xlNone For Each myRng In Range("A2:E20") Select Case myRng.Text Case "#N/A", "", 0 ~~~
お礼
ご回答ありがとうございました。 う~ん まだまだ私はマクロ初心者な者ですから 内容が分かりかねます すみません。 もう少し 基本的なことから勉強し直してきます。
- fujillin
- ベストアンサー率61% (1594/2576)
>何か特別なマクロで可能でしょうか? 多分可能です。 でも特別なマクロというほどでもないでしょう。 (多分というのは、要求がはっきりとはわからないので「多分」です) ◆罫線の斜線を利用する方法 1)対象範囲を調べる 2)斜線を引く範囲のセルを結合して、斜線の罫線を設定する。 (実験したところ、間に非表示行があっても大丈夫みたいです) ◆オートシェイプの線を利用する方法 1)対象範囲を調べる 2)斜線を引くセル範囲の「左上のセル」と「右下のセルの斜め右下のセル」の(top、left)間に線を引く などが考えられますが、もとの表に罫線が設定されている場合は、最初の方法だと、結合すると罫線が消えてしまうので、2番目の方法のほうが良いかも知れません。 表にデータなどを付け加えたときに、再度マクロを実行させるようなことがある場合は、以前に設定してある罫線やオートシェイプを一度削除しなければなりません。 この処理もマクロで処理することを考えると、罫線利用の場合は斜線だけ解除すればよさそうですが、オートシェイプ利用の場合は他にもオートシェイプがあるかも知れないので、削除して良い線であることを判定できるような一工夫が必要かと思われます。
お礼
ありがとうございます。 とりあえず 1)の「対象範囲を調べる」ができなくって困っているのですが・・・
お礼
ご回答ありがとうございました。 まず手動の方を実行してみたところ バッチリうまくいきました。 その後,自動の方を実行してみて とても感動しました。 まさに思っていた通りのものでした。 本当にありがとうございました。