No.1 VBAパーツ掲載に向けて

 VBAは、Visual Basic for Apprications edition の略。
Excel上でhは、マクロと呼ばれ、以下「マクロ」と表現し独断と偏見の言い回しで説明を進めさせていただきます。

●マクロって?
 マクロは、要するに作業の自動化を目的とした機能です。手作業でデータを入力したり、編集を行ったり、書式を設定したり、データ処理を行ったりすることを非定型業務と呼び、その作業の中で繰り返し操作を行うような処理があるとすれば、マクロで作業効率を大幅に向上させることができます。そのためには、その作業(Excel操作)をあらかじめマクロ言語形式で記述する必要があります。記述後は必要に応じて、作成したマクロをコールし自動実行を行います。この自動実行は、仕事を定型化する意味から定型業務と呼んでいます。
Excel操作において、非定型な仕事を定型的にするにはマクロは不可欠な機能となり、ExcelVBAを修得することにより職場内において評価されるシステムを提案することが可能になります。
また、関数に無い複雑な計算式をマクロ化によりオリジナルな関数として取り扱うこともできます。
Excelは表計算が基本ですが、関数やVBAを組み合わせることによって思い通りのシステム環境を構築することができます。

●マクロ言語形式って?
 初めて見るマクロコードは、暗号のような文字が連なっていますが、何でもルールがあり、そのルールさえ理解すれば誰でも扱うことができます。

1.簡単な入り口として、マクロレコーダーを使うこと!
  マクロレコーダーは、手作業で操作した内容をそのまま自動でマクロコードに変換してくれる機能です。最初は、多くの操作を自動記録するのではなく、一つの機能に絞り込みを行いマクロレコーダーが記述してくれたマクロコードを実際のExcelの動きとあわせて解析します。

一度にたくさんのことを覚えるのは大変です。マクロレコーダーから記録されたマクロコードを一つ一つ噛み砕いて進みましょう。

2.マクロの書き方
 VisualBasicEditorを使いコードを記述します。
詳細は、Excelあらかると「わからないけどとにかくVBAをあつかいた〜い!」を参照下さい。


以下、マクロを機能毎にまとめたパーツとして紹介します。Excelを起動させVisualBasicEditorを開き メニューバー「挿入」→「標準モジュール」 をクリックしVBAパーツをコピー&ペーストして確認できる準備を行ってください。

   




 No.2 セルの移動 その1

アクティブセルを所定の位置に移動する。
セルをG1に移動させます。
Sub No2()

' VBAパーツNo.2 セルの移動 その1

    ActiveSheet.Range("G1").Select

End Sub
 
セルの表現には、RANGEのほかにCellsがあります。
()内は(行番号,列番号)です。セルG1は 行が1 列がAから数えてGは7番目です。
Sub No2_2()

' VBAパーツNo.2_2 セルの移動 その1

    ActiveSheet.Cells(1, 7).Select

End Sub




 No.3 セルの移動 その2

セルA1からG1まで移動させる。
For 〜 Next ループ(繰り返し)処理でセルAからGまでの列数1から7まで繰り返す。
  1.  i は変数と呼びDimステートメントで変数宣言を行います。Dimを省略し暗黙の変数として扱ってもかまいません。その場合は、バリアント型として認識され違いはDimによる整数型 (Integer)宣言よりメモリー消費が多くなる点です。
  2. Chr(64 + i) ちょっとひねりを入れました。Chr関数は指定した文字コードに対応する文字を示す文字列型 (String) の値を返します。要するに内部コード「A」は65なので64に変数 i (1からNext文で +1 され7で終了)を加算することによりA(65)から始まり終わりのG(71)を求めたことになります。
  3. セルの移動だけではあまりにも早すぎてわからないのでMsgboxを組み入れて移動中のセルを表示するようにしました。
  4. & アンパーサンドは文字列の連結です。
Sub No3()

' VBAパーツNo.3 セルの移動 その2

Dim i As Integer

    For i = 1 To 7
       ActiveSheet.Range(Chr(64 + i) & "1").Select
       MsgBox (Chr(64 + i) & "1")
    Next i

End Sub
 
Cellsも同様にプログラムします。
Sub No3_1()

' VBAパーツNo.3_1 セルの移動

Dim i As Integer

    For i = 1 To 7
       ActiveSheet.Cells(1, i).Select
       MsgBox (Chr(64 + i) & "1")

    Next i

End Sub


※変数とは?
 データを格納するための名前を付けたメモリ上の場所。変数には格納する値のデータ型を指定することができ、変数に格納される値はプログラムの実行中に変更することができます。
 変数名には、文字 (英数字、漢字、ひらがな、カタカナ) とアンダスコア (_) を使うことができます。スペースや記号は使えません。変数名の先頭の文字は、英字、漢字、ひらがな、カタカナのいずれかでなければなりません。同一適用範囲 (スコープ) 内で同じ変数名を複数使うことはできません。
また、変数名の長さは、半角で 255 文字以内でなければなりません。




 No.4 セルに値を代入

  1. セルA1に123456の値を代入する。 (123456の数字は定数と呼びます。)
  2. セルA2にWebMambowを代入する。
  3. セルB1へセルA1を代入する。
Sub No4()

' VBAパーツNo.4   セルに値を代入

    ActiveSheet.Range("A1") = 123456
    ActiveSheet.Range("A2") = "WebMambow"
    ActiveSheet.Range("B1") = ActiveSheet.Range("A1")

End Sub
 




 No.5 セル範囲の参照

セル範囲を参照する定義方法。
参照 内容
Range("A1") セル A1
Range("A1:B5") セル A1 から B5 まで
Range("C5:D9,G9:H16") 複数の範囲の選択
Range("A:A") 列 A 全体
Range("1:1") 行 1 全体
Range("A:C") 列 A から C まで
Range("1:5") 行 1 から 5 まで
Range("1:1,3:3,8:8") 行 1、3、8 全体
Range("A:A,C:C,F:F") 列 A、C、および F
 




 No.6 セル値の複写

No.4で値を代入したセルA1とA2をセルC1とC2へ複写する。
Sub No6()

' VBAパーツNo.5 セルの複写

    ActiveSheet.Range("A1:A2").Select
    Selection.Copy
    ActiveSheet.Range("C1").Select
    ActiveSheet.Paste

End Sub
 




 No.7 セル値の移動

No.4で代入したB1値をB2へ移動する。
Sub No7()

' VBAパーツNo.7 セル値の移動

    ActiveSheet.Range("B1").Select
    Selection.Cut
    ActiveSheet.Range("B2").Select
    ActiveSheet.Paste
'    Application.CutCopyMode = False

End Sub

※ Application.CutCopyMode = False はコピーモードを解除する方法です。
 ここではコメントにしていますので実行するときにコメントを削除して違いを確認してください。





 No.8 セル値の消去

No.4、No.6、No.7で代入した値を消去する。
Sub No8()

' VBAパーツNo.8 セル値の消去

    ActiveSheet.Range("A1:C2").Select
    Selection.ClearContents

'    ActiveSheet.Range("A1:C2").Clear         'この構文のみでも良い

End Sub
 




 No.9 入力値をセルに代入

名前を入力して入力値をセルA1に代入する。
Sub No9()

' VBAパーツNo.9 名前を入力してセルに代入
Dim nam As String

    nam = InputBox("あなたの名前を入力してください。")
    ActiveSheet.Range("a1") = nam

End Sub
 




 No.10 シートの移動

シート名Sheet1からSheet2へ移動させる。
Sub No10()

' VBAパーツNo.10  シートの移動

    Sheets("Sheet2").Select

End Sub
 




 No.11 シート間のセル値の代入

No.4を実行しSheet1のセルA1をSheet2のA1セルへ代入する。アクティブセルをSheet2のA1へ移動する。
Sub No11()

' VBAパーツNo.11  シート間のセル値の代入

    Sheets("Sheet2").Range("A1") = Sheets("Sheet1").Range("A1")
    Sheets("Sheet2").Select
    Range("A1").Select

End Sub
 




 No.12 シート間のセル値の代入 その2

 @ Sheet1セルA1をSheet2セルB1へ代入
 A Sheet1セルA2をSheet2セルB2へ代入
 B Sheet1セルA3をSheet2セルB3へ代入
 C Sheet2セルB1からB3を加算しSheet2B4へ代入
 D Sheet2セルA4へ"代入セル値の加算"を代入
   ※@からBの代入値は数値とします。

・SetステートメントでSheetプロパティの値をsh1、sh2変数に代入します。変数名は任意です。

・With ステートメントを使用すると、一度指定したオブジェクトやユーザー定義型に対してオブジェクト名の再指定を省略して、一連のステートメントを実行できます。With ステートメントを実行すると、プロシージャの実行速度が向上します。また、オブジェクトを繰り返し入力をする必要がありません。
Sub No12()

' VBAパーツNo.12  シート間のセル値の代入 その2

Dim sh1 AS Worksheet , sh2 AS Worksheet

   Set sh1 = Sheets("Sheet1")                'オブジェクトへの参照を変数に代入
   Set sh2 = Sheets("Sheet2")                'オブジェクトへの参照を変数に代入

   With sh2
      .Cells(1, 2) = sh1.Cells(1, 1)
      .Cells(2, 2) = sh1.Cells(2, 1)
      .Cells(3, 2) = sh1.Cells(3, 1)
      .Cells(4, 2) = .Cells(1, 2) + .Cells(2, 2) + .Cells(3, 2)
      .Cells(4, 1) = "値の合計"
   End With

   Set sh1 = Nothing                      'オブジェクトの解放
   Set sh2 = Nothing                      'オブジェクトの解放

End Sub
 




 No.13 列から最終行を求める

A列に入力されている最終行を求める

 @ Sheet1のセルA列の適当なセルに値を代入して実行してください。
    A列の最終行を求めます。

※入力セルの範囲を特定するときによく使います。

・Sheets("Sheet1").Cells(Rows.Count, 1)でA列65536行が求められ End(xlUp).Row によって空白行の上端が求められます。 xlUp は方向を意味し上です。ちなみに下は xlDown 右は xlToRight
左は xlToLeft です。
Sub No13()

' VBAパーツNo.13  A列の最終行を求めます

   r = Sheets("Sheet1").Cells(Rows.Count, 1).End(xlUp).Row
   MsgBox ("A列の最終行は、 " & r & " です。")

End Sub
 



 No.14 シート全体から最終列、行を求める

シート全体の行列の最終値を求める。
Sub No14()

' VBAパーツNo.14  A列の最終行を求めます

   r = ActiveSheet.UsedRange.Columns.Count
   l = ActiveSheet.UsedRange.Rows.Count

   MsgBox ("最終列:" & r & " 最終行:" & l)

End Sub
 




 No.15 ブック名とシート名を取得

マクロを実行した時点のアクティブブック名をセルA1へ、アクティブシート名をセルA2へ代入する。
Sub No15()

' VBAパーツNo.15  ブック名とシート名を取得しセルへ代入

    ActiveSheet.Range("A1") = ActiveWorkbook.Name
    ActiveSheet.Range("A2") = ActiveSheet.Name

End Sub
 




 No.16 アクティブセルの行と列の値を取得

マクロを実行した時点のアクティブシート内のアクティブセルの行をセルA3へ、列をセルA4へ代入する。
Sub No16()

'VBAパーツNo.16 アクティブセルの行列値をセルへ代入

   ActiveSheet.Range("A3") = ActiveCell.Row                 '行の値
   ActiveSheet.Range("A4") = ActiveCell.Column               '列の値

End Sub
 




 No.17 ブック内のすべてのシート名を表示

ブック内のシート数を取得(Sheets.Count)してそのシート名をメッセージボックスに表示する。
左端のシートから順に表示される。
Sub No17()

'VBAパーツNo.17 ブック内のすべてのシート名を表示
Dim i As Integer

  For i = 1 To Sheets.Count
    MsgBox (i & "番目のシート名は " & Sheets(i).Name & " です。")
  Next i

End Sub
 




 No.18 繰り返し処理 その1

For 〜 Nextステートメントによる繰り返し処理
Sub No18()

'
MsgBox "ループ開始"
MsgBox "初期値1から始まり1ずつカウントアップ"
For i = 1 To 10
  MsgBox i
Next i

'
MsgBox "初期値1から始まり2ずつカウントアップ"
For i = 1 To 10 Step 2
  MsgBox i
Next i

'ネストさせた場合
MsgBox "ループ 、ネスト"
For i = 1 To 10
  For ii = 1 To 3
    MsgBox "iの値:" & i & " iiの値:" & ii
  Next ii
Next i

'カウンターの応用で値をセル行として利用する
'このブックのA列の1行目から10行目までの値を判断し100以上である時に
'ループから抜け出す。
MsgBox "カウンター値の応用 (セルA1からA10に適当な値を入力!)"
For i = 1 To 10
  If Cells(i, 1) > 99 Then
    Exit For
  End If
  Msgbox "セルA" & i & "の値:"& Cells(i, 1)
Next i

End Sub
 




 No.19 繰り返し処理 その2

Do 〜 Loopステートメントによる繰り返し処理
No18 と同じ条件で繰り返し処理を定義していますが本来はファイルのEOF判断による繰り返し処理の抜け出し条件、ある項目の値による繰り返し処理の抜け出し条件といったところで活用します。
ソースコードを判断し応用して活用下さい。
Sub No19()
'
MsgBox "ループ開始"

MsgBox "初期値1から始まり1ずつカウントアップ"
i = 1
Do
  MsgBox i
  i = i + 1
Loop Until i > 10

'
MsgBox "初期値1から始まり2ずつカウントアップ"
i = 1
Do
  MsgBox i
  i = i + 2
Loop Until i > 10

'ネストさせた場合
MsgBox "ループのネスト"
Ck = True: i = 1: ii = 1
Do
  Do While ii < 4
    If i = 7 Then
      Ck = False
      Exit Do
    End If
    MsgBox "iの値:" & i & " iiの値:" & ii
    ii = ii + 1
  Loop
  ii = 1: i = i + 1
Loop Until Ck = False

'カウンターの応用で値をセル行として利用する
'このブックのA列の1行目から10行目までの値を判断し100以上である時に
'ループから抜け出す。
MsgBox "カウンター値の応用 (セルA1からA10に適当な値を入力!)"
i = 1
Do
  If Cells(i, 1) > 99 Then
    Exit Do
  End If
  MsgBox "セルA" & i & "の値:" & Cells(i, 1)
  i = i + 1
Loop Until i > 10

End Sub

 




 No.20 「ファイルを開く」ダイヤログボックスを表示し任意のフォルダーを選択

GetOpenFilenameメソッドは、ユーザーからファイル名を取得するために、[ファイルを開く] ダイアログ ボックスを表示します。ダイアログ ボックスで指定したファイルは、実際には開かれません。変数opnには選択されたファイル名が代入されます。
「ファイルを開く」ダイヤログボックスで選択したファイルが格納されているフォルダー名をCurDir関数で取得します。
Sub No20()

opn = Application.GetOpenFilename
fdname = CurDir

MsgBox "フォルダー " & fdname & " を選択しました。"

End Sub
 




 No.21 「If... Then... Else ステートメントの使い方」

条件分岐の If の定義方法
'変数aが0の時に変数aへ1を代入
Sub No21_1()

   If a = 0 Then a = 1

End Sub

'変数aが0の時にセルA1の文字色を白、そして赤で塗りつぶし
Sub No21_2()

  If a = 0 Then
    With Selection.Interior
       .ColorIndex = 3
       .Pattern = xlSolid
    End With
    Selection.Font.ColorIndex = 2
  End If

End Sub

'条件に応じたステートメントの実行

'変数aが 0:"値は0です。" 1:"値は1です。" を表示
Sub No21_3()

   If a = 0 Then
     MsgBox "値は0です。"
   Else
     MsgBox "値は1です。"
   End If

End Sub

'変数aが 0:"値は0です。" 1:"値は1です。"  2:”値は2です。" を表示
Sub No21_4()

   If a = 0 Then
     MsgBox "値は0です。"
   ElseIf a = 1 Then
     MsgBox "値は1です。"
   Else
     MsgBox "値は2です。"
   End If

End Sub
 




 No.22 Select Case文

ifでネストするとわかりずらくなりますがそんな場合はSelectCase文ですっきりさせます。
Sub No22()

'a=1:k*2 a=3,4:k*2.5 a=5,6,7:k*3 a>8:k*2.7 以外:0  計算結果をansに代入

   Select Case a
      Case 1
        ans = k * 2
      Case 3, 4
        ans = k * 2.5
      Case 5 To 7
        ans = k * 3
      Case Is > 8
        ans = k * 2.7
      Case Else
        ans = 0
   End Select

End Sub
 




 No.23 サブプロシージャから別のサブプロシージャを呼び出す

サブプロシージャから別のサブプロシージャを呼び出す方法です。
この例は、共通的なロジックを設定するときに便利です。(使い道はいろいろです。)
'サブプロシージャから別のサブプロシージャを呼び出す。

Sub No23()
'2通りの呼び出し方を紹介します。引数は必要に応じて相手プロシージャに渡します。
'当然無い場合は指定は不要です。

   yobi1 100
   Call yobi2("処理が終了しました。")

End Sub

Sub yobi1(atai)

   For c = 1 To atai
      Cells(1, 1) = c
   Next c

End Sub

Sub yobi2(msg)

   MsgBox msg

End Sub