VBAとかマクロってそもそも何なの?

応用編 一撃で仕事が片付くVBA攻略法の記事もあります。

VBAと言うのは簡単に言うとExcelのプログラミング言語と覚えてください。プログラミング言語ってそもそも何なの?と思うかもしれませんが、パソコンに対してつかう言葉のことです。種類はたくさんあるんですけども、それらの総称です。VBAは、Visual Basic for Apricationの略です。マクロはVBAで書いた内容を実行するExcelの機能になります。もう一つ言葉としてVBEがあります。Visual Basic Edita、編集画面のことです。
実際にExcelを起動させてやってみましょう。最初のExcelの設定だと、マクロが使えないようになっている可能性があります。それをまず使えるように設定していきましょう。

Excel VBA入門講座


知識ゼロの状態からVBAを理解しながら、自動化を自分でできるように作られています。これからプログラミング勉強したいとかやったことあるけど挫折してしまったなど、興味はあるけど、どういうのかよくわからないという方は、この教材を最後まで見れば理解できるようになります。

設定の仕方


Excelを開き、左上のファイルを押していただいて、1番下にあるオプションをクリックします。クリックしたら、1番下にトランスセンター(セキュリティーセンター)、そこからトラストセンター(セキュリティーセンター)の設定というボタンをクリックします。その中のマクロの設定をクリックします。「警告を表示してすべてのマクロを無効にする」というボックスにチェックを入れてください。マクロを使うときに自分で機能を使うか使わないか選択できるようになります。他だと無効になったり全部有効になって、セキュリティーが危なかったりするので、許可をすれば使える状態にしておいてください。



続いてVBEを起動させていきましょう。最初の設定だと表示されていないと思います。ホームを右クリックします。そうするとリボンの設定があるので、そこをクリックしましょう。開発というチェックマークをつけてあげましょう。



そうするとExcel画面のリボンのところに開発が出ます。開発を押してください。1番左にVisual Basicと書かれたところがあると思います。そこをまたクリックしてください。クリックすると灰色の画面が出てくると思いますので、さらに入力できるようにしていきましょう。挿入というところを押します。標準モジュールというのがあるの、でクリックしてください。この標準モジュールはVBAが書ける場所と思っておいてください。
VBAはExcelを持っている方は誰でもできます。Excelを使っている方のスキルアップとして業、そして業務改善も進みます。

VBEの設定
フォントサイズ
VBEの文字を大きくする方法をやっていきましょう。ツールをクリックしてください。ツールをクリックすると、その中にオプションがあります。そこをクリックしてください。この中の「エディターの設定」を押していただいて、後は好きなサイズを出してください。14か16あたりが大きくて見やすいと思います。


ツール、オプション、編集の中で、自動構文チェックを外しておきましょう。構文エラーでいちいち停止されるのをふせぐためです。

変数の宣言を強制する
ここはチェックを入れておいた方がいいです。タイプミスなど、いろいろなミスのチェックのためです。

編集ツールバーの表示
表示、ツールバー、編集からツールバーを有効化しておきましょう。コメントブロックをつかうときに便利です。シングルクオーテーション ‘ を文字列につけると、コメント(注釈)扱いになります。選択してから、コメントブロックを押すと、選んだところ全てコメント扱いにすることができます。

実際にプログラムを書いていきましょう。はじめにタイトルを決めます。タイトル宣言をするために、Subと入力していきましょう。必ず先頭は大文字にしてください。半角スペースを開けてタイトル名を入れていきましょう。

Sub テスト()
最初はテストという名前にしていきましょう。エンターキーを押すと( )が出てきて、下のほうにEnd Subというのが出てきたと思います。
Sub()
End Sub
この間に書いたものが処理と実行されることになります。
画面にメッセージを出す方法をやっていきましょう。

Sub テスト()
MsgBox”テスト”
End Sub

上記のようにメッセージボックスと言う意味のMsgBoxと打ちましょう。文字を直接入力するときにはダブルクォーテーション ” で挟んであげましょう。” は、シフトを押しながら数字の2を押すと出せます。
実行していきましょう。実行の仕方はF5を押します。Excelの画面に戻って、テストというポップアップ(お知らせ)が出てきます。

文字をセルに挿入する
ExcelのA1のセルに練習と入力しておいてください。そしてExcelのVBAに戻ります。
同じようにSubと入力して、取得という名前にしておいてください。

Sub 取得()
Msgbox Range(“A1”).Value
End Sub

Rangeと言う文字を使います。「セルを選択する」という意味になります。今回はA1に「練習」という字を入れていますので、Range(“A1”)となります。「何を実行するか」というのを、右横に入力していきます。今回はValueを使います。Valueは取得・設定という役割を果たします。これで実行してみましょう。先頭の部分にメッセージボックスMsgBoxを付けたし、F5を押して実行してみましょう。練習と言うポップアップが出てきます。
今書いたRange(“A1”)。この部分をオブジェクトといいます。オブジェクトは、セルとかシートとか、何か物のことに対してオブジェクトといいます。後は図形とかグラフとか全てオブジェクトをあつかいです。先程の.Valueと書いたところをプロパティーと呼びます。状態を表しています。文字の大きさ、色、太さこういうものをプロパティーといいます。
VBAの書き方は、オブジェクト.プロパティーとなります。

次はA2に文字を入れていきますA2をまず取得してきますので、今回もValueを使います。

Sub 文字入力( )
Range(“A2”).Value = “テスト”
End Sub

と入力します。


プログラミングにおいて= は代入を意味します。右にあるものを左に渡すと言う意味なので覚えておいてください。
F5を押して実行すると、テストと言う文字がA2に入ります。ExcelのシートにA2にテストと書かれているのがわかります。マクロ画面とシート画面の切り替えは、Altキーを押しながらtabを押すと素早く切り替えることができます。便利なので覚えておいてください。

他のセルに書かれている文字を違うセルに入力するというのをやっていきます。今回はA2に書かれている文字をA3に入力するというものをやっていきます。A2にテストという文字を入れてください。

Sub 文字入力()
Range(“A3”).Value = Range(“A2”). Value
End Sub

実行するとA3のところにテストが入っています。

Cellsというものがあります。先程のRangeと同じ意味です。少し確認しましょう。Cells(5,5).value=”テスト”は、 5行目(上下の番号)の5列目(左右のアルファベット)という意味です。実行すると、E5にテストが入ります。


マクロの記録
入力をしなくてもVBAにしてくれる便利な機能です。
開発からマクロの記録をクリックしてください。マクロ名と言うところは先程のSubの部分です。太字と入れてみましょう。「Excelで入力をする内容をVBAの形で記載してくれる」という機能がマクロの記録です。VBAの形で出てきます。セルA3をクリックしましょう。太字にするのでホームから太字をクリックします。開発に戻って記録終了を押します。セルA3を太字にした内容がプログラミングとして記録されています。先程のVBAに戻っていただき左横にモジュール2が追加されています。クリックすると出てきます。マクロの記録ってすごく便利なので、これで全部作ればいいじゃないかと思うかもしれませんが、これだとできないことが結構多かったり、書いてあることがぐちゃぐちゃで表示されたりします。あくまでも今みたいに「どう書けばいいんだろう?」と調べるときにマクロの記録をとるといいです。

ボタンの設置
今まではF5で実行してきたんですけども、ボタンを設置し実行できるようにしていきましょう。Excel画面の開発から挿入を押すと、フォームコントロールができます。ボタンをクリックしてもらって、大きさを調整してボタンをつくります。ここでまたマクロ名が出てきます。表示されているものは、今まで入力してきた題名が出てきています。ボタンをクリックするマクロが実行されます。ボタンは右クリックで編集することができます。

VBAの基本構文


①演算を行う


単価×数量=合計、セルI2(アイ2)にセルG2×セルH2を入れたいとします。
Range(“I2”).Value = Range(“G2”).Value*Range(“H2”).Valueとなります。
実際にVBEにコードを書いてみましょう。タイトルは、計算合計という意味のCalcAmountにしておきます。(タイトルは何でも大丈夫です)

Sub CalcAmount()
Range(“I2”).Value =Range(“G2”).Value*Range(“H2”).Value
End sub

マクロを実行するとI(アイ) 2に計算結果が入ります。

②「変数」を活用する

変数は値を記憶させておく箱のようなものです。


変数を使うには変数を宣言する必要があります。「こんな箱がありますよ」とマクロに知らせます。また掛け算をしますが、その値を変数に代入し、さらにセルI2に対して代入します。
これをVBEに書くと、下のようになります。

Sub CalcAmount()
Dim amount As long
amount = Range(“I2”).Value*Range(“H2”).Value
Range(“I2”).Value = amount

Dim Asが変数を使用するための宣言になります。
amountが変数、Longが型になります。Longは整数を入れる変数に使う型になります。


変数には型があります。例えば水を入れたかったら、水を壊れないような器が必要ですよね。重たいものだったら重たいものを入れるための、しっかりとした器を用意する必要があります。入れたい物に合った器を用意しなくてはいけないのです。データにも型が10種類以上あります。
マクロを実行すると掛け算の答えがセルI2に入ります。
重要な設定をもう一度確認しておきましょう。「変数の宣言を強制する」の欄にチェックをしておいてください。もし変数を間違えた型や名前で付けてしまったときに警告してくれます。

③繰り返し作業 For文にする


必要な処理の繰り返しはマクロにやらせましょう。自動化の醍醐味で、とてもエキサイティングな部分です。変数はiをよく使われます。数えるときに指を使うなどしますよね?その代わりだと思ってください。Indexという英単語から慣習的に使われていますが、どんな文字でも問題ありません。

VBEに書いてみましょう。

Sub Kurikaeshi
Dim i As Long
   For i=1 To 10
  MsgBox”こんにちは”
  Next i
End Sub
Next iというのは、iが1ずつ増えていくという意味になります。実行すると、「こんにちは」というポップアップが10回繰り返されます。

実務では2行目から19行目を計算していくときなどに使うことができます。先ほど演算で行った単価×数量の部分です。

Sub CalcAmount
Dim i As Long
  For i = 2 To 19
    Dim amount As Long
    amount = Range(“G” & i).Value*Range(“H”& i).Value
    Range(“I” & i).Value = amount
  Next i
End Sub

“G2″、”H2″のままだと2行目しか計算されないので、変数を用います。”G”& i とします。G列のi行目ということです。
実行すると、全て19行目まで計算されます。


データが1000件あっても自動処理。最終行を取得する
今までのままだと、10行目までしか計算されないことになります。データが新しく加わると、対応できなくなります。そこで、マクロが自分で最終行を調べ、対応できるようにしていきます。
よく使われる構文があります。
Cells(Rows.Count,1).End(xlUp).Row
lはエルの小文字になります。
Cellsは、セルを指定する書き方です。例えばCells(4,3)とすると、上から4行目の右に3列進んだセルC4のセルになります。

同じ書き方として、Cells(4,”C”)と書くこともできます。なぜなら3列目と言うのはC烈を意味しているからです。文字列として””で囲むことを忘れないでください。
Rows.countは最大行数のことです。Excelの行の1番下のことです。Rowsは行の集合体です。これをコレクションといいます。Countとすると、その個数となります。つまり最終行1番下のセルと言う意味になります。End(xlup)とは一番下から上に向かって、上がっていき、何か入力されているセルに当たると、そこで止まるという意味です。そして、.Rowは行番号(行数)という意味です。
Sub CalcAmount( )
 Dim maxRow As Long
 maxRow = Cells(Rows.Count,1).End(xlUP).Row
 Dim i As Long
   For i = 2 To maxRow
   Dim amount As Long
   amount = Range(“G” & i).Value*Range(“H”& i).Value
   Range(“I” & i).Value = amount
   Next i

End Sub

実行すると、19行目を超えても、最後まで計算が繰り返されます。

④マクロに自動で判断させる条件分岐If文


例えばAでないならB、BでないならCと言うように、条件に応じて柔軟に対応できるマクロを作ることができます。

金額に応じて送料を計算する
条件が金額が3000円未満なら送料を300円計上する判断させたいとします。If文を使います。日常生活に例えてみますと、雨が降っているかどうかによって、傘を持っていくのかどうかという条件を判断するケースに当てはめてみます。例えば雨が降っているかどうか、という条件があったとして、もしそれがイエスだった場合傘を持って出かけるというアクションをするわけです。もしそうでない場合は傘を持たないという選択肢を取るわけです。このように2つのルートを作っておくというのはIf文になります。条件に対してイエスの場合のことを真といいます。そうでない場合は偽といいます。

Sub Jouken( )
  If Range(I2).Value<3000 Then
  Range(“J2”).Value = 300
  End If
End Sub

マクロを実行すると、3000円以内のところに300円が入ります。
Sub CalcAmount( )
Dim maxRow As Long
maxRow = Cells(Rows.Count,1).End(xlUP).Row
Dim i As Long
   For i = 2 To maxRow
   Dim amount As Long
   amount = Range(“G” & i).Value*Range(“H”& i).Value
Range(“I” & i).Value = amount
   If range(“I” & i ).Value< 3000 Then
  Range(“J” & i).Value = 300
  End If
Next i
End Sub

実行すると、J 列の3000円以下に300とつきます。送料がかからない場合、つまり3000円以上なら0と表示させるようにしていきましょう。

Sub CalcAmount( )
Dim maxRow As Long
maxRow = Cells(Rows.Count,1).End(xlUP).Row
Dim i As Long
  For i = 2 To maxRow
  Dim amount As Long
  amount = Range(“G” & i).Value*Range(“H”& i).Value
  Range(“I” & i).Value = amount
   If range(“I” & i ).Value< 3000 Then
  Range(“J” & i).Value = 300
    Else
    Range(“J” & i).Value = 0
  End If
  Next i
End Sub

このようにすると、条件に当てはまらない場合、0が表示されます。

⑤別シート、別ブックとやりとり自在 オブジェクトの階層構造


オブジェクトは階層構造をとるという概念
別のシートや別のブックとやりとりが出来るマクロを制作できるようになります
例えば操作対象がクマだとします。クマというオブジェクトを指定していきます。
じゃあこのクマと言うのは他にもいるかもしれないので、どこに所属しているクマなのか書いていくわけです。森Aのクマ、さらに地区Aに住む森Aのクマのようにすると、厳密な指定になるわけです。
Excelで言えばセルA1といっても別のシートがあるかもしれないので、シートAのセルA1と指定してあげたり、ブックまで指定してあげてブックAのシートAのセルA1というように指定してあげたりすることになります。VBAで表すとRangeA1のように単一のセルで表してきましたが、その上の層として、シートを指定してあげます。例えば
Range(“A1”) 上の階層を指定してあげて、
Worksheets(“SheetA”) さらに上の階層を指定してあげて、
Workbooks(“book1.xlsx”).Worksheets(“sheetA”).Range(“A1”).Range(“A1”)

ワークシートを指定して文字を入力していきましょう。
新しくワークシート作っていきます+マークを押すとシートにというのが作られると思います。シート2のA1に文字が入力できるようにしていきます。

Sub 文字入力()
Sheets(“sheet2”).Range(“A1”).Value=”テスト”
End sub

Sheet2のA1にテストという文字が入りますよという意味になります
実行するとsheet2のA1にテストが入っています。シートを選択するときはシート名を先頭に入れてあげます。

別のシートのセルに他のセルの文字を入力する
シート1のA1に書いてある言葉を、シート2のA1に入力してあげる文を書いてみましょう。
エクセルのシート1のA1に練習と書いておきます。

Sub 文字入力()
Sheets(“sheet2”).Range(“A1”).Value=Sheets(”Sheet1”).Range(“A1”).Value
End sub

シート1のA1に書いてある文字をシート2のA1に書いてあげると言う意味になります。
これで実行するとシート2のA1に練習と入ります。

今日の日付を入れる
Sheet2のA2に入れていきます。

Sub 文字入力()
Sheet(“sheet2”).Range(“A2”).Value=Date
End sub

と入力して実行してください。簡単に入れられます。##が表示されていると思います横幅が入りきらない時はこのように表示されますので、セルの横幅を広げてあげてください。日付が表示されます。
請求書とか領収書とか作るときに日付入れて発行したりとかあると思うので使ったりします。

別シートを指定する方法
Worksheetsと書いてからシート名を(“”)の中に書きます。
Worksheets(“sheet2).Range(“A1”)

インデックス番号(左から何番目かの番号)で指定してあげる方法もあります。
Worksheets(2).Range(“A1”)
VBEで試してみましょう。

Sub SheetBook()
Worksheets(“sheet2”).Range(“A1”).Value=100
End Sbu

実行すると、別のシートを開いていたとしても、シート2のA!に100が入ります。別のブックを指定したいときは、
Workbooks(“book1.xlsx”).Worksheets(1).Range(“A1”)
のようになります。ただし、現在開いているブックに限ります。

シートやブックを指定しない場合は、現在アクティブ、開いて操作中のブックやシートが適応されます。

⑥抽出、コピー、クリアも自在!「メソッド」を使いこなす


Clearメソッドを書いてみよう
Sub Sakujo()
Range(“A1”).Clear
End Sub

実行すると、A1の書式・値が消えます。ClearをClearContentsにしてみましょう。

Sub Sakujo()
Range(“A1”).ClearContents
End Sub

実行すると、A1の書式はそのままで、値だけを消すことができます。

引数があるメソッド
Sub CopySuru()
Range(“B2”).Copy Range(“C2”)
End Sub

実行するとB2がC2にコピーされます。

AutoFilterメソッドを書いてみよう

データを抽出することができるメソッドです。

Sub Tyusyutu()
Range(“A1″).AutoFilter 6,”Word教材”
End Sub

“A1″というのは、別にどこのセルを選択しても構いません。6列目に”Word教材”という条件で絞り込むという意味になります。

フィルター処理をした結果だけをコピーしてシートに貼り付けるそんなマクロを書いています
Sub CalcAmount( )
Dim maxRow As Long
maxRow = Cells(Rows.Count,1).End(xlUP).Row
Dim i As Long
  For i = 2 To maxRow
  Dim amount As Long
  amount = Range(“G” & i).Value*Range(“H”& i).Value
  Range(“I” & i).Value = amount
    If range(“I” & i ).Value< 3000 Then
  Range(“J” & i).Value = 300
    Else
    Range(“J” & i).Value = 0
  End If
  Next  i
Range(“A1″).AutoFilter 6,”Word教材”
Range(“A1”).CurrentRegion.Copy Worksheets(“sheet2”).Range(“A1”)
End Sub

CurrentRegionというのは、自動的にデータのかたまり(表やグラフ)を選択するという関数です。
この状態で、実行すると、シート1においては、フィルターがかけられ、ワード教材だけに絞られます。その結果だけが、シート2に貼り付けられます。
このようにオートフィルターと組み合わせると、絞り込んだ結果だけをコピーして別のシートに貼り付けることができます。

⑦With文で省略 コードをスッキリさせる


セルB2を次のように操作したいとします。クリアメソッドで値を消す。値に10を入れる。セルB3に対して値をコピーする。

Range(“B2”).Clear
Range(“B2”).Value = 10
Range(“B2”).Copy Range(“B3”)

となります。
B2を何回も書書いてあることが問題です。そこでWith文を書きます。
最初にWith Range(”B2″)、最後にEnd Withを一度書いておけば、間にあるRange (“2”)を省略することができます。
Sub WithBun ( )
With Range(“B2”)
  .Clear
  .Value = 10
  .Copy Range(“B3”)
End with
End Sub

With文を使うと、修正も楽になります。例えば、上の場合だと、B2をB3に変えたいとき、一箇所With Range(“B3”)としてあげれば、修正をすることができます。

シートも省略できます。
With Worksheets(2)
  .Range(“A1”).Clear
  .Range(“B2”).Value = 10
  .Range(“C3”).Copy Range(“D3”)
End With

便利なVBA関数

関数名 + 引数(ひきすうと読む。関数に渡す情報)が基本的な形になります。

InputBox関数
ユーザーに何かを入力してもらうときに使います。入力してもらった値が返ってきて、入力されます。
Sub InputMacro( )
Range(“A1”).Value = InputBox(“入力してください”)
End Sub

実行すると、テキストが入力できるポップアップが出てきます。ここで答えを返すと、セルA1に答えが入力されます。

Replace関数
文字列の中で、文字列1を文字列2に置換します。
Replace(文字列,文字列1,文字列2)

Sub ReplaceMacro()
MsgBox Replace(“東京都品川区, “東京”, “Tokyo”)
End Sub

実行すると、Tokyo都品川区というポップアップが出てきます。

Left Right Mid関数
字列から左端、右端、指定の位置から何文字か抽出して返す関数です。

Sub Left Right Mid( )
MsgBox Left (“abcde@excl23.com”, 5)
End Sub

abcde@excl23.comの左から5文字、つまりabcdeを表示させることができます。

Sub Left Right Mid( )
MsgBox Mid (“abcde@excl23.com”, 6 , 1 )
End Sub

上の場合は、6文字目の1文字だけを抽出して表示させるという意味になります。実行すると、@だけが表示されます。

Now関数
現在の日時を返すことができます。引数は必要ありません。
Sub NowMacro
MsgBox Now( )
End Sub

実行すると、ポップアップで日時が表示されます。

Format 関数
文字列の表示形式を変換することができます。
Sub FormatMacro( )
MsgBox Format(Now,”yyyy/m/d”)
End Sub

実行すると、年月日が表示されます。ちなみに、mm/ddとすると、04/05のように、必ず2桁で表示されるようにできます。

Sub FormatMacro( )
MsgBox Format(Now,”aaaa”)
End Sub

とすると、曜日が表示されます。なぜaかというと、特に意味はなく、そう決められているので、これは覚えるしかないです。

Sub FormatMacro( )
MsgBox Format(19800,”#,##0”)
End Sub

上は実行すると、コンマが入り、19,800が表示されます。#は数字を表します。0がついていると、値が0のときに、0を表示してくれます。#,###だと、値が0のときに何も表示されなくなります。

VBA関数なら、難しい処理を1行で実行することができます。
・関数名 引数
・関数名(引数)・・・値を返す場合
他にも、100以上のVBA関数があります。実務でよく使うのは、20個くらいです。その都度、調べて、引き出しを増やしていきましょう。]

一撃で仕事を片付けるVBA攻略法

プログラミングおすすめ独学本