こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

Excelのセルに斜線を引くマクロ

Excel2007を使用しています。
画像のように,「印刷」シートと「データ」シートがあります。
画像のように,「印刷」シートのAO112~BZ112のセルを結合しています。

そのセルには,VLOOKUP関数で,「データ」シート10列目のデータを返すようにしています。
関数を見てもらえば分かるとおり,
もし10列目にデータがなければ(VLOOKUPで値が0なら)””(空白)を返すようにしています。


以上のようなシートで,このセルにデータが無い場合,
画像のAO113~BZ113のように右上がりの斜線を引きたいのです。
もちろん,データが入っている場合は,斜線は消します。

マクロに関しては,まだまだ初心者のため,
ほとんど分からないので,分かりやすく教えていただけませんでしょうか?
お願いします。

投稿日時 - 2012-03-23 16:21:05

QNo.7379300

すぐに回答ほしいです

質問者が選んだベストアンサー

No.2です。

次のように変更しました。

If Target.Column = 81 And Target.Row = 2 Then
'Stop
myR = Application.VLookup(Range("$CC$2"), Sheets("データ").Range("1:1048576"), 10, False)
If IsError(myR) Then
Range("AO113:BZ113").Borders(xlDiagonalUp).LineStyle = xlContinuous
Range("AO113:BZ113").ClearContents
Else
Range("AO113:BZ113").Borders(xlDiagonalUp).LineStyle = xlNone
Range("AO113:BZ113").Value = myR
End If

投稿日時 - 2012-03-24 17:02:31

お礼

何度も親切にご指導くださいまして
ありがとうございます。
うまくできました。

勉強になりました。

投稿日時 - 2012-03-24 18:32:17

このQ&Aは役に立ちましたか?

1人が「このQ&Aが役に立った」と投票しています

回答(5)

ANo.5

横からおじゃまします。
CC2の値が変わった時にマクロが動作するようにすればいいと思います。
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address <> "$CC$2" Then Exit Sub
If Range("AO112").Value = "" Then
Range("AO112:BZ112").Borders(xlDiagonalUp).LineStyle = xlContinuous
Else
Range("AO112:BZ112").Borders(xlDiagonalUp).LineStyle = xlNone
End If
End Sub
ご希望通りの動作であればよいのですが。

投稿日時 - 2012-03-24 18:01:07

お礼

親切にありがとうございました。

うまくできました。
少しだけマクロの内容も理解できたように思います。

また機会がありましたらよろしくお願いします。

投稿日時 - 2012-03-24 18:33:37

ANo.3

No.2です。

AO112には、式が入っているのですから、判断条件には、使えませんね。
マクロの中で式を評価する必要があります。

AO112の式に何が入っているか教えてもらえますか。
画像では見えにくいため。

投稿日時 - 2012-03-24 12:48:20

お礼

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

AO112の式は,『データ』シートからVLOOKUP関数でデータを返すようにしています。

このファイルは,Sheet1が『印刷』シートで,Sheet2が『データ』という2つのシートから成っています。

『印刷』シートのAO112は,CC2のセルに入力した数字を基に,VLOOKUP関数を使って
『データ』シートの10列目の値を返すようにしています。
しかし,『データ』シートの10列目は,値が入っていないセルもあるので,その場合は空白""を返すようにしているため,次のような式になっています。


=IF(VLOOKUP($CC$2,'データ'!$1:$1048576,10)=0,"",VLOOKUP($CC$2,'データ'!$1:$1048576,10))

もしかしたら,この式も,もっと簡単にできるのかもしれませんが。。。
いちおう,この式を使うことで,『データ』シートの10列目にデータがあれば,そのデータをAO112に記入し,
データが無い場合は,空白のままということになっています。
そこで,今回の質問は,その空白の時に斜線を引きたいということなんです。

文章力がないので,わかりにくいかもしれませんが
この説明でいかがでしょうか?
よろしくお願いします。

投稿日時 - 2012-03-24 15:26:43

ANo.2

以下のコードを標準モジュールではなくワークシートのコードに貼り付けてください。

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Column = 41 And Target.Row = 112 Then
If Range("AO112") = "" Then
Range("AO113:BZ113").Borders(xlDiagonalUp).LineStyle = xlContinuous
Else
Range("AO113:BZ113").Borders(xlDiagonalUp).LineStyle = xlNone
End If
End If

End Sub

投稿日時 - 2012-03-24 07:42:26

お礼

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

私の説明が悪かったようで,
AO112にデータが無ければ,AO112に右上がりの斜線を引くようにしたいのです。
(AO113ではありませんでした。すみません)

そこで,教えていただいたマクロの


>If Range("AO112") = "" Then
>.Borders(xlDiagonalUp).LineStyle = xlContinuous
>Else
>Range("AO113:BZ113").Borders(xlDiagonalUp).LineStyle = xlNone


Range("AO113:BZ113")をRange("AO112:BZ112")に変えてみました。


ところが,AO112には,次のような数式が入っています。

=IF(VLOOKUP($CC$2,'データ'!$1:$1048576,10)=0,"",VLOOKUP($CC$2,'データ'!$1:$1048576,10))

すると,数式が入っているので""と思ってもらえなかったのか。。。
斜線が引けませんでした。

この数式を消すと引けるので,もう一歩だと思うのですが。。。
まったくのマクロ初心者のため,さっぱり分かりません。

よろしくお願いします。

投稿日時 - 2012-03-24 12:20:22

ANo.1

以下でどうでしょうか?

Sub macro()
With Worksheets("印刷")
If .Range("AO112").Value = "" Then
 Shapes.AddLine .Range("AO113").Left, _
   .Range("AO113").Top + .Range("AO113").Height, .Range("BZ113").Left, .Range("BZ113").Top
End If
End With
End Sub

投稿日時 - 2012-03-23 16:38:18

お礼

早速のご回答ありがとうございます。

2点,質問してよいでしょうか?


1.斜線を引くことはできるのですが,「データ」シートからVLOOKUP関数でデータを引用してくるのですが,データが変わる度に,自動でマクロが実行できるようにしたいのですが。。。。連続印刷する時に対応して欲しいのです。

2.新たなデータになったとき,AO112のセルにデータが入っている時は,斜線が消えなければならないのですが,残ったままになっています。

以上の2点をよろしくお願いします。

投稿日時 - 2012-03-23 17:05:22

あなたにオススメの質問