EXcellのマクロ

  1. マクロ


    1. マクロとは

       表処理の操作を記録しておき、それを連続して実行することができます。これをマクロ機能と言います。

    2. マクロの作成

       ツールメニューの「マクロ」>「新しいマクロの記録」をクリックします。下のようなダイアログが出ます。適当なマクロ名(Fillh)を設定し、OKボタンを押します。



      この状態で、Excelへの操作を行うと、操作がマクロとして記録されます。たとえば、セルA1に1、B1に2を書き込み、1,2を選択後、Hまでドラッグしてオートフィルを行います。



      ここで、 ツールメニューの「マクロ」>「記録終了」をクリックします。この操作に対し以下のマクロが記録されます。
       ActiveCell.FormulaR1C1 = "1" は現在アクティブなセルに1を書き込みます。Range("B1").Select はB1を選択した操作です。Range("A1:B1").Select でA1:B1を選択し、Selection.AutoFill でオートフィルを実行します。最後に Range("A1:H1").Selectを実行し、このA1:H1のセルを選択します。
      Sub Fillh()
      '
      ' Fillh Macro
      ' マクロ記録日 : 2009/3/15  ユーザー名 : 伊藤
      '
      '
          ActiveCell.FormulaR1C1 = "1"
          Range("B1").Select
          ActiveCell.FormulaR1C1 = "2"
          Range("A1:B1").Select
          Selection.AutoFill Destination:=Range("A1:H1"), Type:=xlFillDefault
          Range("A1:H1").Select
      End Sub
       A1:H1のセルを消去し、A1セルを選択しておきます。ツールメニューの「マクロ」を選択します。記録済みのマクロが現れます。Fillhを選択し、「実行」をクリックします。これで、先の操作が再現できます。



    3. VBA

       マクロは操作を記録し実行するだけなので、条件付の操作や繰り返しは「マクロ」では記録できません。マクロとして記録される形式は、VBA(VisualBasic)の形式です。VBAで直接プログラムをすることで、条件や繰り返しも実行できます。
       ツールメニューの「マクロ」の Visual BasicEditor でVBのエディタを立ち上げ、先の Sub Fillh 関数をコピーします。


      実行メニューから、sub 実行を行うと、同じ操作を行うことができます。

  2. VBAの例とGUI


    1. 例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. 例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
       実行すると、「発注」シートに発注する品番と数が記録されます。


    3. 行の挿入、削除

       他の例として、行の挿入削除を行います。以下は空行を求めて削除します。
      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
      左の表に行の挿入を行うと、左のようになります。左の表に、行削除を行うと、右の表に戻ります。
       

    4. 実行ボタン

       VBAのボタンは内部ではマクロとして扱われます。マクロは、「オートシェイプ」で作成される図形に「登録」することができます。この図形をクリックすると、マクロの実行ができます。下図はこのように作成したマクロ実行ボタンです。


      具体的には、挿入メニューの「図」から「オートシェイプ」を選び、適当な位置にボタンとなる適当な図(何でかまいません)を配置します。必要なら、図の背景色と文字(挿入、削除)をいれます。これらの操作は、マクロとは無関係です。必要な操作は、図を右クリックしたとき現れるメニューで、「マクロの登録」を選択します。すると、VBAエディタで編集した関数名が表示されますから、実行したい関数をクリックします。
       実行モードでこの図形をクリックすると、登録したマクロを実行できます。

    5. GUI

       先の例は、ボタンによるGUIですが、VBAでは自由なレイアウトができる ユーザーフォーム機能があります。これは、ウインドウにボタン、文字表示枠、画像表示枠を配置し、エクセルのデータを表示枠にはめ込むことができます。
       この機能を利用すれば、エクセルの「表形式」にとらわれない、自由なデータの表現ができることになります。