第5話 セルを操ろう


Index

セルに色をつける 文字に色をつける セルの幅と高さを変える セルのいろいろな参照方法

セル範囲の集合を参照 セルを探そう セルのアドレスを取得 行数や列数を取得する

最終セルアドレスの取得 セル範囲のいろいろな参照



エクセルというぐらいですから、セルをいろいろと操作することはとっても重要だと思います。そこで、第5話では、セル特集をしたいと思います。一度に多くのことをここに記述するのは難しい(知識もそれほどない)ので、追加型でいきます。




セルに色をつける

セルB2を青色にする手順をマクロで記録してみると、次のようになります。
Sub Macro1()
Range("B2").Select
With Selection.Interior
.ColorIndex = 5
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
End With
End Sub
マクロの名前はマクロ1です。
範囲B2を選びました。
選んだ範囲(セル)のインテリアにつて、
カラーナンバーを「5」に、
模様のパターンを「Solid」に、
模様のカラーナンバーを「Automatic」に
します。


Selection プロパティ
Application オブジェクトでは、アクティブ ウィンドウで現在選択されているオブジェクトを返します。
Window オブジェクトでは、指定されたウィンドウで現在選択されているオブジェクトを返します。
解説
Selection プロパティで返されるオブジェクトの種類は、何を選択するかによって異なります。たとえば、セルを選択しているときはRange オブジェクトが返されます。何も選択していないときは Nothing が返されます。このプロパティは、オブジェクト修飾子を指定せずに、Application.Selection と指定しても同じ動作を表します。

Interior プロパティ
オブジェクトを返すプロパティです。指定されたオブジェクトの塗りつぶし属性( Interior オブジェクト) を返します。値の取得のみ可能です。

ColorIndex プロパティ

次に示すオブジェクトに応じて、輪郭線、フォント、罫線、内部の塗りつぶしなどに適用する色を設定します。色は、現在のカラー パレットのインデックス、または定数で表します。使用できる定数は、XlColorIndex クラスの xlColorIndexAutomatic または xlColorIndexNone です。値の取得および設定が可能です。バリアント型 (Variant) の値を使用します。

オブジェクト 内容
Border 輪郭の色。
Borders 罫線の四辺の色です。すべての四辺の罫線が同じ色でない場合、Null 値を返します。
Font 文字の色です。自動に設定する場合は、xlColorIndexAutomatic を指定します。
Interior 内部を塗りつぶす色です。xlColorIndexNone を指定すると、塗りつぶしは行われません。xlColorIndexAutomatic を指定すると、自動になります (描画オブジェクトのみ)。

解説

ColorIndex プロパティでは、ブックのカラー パレットのインデックス番号で色を指定します。現在のカラー パレットを返すには、Colors プロパティを使ってください。

次の図には、標準のカラー パレットのカラー インデックス番号が示されています。


Pattern プロパティ
Interior オブジェクトの場合、内部のパターンを設定します。値の取得および設定が可能です。長整数型 (Long) の値を使用します。

使用できる定数は、次に示す XlPattern クラスのいずれかです。

xlPatternAutomatic

xlPatternChecker

xlPatternCrissCross

xlPatternDown

xlPatternGray16

xlPatternGray25

xlPatternGray50

xlPatternGray75

xlPatternGray8

xlPatternGrid

xlPatternHorizontal

xlPatternLightDown

xlPatternLightHorizontal

xlPatternLightUp

xlPatternLightVertical

xlPatternNone

xlPatternSemiGray75

xlPatternSolid

xlPatternUp

xlPatternVertical

どの模様がどれにあたるかは、試してみてください。

セルに色をつけて、さらに色付き斜め線をセルにつける手順をマクロの記録で記録すると
Sub Macro2()
Range("C2").Select
With Selection.Interior
.ColorIndex = 5
.Pattern = xlDown
.PatternColorIndex = 34
End With
End Sub
のようになります。それぞれの意味がよくわかります。




PatternColorIndex プロパティ

オブジェクト内部の塗りつぶし属性のパターンの色を、現在のカラー パレットのインデックス番号または定数で表します。使用できる定数は、XlColorIndex クラスの xlColorIndexAutomatic または xlColorIndexNone です。値の取得および設定が可能です。長整数型 (Long) の値を使用します。

解説

このプロパティに xlColorIndexAutomatic を設定しておくと、セルの網かけのパターンや描画オブジェクトの塗りつぶし属性のパターンの色を自動に決定します。また、xlColorIndexNone に設定しておくと、塗りつぶし属性のパターンの色を決定しません。これは Interior オブジェクトの Pattern プロパティに xlPatternNone を設定するのと同じです。

解説

次の図には、標準のカラー パレットのインデックス番号が示されています。






文字に色をつける

セルB2の文字「VBA]を赤色にする手順をマクロで記録してみると、次のようになります。
Sub Macro1()
Range("B2").Select
With Selection.Font
.Name = "MS Pゴシック"
.FontStyle = "標準"
.Size = 11
.Strikethrough = False
.Superscript = False
.Subscript = False
.OutlineFont = False
.Shadow = False
.Underline = xlUnderlineStyleNone
.ColorIndex = 3
End With
End Sub
マクロの名前はマクロ1です。
範囲B2を選びました。
選んだ範囲のフォントについて、
フォント名(書体)を「MSPゴシック」に、
フォントスタイルを「標準」に
サイズを「11」に
水平な取り消し線を「つけない」に
フォントを上付き文字に
フォントを下付き文字に
OutlineFont プロパティは Windows では無効
Windows で Font オブジェクトを対象にするときは、このプロパティは無効
下線の種類をなしに
カラーナンバーを「3」に
します。


Underline プロパティ
フォントに付いている下線の種類を設定します。使用できる定数は、XlUnderlineStyle クラスの xlUnderlineStyleNonexlUnderlineStyleSinglexlUnderlineStyleDoublexlUnderlineStyleSingleAccountingxlUnderlineStyleDoubleAccounting のいずれかです。値の取得および設定が可能です。長整数型 (Long) の値を使用します。


実際にFontに色をつけるマクロを組む場合は、必要なことだけを記述すればOKです。

Sub Macro1()
Range("B2").Select
Selection.Font.ColorIndex = 3
End Sub


Font プロパティ
オブジェクトを返すプロパティです。指定されたオブジェクトに設定されているフォント (Font オブジェクト) を返します。値の取得のみ可能です。


もう一つ色を指定できるものがあります。ColorプロパティーとRGB関数です。
Colorプロパティーは、値にRGB値を設定するようになっています。
RGB関数は、RGB( )のカッコの中に各値を0から255の範囲で指定すると、その組み合わせによって色が作成されます。組合せの数は、256×256×256=16,777,216色となります。ちなみに、RGBは「Red」「Green」「Blue」の三原色のことです。

Sub Macro1()
Range("B2").Select
Selection.Font.Color =RGB(255,0,0)
End Sub



Color プロパティ

次に示すオブジェクトに応じて適用する色を設定します。色は、RGB 関数によって作成された値です。値の取得および設定が可能です。長整数型 (Long) の値を使用します。

オブジェクト
Border 罫線または輪郭の色。
Borders 指定したセル範囲の周囲の罫線の色。線のすべての色が同じではないときは、0 (ゼロ) を返します。
Font フォントの色。
Interior 影付きのセルの影の色、または描画オブジェクトの塗りつぶしの色。



Name プロパティ

コントロールまたはオブジェクトの名前を設定します。あるいは、Font オブジェクトと関連付けるフォントの名前を設定します。





セルの幅と高さを変える

セルB2の幅と高さを変える手順をマクロで記録してみると、次のようになります。
Sub Macro1()
Range("B2").Select
Columns("B:B").ColumnWidth = 11
Rows("2:2").RowHeight = 30
End Sub
マクロの名前はマクロ1です。
範囲B2を選びました。
列Bの列の幅を0が11個入る大きさに
2行目の行の高さを30ポイントに
します。
1ポイントは、約0.35mm
0が11個入る大きさです。




Columns プロパティ

Application オブジェクトでは、アクティブ シートのすべての列を表す Range オブジェクトを返します。アクティブ シートがワークシートではない場合は、Columns プロパティは失敗します。値の取得のみ可能です。

Range オブジェクトでは、指定されたセル範囲の列を表す Range オブジェクトを返します。値の取得のみ可能です。

Worksheet オブジェクトでは、指定されたワークシートのすべての列を表す Range オブジェクトを返します。値の取得のみ可能です。

コレクションのメンバを取得する方法については、「コレクションからオブジェクトを取得する」を参照してください。

解説

このプロパティでは、オブジェクト修飾子を指定せずに、ActiveSheet.Columns と指定しても同じ動作を表します。

複数のセル範囲を含む Range オブジェクトに対して Columns プロパティを使用すると、選択範囲の中で最初に選択した領域の列が返されます。たとえば、Range オブジェクトで A1:B2 および C3:D4 の 2 つのセル範囲が含まれているとき、Selection.Columns.Count を実行すると 4 ではなく 2 が返されます。複数のセル範囲を選択している可能性があるときは、このプロパティを使用する前に Areas.Count を実行し、範囲が複数選択であるかどうかを確認します。複数選択の場合は、使用例の 3 番目のようにセル範囲の領域ごとにループします。


Columns プロパティの使用例

この使用例は、シート 1 の列 1 (列 A) のフォントを太字に設定します。

Worksheets("Sheet1").Columns(1).Font.Bold = True

この使用例は、"myRange" という名前のセル範囲にある、列 1 のすべてのセルの値を 0 に設定します。

Range("myRange").Columns(1).Value = 0

この使用例は、シート 1 で選択されているセル範囲の列数を表示します。複数の領域が選択されている場合は、領域ごとにループします。

Worksheets("Sheet1").Activate
areaCount = Selection.Areas.Count
If areaCount <= 1 Then
    MsgBox "選択されているのは " & _
        Selection.Columns.Count & " 列です。"
Else
    For i = 1 To areaCount
        MsgBox "領域" & i & " で選択されているのは" & _
            Selection.Areas(i).Columns.Count & " 列です。"
    Next i
End If




ColumnWidth プロパティ

指定された対象セル範囲内のすべての列の幅を設定します。値の取得および設定が可能です。バリアント型 (Variant) の値を使用します。

解説

列幅の単位は、標準スタイルの 1 文字分の幅に相当します。プロポーショナル フォントでは、数字の 0 の幅が列幅の単位になります。

列幅をポイント単位で取得するには、Width プロパティを使ってください。

対象セル範囲内のすべての列が同じ幅のときは、その値を返します。対象セル範囲内の各列の幅が異なるときは、Null 値を返します。




Cellsプロパティー

いろいろなCellsプロパティーの使い方を見てみましょう。

この使用例は、シート 1 のセル C5 のフォント サイズを 14 ポイントに設定します。

Worksheets("Sheet1").Cells(5, 3).Font.Size = 14    Cells(行、列)です。

この使用例は、シート 1 のセル 1 の数式をクリアします。

Worksheets("Sheet1").Cells(1).ClearContents    Cells(1)はA1を表しています。

この使用例は、シート 1 のすべてのセルのフォントを 8 ポイントの Arial に設定します。

With Worksheets("Sheet1").Cells.Font
    .Name = "Arial"
    .Size = 8
End With

この使用例は、シート 1 のセル範囲 A1: J4 に対してループを行い、セルの値が 0.001 未満の場合は、値を 0 (ゼロ) に置き換えます。

For rwIndex = 1 to 4
    For colIndex = 1 to 10
        With Worksheets("Sheet1").Cells(rwIndex, colIndex)
            If .Value < .001 Then .Value = 0
        End With
    Next colIndex
Next rwIndex

この使用例は、シート 1 のセル範囲 A1:C5 の書式を斜体に設定します。

Worksheets("Sheet1").Activate
Range(Cells(1, 1), Cells(5, 3)).Font.Italic = True

この使用例は、myRange という名前の列を調べてセルの値が 1 つ上のセルの値と同じ場合は、重複するデータを持つセルの参照を表示します。

Set r = Range("myRange")
For n = 1 To r.Rows.Count
    If r.Cells(n, 1) = r.Cells(n + 1, 1) Then
        MsgBox r.Cells(n + 1, 1).Address & "とデータが重複します。" 
    End If
Next n




Range プロパティー

単一のセルに数字を入力する場合
Range("B2").Value = 1

範囲を選択し数字を入力する場合
Range("B4:D5").Value = 2

複数の範囲を選択し数字を入力する場合
Range("B7:C8,D9:E10").Value = 3
Range("B7:C8","D9:E10").Value = 3
このように記入すると範囲は違ったものになります。

hani = "B12" & ":" & "C13" として範囲を選択し数字を入力する場合
Range(hani).Value = 4

Cellsの使用して数字を入力する場合
Range(Cells(15, 2), Cells(16, 3)).Value = 5

a = 19として数字を入力する場合
Range("B" & a).Value = 6

範囲指定の応用1
b = 22
Range("B21", "C" & b).Value = 7

範囲指定の応用2
c = 24
d = 26
Range("B" & c, "C" & d - 1).Value = 8

サンプル
Sub rangetest()
Range("B2").Value = 1
Range("B4:D5").Value = 2
Range("B7:C8,D9:E10").Value = 3
Range("B7:C8", "D9:E10").Interior.ColorIndex = 4
hani = "B12" & ":" & "C13"
Range(hani).Value = 4
Range(Cells(15, 2), Cells(16, 3)).Value = 5
a = 19
Range("B" & a).Value = 6
b = 22
Range("B21", "C" & b).Value = 7
c = 24
d = 26
Range("B" & c, "C" & d - 1).Value = 8
End Sub




セル範囲の集合を参照する

このように選択するには、
Sub 複数のセル範囲参照()
Dim EndRange As String
Dim EndRange2 As String
Dim bigrange As Range
Worksheets("Sheet1").Activate
EndRange = Worksheets("Sheet1").Range("A1").End(xlDown).Address
EndRange2 = Worksheets("Sheet1").Range("C1").End(xlDown).Address
Set bigrange = Application.Union(Range("A1:" & EndRange), Range("C1:" & EndRange2))
bigrange.Select
End Sub

Unionメソッド

2 つ以上のセル範囲の集合を返します。

構文

expression.Union(Arg1, Arg2, ...)

expression   省略可能です。対象となる Application オブジェクトを表すオブジェクト式を指定します。

Arg1, Arg2, ...   必ず指定します。集合させるセル範囲 (Range オブジェクト) を指定します。複数の Range オブジェクトを指定する必要があります。





セルを探そう

指定されたセル範囲の中で特定の情報を検索する。複数ある場合には、次々と選択していく。そんな機能を探ってみましょう。

特定の情報を検索するメソッドは、Findメソッドです。そして、Findメソッドによって開始された検索を継続するメソッドがFindNextメソッドです。この2つを使って、次々と検索していくマクロを作成してみましょう。

サンプル
Sub 検索()

With Worksheets(1).Range("a1:a20")
Set c = .Find(2, LookIn:=xlValues)
If Not c Is Nothing Then
firstAddress = c.Address
Do
c.Interior.Pattern = xlPatternGray50
Set c = .FindNext(c)
Loop While Not c Is Nothing And c.Address <> firstAddress
End If
End With

End Sub

セル範囲 A1:A20 で、値に 2 が含まれてるセルを灰色表示にします。



FindNext メソッド

Find メソッドによって開始された検索を継続します。前回の検索条件に一致するセルを前方 (行のときは左から右、列のときは上から下) に検索し、見つかったセル (Range オブジェクト) を返します。選択範囲やアクティブ セルには影響はありません。

構文

expression.FindNext(After)

expression   必ず指定します。対象となる Range オブジェクトを表すオブジェクト式を指定します。

After   省略可能です。バリアント型 (Variant) の値を使用します。指定したセルの次から検索を開始します。この引数で指定するセルの役割は、コードからではなく通常の画面上で検索を行う場合のアクティブ セルに該当します。対象セル範囲の中の、単一セルでなければなりません。検索は指定したセルの次から始まるので、指定したセル自体は、検索が範囲全体を一度検索して戻ってくるまで検索されません。この引数を省略すると、セル範囲の左上端のセルが検索の開始点となります。

解説

検索は指定された範囲の最後に達すると、範囲の最初に戻って検索を繰り返します。同じ範囲を繰り返して検索しないようにするには、最初に検索内容が見つかったセルの位置を保存しておき、次のセルが見つかるたびに、そのセルの位置と保存しておいたセルの位置を比較するようにします。






セルのアドレスを取得する

例えば、検索で、ある文字のセルアドレスを取得しておけば、次に検索したセルが最初に検索したセルと同じであるかどうかをチェックすることができます。セルアドレスを取得しておくと役に立つことがあります。

サンプル
Sub アドレス表示()

Set mc = Worksheets("Sheet1").Cells(1, 1)
MsgBox mc.Address()
MsgBox mc.Address(RowAbsolute:=False)
MsgBox mc.Address(ReferenceStyle:=xlR1C1)
MsgBox mc.Address(ReferenceStyle:=xlR1C1, _
RowAbsolute:=False, _
ColumnAbsolute:=False, _
RelativeTo:=Worksheets(1).Cells(3, 3))]

End Sub



$A$1
$A1
R1C1
R[-2]C[-2




行数や列数を取得する

使用している最終の行や列がわかれば、その次の行や列に数字等を簡単に入れていくことができるようになります。
行数や列数の取得は次のようにします。

retusu = ActiveSheet.UsedRange.Columns.Count
gyousu = ActiveSheet.UsedRange.Rows.Count


ただ、この場合、使用したセル(一度入力して、消した場合はそのセルも取得対象となります)をカウントしますので、文字等が入力されているセルの行数または列数を取得するものではありません。

入力されている最終セルのアドレスを取得する

ある列で、入力されている最終セルのアドレスを取得することができれば、いろいろと役に立ちます。
次のサンプルは、AはA列の最終セルのアドレスを取得します。BはA列の最終行数を取得します。

A = ActiveSheet.Range("A65536").End(xlUp).Address
B = ActiveSheet.Range("A65536").End(xlUp).Row



いろいろなセルまたはセル範囲の参照

Range プロパティと A1 形式の参照を使って、セルまたはセル範囲を参照できます。

次に Range プロパティを使った A1 形式の参照例を示します。5秒ごとにセル範囲を参照していきます。

Sub セル参照例()
Dim newhour As Integer
Dim newminute As Integer
Dim newsecond As Integer
Dim waittime
Dim i As Integer
i = 1
Do Until i > 9
newhour = Hour(Now())
newminute = Minute(Now())
newsecond = Second(Now()) + 3
waittime = TimeSerial(newhour, newminute, newsecond)
Select Case i
Case 1
Range("A1").Select 'セル A1
Case 2
Range("A1:B5").Select 'セル A1 から B5 まで
Case 3
Range("C5:D9,G9:H16").Select ' 複数の範囲の選択
Case 4
Range("A:A").Select '列 A 全体
Case 5
Range("1:1").Select '行 1 全体
Case 6
Range("A:C").Select '列 A から C まで
Case 7
Range("1:5").Select '行 1 から 5 まで
Case 8
Range("1:1,3:3,8:8").Select '行 1、3、8 全体
Case 9
Range("A:A,C:C,F:F").Select '列 A、C、および F
End Select
i = i + 1
Application.Wait waittime
Loop
Range("B1").Select
End Sub