dポイントプレゼントキャンペーン実施中!

普通はオートシェイプを使えばできますよね。

しかし,伝票のような表があるとします。
表の上の行から順にデータが入力されていきますが,
表によっては,下の何行かはデータが入ってないようなこともあります。
このデータの入っていない行を抹消する意味で斜線を引くとすると,
何か特別なマクロで可能でしょうか?
(つまり,ページによっては20行の表のうち,10行までデータが入っているのでA11~E20のセルに一本の斜線を引いたり,あるページはデータが19行まで入っているのでA20~E20のセルに一本の斜線を引いたりします)

ちなみに,この場合,データが入っていないと言いましたが,
vlookup関数などでデータを持ってきているのでエラー表示の部分は
色を変えたりして表示していないようにしているだけです。

A 回答 (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
'---------------↑ ココマデ ↑---------------

以上ご参考まで。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございました。
まず手動の方を実行してみたところ
バッチリうまくいきました。

その後,自動の方を実行してみて
とても感動しました。
まさに思っていた通りのものでした。
本当にありがとうございました。

お礼日時:2009/03/26 23:18

斜線を引きたい範囲を選択し


下記の何れかを実行

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
    • good
    • 0
この回答へのお礼

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

何となくそれらしいことはできるのですが
やっぱり 斜線を引く範囲がわかりません。

お礼日時:2009/03/26 23:16

>普通はオートシェイプを使えばできますよね。


>データの入っていない行を抹消する意味で斜線を引く
 普通は斜線を引いた方が簡単かと存じますね。

 で、
>マクロで可能でしょうか?
 お示しの手作業を [新しいマクロの記録] で記録してみられたら、何が不明なのかはっきりすると存じますが、
・「斜線を引く」範囲
をどう指定するかではなかろうかと存じます。

 例えば、下記のようなことで似たようなことができますので、いろいろと試行錯誤なさってみてください。

Range("A2:E20").Borders(xlDiagonalDown).LineStyle = xlNone
For Each myRng In Range("A2:E20")
Select Case myRng.Text
Case "#N/A", "", 0
~~~
    • good
    • 0
この回答へのお礼

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

う~ん
まだまだ私はマクロ初心者な者ですから
内容が分かりかねます
すみません。
もう少し 基本的なことから勉強し直してきます。

お礼日時:2009/03/26 23:15

>何か特別なマクロで可能でしょうか?


多分可能です。 でも特別なマクロというほどでもないでしょう。
(多分というのは、要求がはっきりとはわからないので「多分」です)

◆罫線の斜線を利用する方法
1)対象範囲を調べる
2)斜線を引く範囲のセルを結合して、斜線の罫線を設定する。
(実験したところ、間に非表示行があっても大丈夫みたいです)

◆オートシェイプの線を利用する方法
1)対象範囲を調べる
2)斜線を引くセル範囲の「左上のセル」と「右下のセルの斜め右下のセル」の(top、left)間に線を引く

などが考えられますが、もとの表に罫線が設定されている場合は、最初の方法だと、結合すると罫線が消えてしまうので、2番目の方法のほうが良いかも知れません。

表にデータなどを付け加えたときに、再度マクロを実行させるようなことがある場合は、以前に設定してある罫線やオートシェイプを一度削除しなければなりません。
この処理もマクロで処理することを考えると、罫線利用の場合は斜線だけ解除すればよさそうですが、オートシェイプ利用の場合は他にもオートシェイプがあるかも知れないので、削除して良い線であることを判定できるような一工夫が必要かと思われます。
    • good
    • 0
この回答へのお礼

ありがとうございます。

とりあえず
1)の「対象範囲を調べる」ができなくって困っているのですが・・・

お礼日時:2009/03/23 21:33

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