-
例1:セルの内容に従い書式を変更する
VBAの実用的な例として、セルの内容に従い、文字の色を変更するマクロの例を紹介します。下の例で、性別に従い、文字の色を変更します。
myRowをRange型変数とします。For Each で A1を含む表の各行に対し、2列目のセルの値が 男 の場合と、 女 の場合で、異なる色を設定します。
Sub mark()
Dim myRow As Range
For Each myRow In Range("A1").CurrentRegion.Rows
If myRow.Cells(2).Value = "男" Then
myRow.Font.Color = RGB(0, 100, 255)
ElseIf myRow.Cells(2).Value = "女" Then
myRow.Font.Color = RGB(255, 100, 0)
End If
Next
End Sub
これを実行すると、次のようになります。
-
例2:在庫リストから発注リストを作成
下図のような在庫リストから、在個数100以下の品番を取り出し、在個数200になるよう発注リストを作成します。表の下のタブで表(Sheet1、Sheet2)の名前を「在庫」、「発注」と変更し、「在庫」のデータを作成しておきます。
Sheet2(発注)に以下の関数を作成します。n、myRange はLong、Range型の変数です。For Each で「在庫」シートの c2:c5
の各値(myRange)に対し、以下の処理を行います。For の繰返し範囲は、8行下のNextまでです。
繰り返しの内部で、myRangeの値が100以下なら(If myRange.Value < 100)、「発注シート」の同じ行の1列(Cells(n,
1).Value)に、myRangeの品番(Offset(, -2)で2列左のセルを指定)を、2列(Cells(n, 2).Value)に 200
- myRange.Value の値を記録します。_ はプログラムの文が次の行に続くことを意味します。
Sub order()
Dim n As Long
Dim myRange As Range
n = 2
For Each myRange In Worksheets("在庫").Range("C2:C5")
If myRange.Value < 100 Then
Worksheets("発注").Cells(n, 1).Value _
= myRange.Offset(, -2).Value
Worksheets("発注").Cells(n, 2).Value _
= 200 - myRange.Value
n = n + 1
End If
Next
End Sub
実行すると、「発注」シートに発注する品番と数が記録されます。
-
行の挿入、削除
他の例として、行の挿入削除を行います。以下は空行を求めて削除します。
with ActiveSheet.UsedRange は、下の .SpecialCells にかかります。ActiveSheet.UsedRange.SpecialCells()
としても同じですが、次の行も同じオブジェクトを参照しますから、共通部分を with句 で抜き出しています。SpecialCells(xlCellTypeConstants)
は空でない行になります。これを一旦不可に設定し、次の行で、可視の行(空白の行に相当します)をすべて削除します。そのご、すべてのセルを可視に戻します。
'空行を削除する
Sub DelEmptyLine()
With ActiveSheet.UsedRange
On Error Resume Next
.SpecialCells(xlCellTypeConstants).EntireRow.Hidden = True
.SpecialCells(xlCellTypeVisible).EntireRow.Delete
.EntireRow.Hidden = False
End With
End Sub
次の例は、3行ごとに空白を挿入するプログラムです。nに空白を挿入する間隔を指定します。Range("A1").CurrentRegion.Rows.Count
でA1から始まる領域の行数をmに求めます。(m - 2) / n は挿入する行数になります。n + 1 行おきに ActiveCell.EntireRow.Insert
で、注目している行に次に空白行を挿入します。
Sub insLine()
Dim i As Long
Dim n As Long
Dim m As Long
n = 3
m = Range("A1").CurrentRegion.Rows.Count
Application.ScreenUpdating = False
Range("A1").Select
For i = 1 To (m - 2) / n
ActiveCell.Offset(n + 1).Select
ActiveCell.EntireRow.Insert
Next
Range("A1").Select
Application.ScreenUpdating = True
End Sub
左の表に行の挿入を行うと、左のようになります。左の表に、行削除を行うと、右の表に戻ります。
-
実行ボタン
VBAのボタンは内部ではマクロとして扱われます。マクロは、「オートシェイプ」で作成される図形に「登録」することができます。この図形をクリックすると、マクロの実行ができます。下図はこのように作成したマクロ実行ボタンです。
具体的には、挿入メニューの「図」から「オートシェイプ」を選び、適当な位置にボタンとなる適当な図(何でかまいません)を配置します。必要なら、図の背景色と文字(挿入、削除)をいれます。これらの操作は、マクロとは無関係です。必要な操作は、図を右クリックしたとき現れるメニューで、「マクロの登録」を選択します。すると、VBAエディタで編集した関数名が表示されますから、実行したい関数をクリックします。
実行モードでこの図形をクリックすると、登録したマクロを実行できます。
-
GUI
先の例は、ボタンによるGUIですが、VBAでは自由なレイアウトができる ユーザーフォーム機能があります。これは、ウインドウにボタン、文字表示枠、画像表示枠を配置し、エクセルのデータを表示枠にはめ込むことができます。
この機能を利用すれば、エクセルの「表形式」にとらわれない、自由なデータの表現ができることになります。