マクロの自動記録で雛型作って適当に改造というお手軽さ。~ 一般企業の業務システムなんて殆ど何でも作れちゃうし!~ でもトラブルの元になることもあったりする。~ #contents *はじめに [#ue758f7e] VBAはMicrosoft Officeに搭載されている統合開発環境Visual Basic Editor(VBE)上で開発する。~ コードはMicrosoft Excel 2003と2007で動かしているが2003以前でも2007以降でもたぶん動く。~ バージョン間の互換性は高い。~ *HelloWorld [#e42bc4f1] -''下準備'' --''2003''~ ツール→マクロ→セキュリティ→中もしくは低をクリック --''2007''(2010も2013も同じ)~ 多少面倒くさい。今後のために開発タブを表示させその後設定を変更する。~ 左上のMicrosoft Officeボタン→Excelのオプション→基本設定→Excelの使用に関する基本オプション→~ 開発タブをリボンに表示する→マクロの設定→ 警告を表示しすべてのマクロを無効にする又はすべてのマクロを有効にするをクリック -''VBEの起動・プログラムの実行'' --''2003''~ ツール→マクロ→Visual Basic Editor --''2007''~ 開発タブ→Visual Basic~ あとは以下をコピペして実行→Sub/ユーザーフォームの実行→HelloWorldを選択して実行 Sub HelloWorld() 'これはコメント、アポストロフィーのあとに入力する 'メモみたいなもん '実行結果はA1セルにHelloWorldと表示される Range("A1").Value = "HelloWorld" End Sub -''解説''~ Sub HelloWorld()からEnd Subまでがプログラムを構成する最小単位であるプロシージャである。~ Sub HelloWorld()はプロシージャ名となる。HelloWorldの部分を書き換えれば好きな名前に出来る。~ 次に何(オブジェクト)をどうするのかを命令(メソッド)したり設定(プロパティ)を変更したりする。 オブジェクト名.メソッド名 オブジェクト名.プロパティ名 = 値 Range("A1").Value はRange(セル)にValue(値の代入の設定を行うプロパティ)をするという意味である。~ Valueは他にもセル内の値を参照するときにも使う。= は値を代入するときに使う記号である。~ ""内に代入したい値を入力する。ただし数値であれば""は不要である。= 1 + 2 のようにすれば計算結果を代入できる。~ ""を使うと(= "1 + 2")計算結果ではなく1 + 2という文字列が代入される。 また= "1" + "2"のようにすると12という文字列が代入される。 -プロシージャ名のルール *変数の利用 [#kfb3527e] -''変数とは''~ 利用したいデータ(文字列や数値)を一時的に取り置くための箱のようなもの パソコンのメモリに一定のスペースを確保しそこにデータを記憶させる。~ -''プログラム'' Sub 変数() 'あらかじめA1セルとB1セルに入力されている整数を掛けて計算結果をC1セルに表示する Dim i As Integer Dim j As Integer i = Range("A1").Value j = Range("B1").Value Range("C1").Value = i * j End Sub -''解説''~ まずは変数名と変数で何のデータを扱うのか(変数の型)を定める。これを変数の宣言という。~ VBAの場合はDim 変数名 As 変数の型となる。Integerは-32768から32767までの整数を扱うための型である。 Dim i As Integer Dim j As Integer 次に用意した変数に値を代入する。今回はセルを参照してそこに入力されている値を代入する。 i = Range("A1").Value j = Range("B1").Value C1セルに計算結果を代入する。 Range("C1").Value = i * j -''VBAの特殊仕様''~ これは他言語ではよく見られる仕様であるが… int i,j,k; VBAではこのようにするとk以外はVariantになってしまう。 Dim i, j, k As Integer 正しくは Dim i As Integer, j As Integer, k As Integer 他にもVBA(VB)は独特の仕様があるから気を付けよう。 -''変数名のルール'' -''変数の型一覧'' |型|扱えるデータ|メモ| |Integer||| |long||| |Songle||| |Double||| |String||| |Byte||| |Boolean||| |Currency||| |Date||| |Object||| |Variant||| *計算 [#w57ac774] Sub 計算() Dim i As Single Dim j As Single i = 3 j = 2 '加 Range("D1").Value = i + j '減 Range("E1").Value = i - j '乗 Range("F1").Value = i * j '除 Range("G1").Value = i / j '商 Range("H1").Value = i \ j 'あまり Range("I1").Value = i Mod j 'べき乗 Range("J1").Value = i ^ j '文字列結合演算子 Range("k1").Value = i & j End Sub -''解説''~ これらの記号(+,-,*,/,\,Mod,^)は算術演算子と呼ばれるもので各種計算を行うためのものである。~ 文字列結合演算子は複数の文字列をひとつにまとめるためのものである。 *セルの操作 [#h7f52bd5] -''相対参照'' --''相対参照とは''~ 現在、選択されているセルから相対的に位置を指定する。 式の入ったセルの右下を引っ張ってコピーしたときに参照するセルが変わるアレ。 --''プログラム'' Sub 相対参照() 'セルG7を選択する Range("G7").Select 'ActiveCellは現在選択されているセルを参照する。 'Offsetはセルを移動させる。左の数値は上下の指定、右の数値は左右の指定。 '下に1つ、右に3つセルを移動させる。移動後のセルはJ8。 ActiveCell.Offset(1, 3).Select End Sub --''解説''~ 現在のセルの位置(ActiveCell)を基準とした相対位置をOffsetメソッドで指定する。 |CENTER:-2,-2|CENTER:-2,-1|CENTER:-2,0|CENTER:-2,1|CENTER:-2,2| |CENTER:-1,-2|CENTER:-1,-1|CENTER:-1,0|CENTER:-1,1|CENTER:-1,2| |CENTER:0,-2|CENTER:0,-1|CENTER:基準|CENTER:0,1|CENTER:0,2| |CENTER:1,-2|CENTER:1,-1|CENTER:1,0|CENTER:1,1|CENTER:1,2| |CENTER:2,-2|CENTER:2,-1|CENTER:2,0|CENTER:2,1|CENTER:2,2| -''絶対参照''~ --''絶対参照とは''~ 直接、セルを指定する。セルの前に$をつけるとコピーしても参照するセルが変わらないアレ。~ =$C$1+$D$1 --''プログラム'' ---単一のセルを指定 Sub 絶対参照01() Range("A1").Select End Sub ---複数の独立したセルを指定 Sub 絶対参照02() Range("B1,B3,B5,B7,B9").Select End Sub ---連続したセルを指定 Sub 絶対参照03() Range("C1:D5").Select End Sub ---おまけ Sub 絶対参照04() Range("A1,C1:D5").Select End Sub -''Cellsによる指定''~ 行番号と列番号を数字で指定する。列は1がA列、2がB列、3がC列…のようになる。~ 行や列を変数で指定して変化させたい場合、Rangeではなくこちらを使う。~ Cells(行番号,列番号).Select -''カット・コピー・ペースト'' --''プログラム'' Sub コピペ() '文字列の代入 Range("A1").Value = "( ^ω^)" Range("A2").Value = "\(^o^)/" Range("A3").Value = "(´∀`)" Range("A4").Value = "キタ━(゚∀゚)━!" Range("A5").Value = "vipper" 'コピペ Range("A1:A5").Copy 'Copy→Cutにするとカット Range("B1").PasteSpecial'コピー先の先頭を指定してペースト End Sub --''解説''~ CopyメソッドとCutメソッドは Range("B1,B3,B5,B7,B9").Copy や~ Range("A1,C1:D5").Copy のようなセルの指定はできない。 -''セルの設定''~ フォントや塗りつぶし、文字色などの変更~ --''プログラム''~ Sub 設定() 'フォント Range("A1:A10").Font.Name = "MS明朝" '太字 Range("B1:B10").Font.Bold = True '斜体 Range("C1:C10").Font.Italic = True '下線 Range("D1:D10").Font.Underline = True End Sub --''解説''~ Nameプロパティによるフォントの指定。""でフォント名を囲む。 Range("A1:A10").Font.Name = "MS明朝" Boldプロパティによる太字の設定。Falseは太字の解除を行う。 Range("B1:B10").Font.Bold = True Italicプロパティによる斜体の設定。Falseは斜体の解除を行う。 Range("C1:C10").Font.Italic = True Underlineプロパティによる下線の設定。Falseは下線の解除を行う。 Range("D1:D10").Font.Underline = True --''その他のプロパティ''~ ---ColorIndex~ セルを塗りつぶしや文字色の変更。数字で色を指定する。下記は緑。その他の色は[[こちらのサイト:http://www.ne.jp/asahi/mabu-messages/greetings-2-you/colorIndexnum.htm]]を参照 'セルの塗りつぶし Range("A1").Interior.ColorIndex = 10 '文字色の変更 Range("A1").Font.ColorIndex = 10 ---Color~ セルを塗りつぶしや文字色の変更。RGBで色を指定する。 'セルを塗りつぶす Range("A1").Interior.Color = RGB(255, 255, 255) '文字色の変更 Range("A1").Font.Color = RGB(255, 255, 0) ---Size~ 文字サイズの変更。 Range("A1").Font.Size = 12 *プログラムの記述量を減らす [#c434427f] With文を使うことによってプログラムの記述量を減らすことができる。次のプログラムをWith文を使い書き換える。 Sub 設定() 'セルの指定 Range("A1:A10").Select 'フォント 'Selectionは相対参照の項で使ったActiveCellと同じで現在選択されているセルを参照する。 'ただし複数セルを選択しているときActiveCellは先頭のセルしか参照しないので注意すること。 '今回の場合、ActiveCellを使うとA1セルしか以下の設定が反映されない。 Selection.Font.Name = "MS明朝" '太字 Selection.Font.Bold = True '斜体 Selection.Font.Italic = True '下線 Selection.Font.Underline = True End Sub With文を使うと以下のようになる。With~End With間のすべてのSelectionを省略することができる。 Sub 設定() 'セルの指定 Range("A1:A10").Select With Selection 'フォント .Font.Name = "MS明朝" '太字 .Font.Bold = True '斜体 .Font.Italic = True '下線 .Font.Underline = True End With End Sub With文の基本形 With 重複しているメソッドやオブジェクト … End With 次のように複数のメソッドやオブジェクトを省略することもできる。 'セルの指定 Range("A1:A10").Select With Selection.Font 'フォント .Name = "MS明朝" '太字 .Bold = True '斜体 .Italic = True '下線 .Underline = True End With End Sub このようにIf文(後述)などの他の構文と組み合わせることもできる。 Sub 文字列の比較1完全一致() Dim str As String str = Range("A1").Value With Range("A2") If str Like "a" Then 'A1セルに半角のaが入力されたとき .Value = "一致" Else 'それ以外 .Value = "一致しない" End If End With End Sub *条件分岐 [#rfb39303] 条件(セルの中の値や計算の結果など)によって処理を分けたいときにはIf文やCase文を使う。~ -''If文''~ --''プログラム''~ Sub 条件分岐If() Dim hundred As Integer hundred = Range("A1").Value If hundred < 100 Then 'A1セルに100未満が入力されたとき Range("A2").Value = "100未満" Else 'A1セルに100以上が入力されたとき Range("A2").Value = "100以上" End If End Sub --''解説''~ これはIf文の最も基本的な形である If 条件 Then '条件が満たされているときの処理 処理1 Else '条件が満たされていないときの処理 処理2 End If < は比較演算子で~未満を表す。意味は変数hundredが100未満のときである。 If hundred < 100 Then -''比較演算子''~ 条件を書くために重要な演算子。 |CENTER:演算子|CENTER:記号|CENTER:メモ| |CENTER:未満|CENTER:1 < 2|2を含まないので2 < 2は成立しない。 | |CENTER:以下|CENTER:1 <= 2|2を含むので2 <= 2も成立する。| |CENTER:超過|CENTER:2 > 1|2を含まないので2 > 2は成立しない。| |CENTER:以上|CENTER:2 >= 1|2を含むので2 >= 2も成立する。| |CENTER:等号|CENTER:1 = 1,1 <> 1|| |CENTER:文字列の比較|CENTER:Like "a"|CENTER:詳細は後述| --''比較演算子の文字列の比較について''~ この演算子を使うと正規表現のようなパターンマッチを行うことができる。~ あくまで正規表現のようなものであって正規表現ではない。~ ---完全一致~ Sub 文字列の比較1完全一致() Dim str As String str = Range("A1").Value If str Like "a" Then 'A1セルに半角のaが入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub ---部分一致~ Sub 文字列の比較2部分一致() Dim str As String str = Range("A1").Value If str Like "*a*" Then'複数の指定はa*b*cのようになる 'A1セルに半角のaを含む文字列が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub ---ある一定の範囲内での一致~ Sub 文字列の比較3ある範囲内での一致() Dim str As String str = Range("A1").Value If str Like "[a-g]" Then '数字[1-9]・ひらがな[あ-こ]・かたかな[ア-コ]も可 'A1セルに半角のa,b,c,d,e,f,gのいずれか一文字が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub ---ある一定の範囲外での一致~ Sub 文字列の比較4ある範囲外での一致() Dim str As String str = Range("A1").Value If str Like "[!a-d]" Then 'A1セルにa,b,c,d以外のアルファベットが一文字だけ入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub ---任意の文字数~ Sub 文字列の比較5任意の文字数() Dim str As Variant str = Range("A1").Value If str Like "???" Then 'A1セルに3文字の半角全角文字が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub ---任意の桁数の数字~ Sub 文字列の比較6任意の桁数の数字() Dim str As Integer str = Range("A1").Value If str Like "###" Then'こういう書き方も出来る[0-9][0-9][0-9] 'A1セルに3桁の半角全角数字が入力されたとき Range("A2").Value = "一致" Else 'それ以外 Range("A2").Value = "一致しない" End If End Sub -''論理演算子''~ こちらも条件を書くときにしばしば使われる。 |CENTER:演算子|CENTER:記号|CENTER:メモ| |CENTER:論理積|CENTER:条件1 And 条件2|条件1と条件2が両方満たされたとき。 | |CENTER:論理和|CENTER:条件1 Or 条件2|条件1と条件2のいずれかが満たされたとき。| |CENTER:排他的論理和|CENTER:条件1 Xor 条件2|条件1と条件2のいずれかが満たされたとき。| |CENTER:論理否定|CENTER:Not 条件|条件が満たされなかったとき。| |CENTER:論理等価|CENTER:条件1 Eqv 条件2|条件1と条件2が両方満たされたとき。もしくは両方満たされなかったとき。| |CENTER:論理包含|CENTER:条件1 Imp 条件2|条件1と条件2が両方満たされなかったとき。| -''Else If文''~ もっと分岐させたいときに使う。条件が複数あるIf文。 --''プログラム''~ Sub 条件分岐Else_If() Dim hundred As Integer hundred = Range("A1").Value If hundred >= 100 Then 'A1セルに100以上が入力されたとき Range("A2").Value = "100以上" ElseIf hundred >= 90 Then 'A1セルに90以上が入力されたとき Range("A2").Value = "90以上" ElseIf hundred >= 80 Then 'A1セルに80以上が入力されたとき Range("A2").Value = "80以上" ElseIf hundred >= 70 Then 'A1セルに70以上が入力されたとき Range("A2").Value = "70以上" ElseIf hundred >= 60 Then 'A1セルに60以上が入力されたとき Range("A2").Value = "60以上" Else 'A1セルに60未満が入力されたとき Range("A2").Value = "60未満" End If End Sub --''解説''~ If 条件1 Then 条件1が満たされているときの処理 ElseIf 条件2 Then 条件2が満たされているときの処理 ElseIf 条件3 Then 条件3が満たされているときの処理 … End If -''Select Case文''~ Else If文は個々の条件を書かなければならないので面倒で見づらい。 --プログラム~ Sub 条件分岐Select_Case() Dim hundred As Integer hundred = Range("A1").Value Select Case hundred Case Is >= 100 'A1セルに100以上が入力されたとき Range("A2").Value = "100以上" Case Is >= 90 'A1セルに90以上が入力されたとき Range("A2").Value = "90以上" Case Is >= 80 'A1セルに80以上が入力されたとき Range("A2").Value = "80以上" Case Is >= 70 'A1セルに70以上が入力されたとき Range("A2").Value = "70以上" Case Is >= 60 'A1セルに60以上が入力されたとき Range("A2").Value = "60以上" Case Else 'A1セルに60未満が入力されたとき Range("A2").Value = "60未満" End Select End Sub --解説~ Select Case 変数や式など Case Is 条件1 条件1が満たされているときの処理 Case Is 条件2 条件2が満たされているときの処理 Case Is 条件3 条件3が満たされているときの処理 … Case Else どの条件も満たされなかったときの処理 End Select 条件式を使わない場合(例えばString型の変数に特定の文字列が代入されたことを条件にするというようなとき)、ISは不要。~ Case "雨" Toを使えば値の範囲を指定できる。~ Case 1 To 10'1 <= n => 10 のとき *繰り返し [#t1f7555b] 無限ループを作ってしまったらEscキーで強制終了しよう。 -''For_Next文''~ --''プログラム''~ Sub 繰り返しFor_Next() Dim num As Integer num = Range("A1").Value 'A1セルに入力された数値だけループを繰り返す For i = 1 To num Step 1 'Cellsについてはセルの操作のCellsによる指定を参照 Cells(i, 2).Value = "このループは" & i & "回目です" Next i --''解説''~ For カウンタ変数名 = 初期値 To 終了値 Step 加算値(1なら省略可) 処理 Next カウンタ変数名(カウンタ変数名は省略可) 初期値はループ開始時のカウンタ変数の値である。このカウンタ変数の値が終了値になるとループが終了する。カウンタ変数は宣言しなくても使える~ ループを一周するごとにカウンタ変数に加算値が加算される。またExit Forを使うとループを途中で抜けることができる。 --''Exit For使用例''~ [[練習問題-素数判定:http://vipprog.net/wiki/?%E7%B7%B4%E7%BF%92%E5%95%8F%E9%A1%8C#o8db2119]]の[[解答例>練習問題/解答例/素数判定/Excel VBA]]を参照。 -''For_Each文''~ 配列で詳しく説明する。~ -''Do_While文''~ 何回繰り返すかわからないとき(空セルが無くなるまで処理を続けたいときなど)に使う~ --''プログラム'' Sub 繰り返しDo_While() Dim num As Integer Dim i As Integer num = Range("A1").Value i = 1 'A1セルに入力された数値だけループを繰り返す Do While i <= num Cells(i, 2).Value = "このループは" & i & "回目です" 'ループが一周するごとにiに1が加算される(numの数値に近づく=終了条件に近づく) i = i + 1 Loop End Sub --''解説''~ 終了条件が満たされるまで処理を実行し続ける。Exit Doを使うとループを途中で抜けることができる。 Do While 終了条件 処理 Loop このように後判定にすることもできる。後判定にすると必ず1回は処理を実行する。 Do 処理 Loop While 終了条件 -''二重ループ'' --''プログラム''~ Sub 二重ループ() '九九の表 '外側のループが1回終わる間に内側のループが9回行われる For i = 1 To 9 For j = 1 To 9 Cells(i, j).Value = i & "×" & j & "=" & i * j Next j Next i End Sub --''解説''~ ループの中にループを組み込むとこのように二重三重の繰り返し処理をさせることができる。~ 繰り返しや条件分岐は重要な要素なので練習問題の[[ループ練習>http://vipprog.net/wiki/exercise.html#eb2c4338]]や[[FizzBuzz>http://vipprog.net/wiki/exercise.html#t52e5a48]]でしっかり使い方を覚えよう。 *配列 [#z2f105a1] -''配列とは'' -''1次元配列'' -''多次元配列'' *ユーザー定義型の変数 [#w1e77530] *ワークシートとブックの操作 [#w17595bb] *関数の活用 [#od08c566] *ユーザー定義関数 [#qa414172] *グラフ [#s128df53] *ピボットテーブル [#h539fec6] *ユーザーフォーム [#u3c9f8de] *デバッグ [#jc8d8c64] *エラー処理 [#yfeaf1e4] *Win32APIの呼び出し [#q53b9111] *もっと大きなプログラムを作るときの注意事項 [#ffd6f474] *参考 [#y7791cc5] -''ユーザーフォーム''~ --アプリ作成で学ぶExcel VBAプログラミングユーザーフォーム&コントロール~ --ひと目でわかるMicrosoft Excel VBAコントロール&フォーム活用術~ -''web系''~ --Excel VBAでIEを思いのままに操作できるプログラミング術~ --新・Excel VBAで極めるシステムトレード 最強パワーアップ編~ -''ゲーム''~ --Excel VBA アクションゲーム作成入門~ -''3Dグラフィックス''~ --Excelで学ぶ コンピュータグラフィックス技術入門~ -''シミュレーション・数値計算''~ --Excelで遊ぶ手作り数学シミュレーション―グラフ機能とVBAプログラムを自在に操る~