** Excel VBAとは [#s418c7c6] - 概要 -- Excelを自動化するためのプログラミング言語 - 知識 -- Excel - 用語 -- ワークブック>ワークシート>セル - オブジェクト(ワークブック、ワークシート、セル) -- プロパティ(属性) -- メソッド(処理) ** Visual Basic Editorを使おう [#n4d47930] - Visual Basic Editorを開く -- 開発>Visual Basic -- プロパティウィンドウ、ツールバーを表示させる - 新規プロジェクト作成 -- 挿入>標準モジュール ** はじめてのExcel VBA [#n37101ac] - Hello Worldを表示させる -- 「HelloWorld」はプロシージャ名 Sub HelloWorld() MsgBox ("hello world") End Sub - Editor上のみで改行する場合 MsgBox _ ("hello world") - コメントを挿入(シングルクォーテーションを使用) 'コメント ** セルに値を表示してみよう [#hfbd18b7] Sub CellChange() Worksheets("Sheet1").Range("A1").Value = "hello" Range("A2").Value = "hello2" 'アクティブなシートは指定省略可能 Cells(3, 1).Value = "hello3" '行列番号で指定 Cells(3, 1).Offset(1, 0).Value = "hello4" '相対位置を指定 End Sub ** 複数のセルに値を表示してみよう [#r9a86547] Sub CellsChange() Range("A1", "B3").Value = "hello" 'A1-B3まで表示 Range("A5:C7").Value = "hello2" 'A5-C7まで表示 Range("4:4").Value = "row 4" '4行目に表示 Range("C:C").Value = "Column C" 'C列目に表示 Cells.Clear '値を全てクリア End Sub ** Withで命令をまとめてみよう [#mbc0315b] - オブジェクトにプロパティを設定する Sub WithTest() Range("A1").Value = "hello" Range("A1").Font.Bold = True '文字を太字に設定 Range("A1").Font.Size = 16 '文字サイズを16に設定 Range("A1").Interior.Color = vbRed 'セルの背景色を赤に設定 End Sub - 上記のプロシージャをWithステートメントでまとめる Sub WithTest2() With Range("A2") .Value = "hello" With .Font .Bold = True '文字を太字に設定 .Size = 16 '文字サイズを16に設定 End With .Interior.Color = vbRed 'セルの背景色を赤に設定 End With End Sub ** セルの値を取得してみよう [#za308e51] Sub GetTest() MsgBox Range("A1").Value 'A1の値を取得し表示 MsgBox (Range("A1").Font.Size) 'A1の文字サイズの値を取得し表示 End Sub ** メソッドを使ってみよう [#u4e31753] Sub MethodTest() 'Range("B2").Clear 'Range("B5").Delete shift:=xlShiftUp 'B5を削除し上方向にシフト Worksheets.Add after:=Worksheets("Sheet2"), Count:=2 'Sheet2の後にシートを2枚追加 End Sub ** Excel VBAとマクロの関係 [#ed0340a3] - VBAとマクロは表裏一体 -- VBAで記述した処理は自動的にExcelのマクロとして登録される -- マクロの記録を実行するとExcel側で自動的にVBAのコードが生成される ** Integer型の変数を使ってみよう [#h4d7343d] Sub VaiableTest() Dim x As Integer 'Integer型の変数名xを宣言 x = 10 + 5 x = x + 1 '四則演算 '+ - / * '商,余 '\ mod 'べき乗 '^ x = 2 ^ 3 'Range("A1").Value = x Debug.Print x 'イミディエイトウィンドウに表示 End Sub - イミディエイトウィンドウは値を確認したい時などデバグ時に有用 ** 他データ型の変数を使ってみよう [#paa32f57] Sub VariableTest() Dim y As Double '実数 Dim s As String '文字列 Dim d As Date '日付 Dim z As Variant '宣言時は型を決定しない Dim f As Boolean '真偽値 Dim r As Range 'Rangeオブジェクト y = 19.5 s = "hello" d = "2012/04/23" f = True Set r = Range("A1") Debug.Print y / 3 Debug.Print s & "world" r.Value = d + 7 'dに7日間追加 End Sub ** 配列を使ってみよう [#zcc04cc5] - 記述法1 Sub VariableTest() 'sales_0 = 200 'sales_1 = 150 'sales_2 = 300 Dim sales(2) As Integer sales(0) = 200 sales(1) = 150 sales(2) = 300 Debug.Print sales(1) End Sub - 記述法2 Sub VariableTest2() Dim sales As Variant sales = Array(200, 150, 300) Debug.Print sales(2) End Sub ** Ifで条件分岐をしてみよう [#f76db6d8] Sub IfTest() ' = < > <= >= <> and not or If Range("a1").Value > 80 Then Range("a2").Value = "OK!" ElseIf Range("a1").Value > 60 Then Range("a2").Value = "soso..." Else Range("a2").Value = "NG!" End If End Sub ** Selectで条件分岐をしてみよう [#x194c7cf] Sub SeletTest() Dim signal As String signal = Range("a1").Value Dim result As Range Set result = Range("a2") Select Case signal Case "red" result.Value = "STOP" Case "green" result.Value = "GO!" Case "yellow" result.Value = "CAUTION!" Case Else result.Value = "n.a." End Select End Sub ** While/Forでループ処理をしてみよう [#i084b6f8] - While文 Sub WhileTest() 'A1-A9に1-9の値を挿入 Dim i As Integer i = 1 Do While i < 10 Cells(i, 1).Value = i i = i + 1 Loop End Sub - For文 Sub ForTest() Dim i As Integer For i = 1 To 9 Cells(i, 1).Value = i Next i End Sub - For文にてStepを利用すると間隔を空けて表示さることが可能 For i = 1 To 9 Step 2 ** Eachで配列のループ処理をしてみよう [#d6b83b61] Sub EachTest() Dim names As Variant names = Array("taguchi", "fkoji", "dotinstall") For Each Name In names 'namesから1つずつ取り出してNamesに保存 Debug.Print Name Next Name End Sub ** Callでプロシージャを呼びだそう [#va17a204] Sub CallTest() Dim names As Variant names = Array("taguchi", "fkoji", "dotinstall") For Each name In names Call SayHi(name) Next name End Sub - CallTetプロシージャを別プロシージャから呼び出す Sub SayHi(ByVal name As String) Debug.Print "hi!," & name End Sub - イミディエイト hi!,taguchi hi!,fkoji hi!,dotinstall ** Functionプロシージャを使ってみよう [#r9955062] - Subプロシージャ -- 返り値を返さない - Functionプロシージャ -- 返り値を返す - 呼び出し元 Sub CallTest() Dim names As Variant names = Array("taguchi", "fkoji", "dotinstall") For Each name In names Debug.Print SayHi(name) Next name End Sub - 呼び出し側 Function SayHi(ByVal name As String) SayHi = "hi!," & name End Function - イミディエイト hi!,taguchi hi!,fkoji hi!,dotinstall ** 成績表を処理してみよう [#r57da2bb] - 名前とスコアの一覧表をExcelに入力(A1-10,B1-10) - 基準より低い点数をにハイライト設定しその数を集計を行う Sub FindLowScores() Dim i As Long 'LongはIntegerより桁数の大きい数値を扱える Dim n As Long i = 2 n = 0 Do While Cells(i, 1).Value <> "" '値が空ではない場合 If Cells(i, 2).Value < 60 Then Cells(i, 2).Interior.Color = vbRed n = n + 1 End If i = i + 1 Loop MsgBox (n & "件該当しました!") End Sub