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

解決済みの質問

Excel VBA 空白セル以外のセルを罫線で囲む

Excel VBA 空白セル以外のセルを罫線で囲む

ここの質問箱をよく利用させて頂いている者ですが、また質問させていただきます。

あるシート(例:”Sheet1”)の全セル内のうち、ランダムな文字が全セル内のどこかに記入されています。

また、記入される位置は常に変化します。

つまり、ある時は「A1」に入力されていても、次ははそうでないということです。

この様な場合、文字が入力されているセルのみに罫線を引く処理を行いたいのですが、実現は可能でしょうか?

また、可能であれば、どの様なコードになるのでしょうか。教えてください。

投稿日時 - 2010-07-11 23:21:34

QNo.6031986

困ってます

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

まず、シートの全セルを対象に、データが入力されているかどうか検索して入力されていれば罫線で囲むという処理は実用的ではないと思う。普通にやったら時間がかかりすぎる。ある範囲に限定はできないのですか。
また、入力位置が変化して、その都度罫線を書き直すというなら、イベント処理になる。
入力は手動かどうかで、イベントも変わるが。

次のコードは、手動でデータを入力することにして、changeイベントを使い、セル範囲は100行100列までとした例です。Sheet1などのコードモジュールにおきます。

Private Sub Worksheet_Change(ByVal Target As Range)

Application.ScreenUpdating = False

If Target.Row <= 100 And Target.Column <= 100 Then
Range(Cells(1, 1), Cells(100, 100)).Select
End If

With Selection
.Borders(xlEdgeLeft).LineStyle = xlNone
.Borders(xlEdgeTop).LineStyle = xlNone
.Borders(xlEdgeBottom).LineStyle = xlNone
.Borders(xlEdgeRight).LineStyle = xlNone
.Borders(xlInsideVertical).LineStyle = xlNone
.Borders(xlInsideHorizontal).LineStyle = xlNone
End With

For Each c In Selection
If c.Value <> "" Then
With c.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
With c.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.Weight = xlMedium
.ColorIndex = xlAutomatic
End With
End If
Next
Target.Select

Application.ScreenUpdating = True

End Sub

投稿日時 - 2010-07-12 01:47:48

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

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

回答(5)

ANo.5

イベントを用いるかどうか、質問からは判断できません。
ただ、入力時にマクロ(VBA)が走るイベントが楽だということで使います。

条件付き書式は、書式という種類の設定ですから、物理的なファイルサイズを大きくさせてしまいますので、不用意に巨大な範囲には使えません。しかし、シートの隅から隅までということは常識的にありませんから、一定の範囲であるなら、そちらのほうが楽に動くかもしれません。

また、シート全セルから探すことも、別に大した問題ではありません。

 On Error Resume Next '定数が無い場合は、エラーを出さないようにする
 Set r = Me.UsedRange.SpecialCells(xlCellTypeConstants)
 On Error GoTo 0
 If r Is Nothing Then Exit Sub

という方法もあります。

なお、罫線は、以下のようにまとめて書くと良いと思います。単に、参考までです。

'//シートモジュール
Private Sub Worksheet_Change(ByVal Target As Range)
 Dim c As Variant
 Dim n As Variant
 Application.ScreenUpdating = False
 On Error Resume Next
 For Each c In Target
  If c.Value <> "" Then
    With c.Borders
     .LineStyle = xlContinuous
     .Weight = xlMedium
     .ColorIndex = xlAutomatic
    End With
  Else
   c.Borders.LineStyle = xlNone
  End If
 Next c
 On Error GoTo 0
 Application.ScreenUpdating = True
End Sub

なお、ループ内のWith ステートメントの範囲をどこまでにするかは、迷いますが、今回は、短めに置きました。

投稿日時 - 2010-07-12 13:40:13

ANo.4

>空白セル以外のセルを罫線で囲む
 「Excel VBA」ではなくて、[条件付き書式] を設定すればよいのでは?

1)対象範囲を選択します。
2)[条件付き書式の設定] ダイアログ を開きます(Excel2003 以前なら [書式(O)] - [条件付き書式(D)...])。
3)[条件1(1)] を「セルの値が」・「次の値に等しくない」・「=""」にし、[書式(F)] - [罫線] タブ - [外枠(O)] - [OK] として、セル内の値が「""」つまり「空白」でないときに「セルを罫線で囲」みます。
4)[OK] で [条件付き書式の設定] ダイアログ を閉じます。
5)以上で、セルに何かが入っているときには、「セルを罫線で囲」みます。
  ただし、Excel2007 以降の機能は存じませんが、Excel2003 以前なら罫線の太さを変えることはできません。

投稿日時 - 2010-07-12 08:01:29

ANo.2

Sub Macro1()
For INP1 = 1 To ActiveCell.SpecialCells(xlLastCell).Row
For INP2 = 1 To ActiveCell.SpecialCells(xlLastCell).Column
If Cells(INP1, INP2) <> "" Then
Cells(INP1, INP2).Borders(xlEdgeLeft).LineStyle = xlContinuous
Cells(INP1, INP2).Borders(xlEdgeTop).LineStyle = xlContinuous
Cells(INP1, INP2).Borders(xlEdgeBottom).LineStyle = xlContinuous
Cells(INP1, INP2).Borders(xlEdgeRight).LineStyle = xlContinuous
End If
Next INP2
Next INP1
End Sub
でどうでしょうか。

投稿日時 - 2010-07-12 01:29:46

ANo.1

Dim C As Range
For Each C In Selection

If C.Value="" Then

 ’やりたいこと
 End If

Next


Selection は選択した範囲です

自分で範囲を指定してください

投稿日時 - 2010-07-11 23:27:43

あなたにオススメの質問