【初心者の方向け】 Excel VBAで上達できる5つのコツ

マクロ(Excel VBA)

Excel VBA(マクロ)使っていますか?Excelは関数やピボットテーブルなど便利な機能が沢山有りますが、マクロもその一つです。ただし、マクロでしか出来ないこともかなり多く有り業務改善などに一番効果が出るのがマクロです。
この記事ではプログラミング未経験の方でもコツが掴めるやり方を記載していきます。

スポンサーリンク

そもそもExcel機能,関数,マクロの中でマクロが一番簡単

私は始めは関数が一番簡単だと思ってました。
会社でも誰にでも修正できるように関数を使ってね。と言われていました。
しかし、複雑な関数を組むと他の人は修正できなくなりました。
画像はそこまで複雑ではないですが、関数は1つのセルに詰め込む必要が有ります。
参照先も同様に関数が詰め込まれてたら、中身を調べるのに時間がかかりますね。
マクロだとフローチャートのようにプログラムが書けるしコメント書き放題です。
上達すればプログラムを流さなくてもどのようなプログラムかわかるようになります。

機能に関してはグラフやピボットテーブルなど使用頻度が多いものは使いこなせてますが知らない機能が多いんですよね。たまにしか使わない物だとリボンのどこにあったか忘れちゃいます。

マクロはやりたい事が決まっていれば、その通りにプログラムするだけなので
私的には簡単なほうだと思ってます。

プログラムの基本的な流れ

マクロの基本的な流れはデータの取得⇒処理⇒出力という流れになります。
取得と処理は同時進行だったりもしますが基本的にはこの流れで作成します。

データの取得

マクロ内で計算などをさせる場合はExcelのセル情報などをプログラム内で使えるようにする必要が有ります。
マクロ上でデータを格納するには変数を利用します。
変数とはプログラム内にデータを格納する箱みたいなものです。
Excelだとセルの一つと考えても問題ありません。
変数の使い方

使用したい変数名の前にDim,変数名の後ろにAs,最後に変数の型を指定します。
※全てスペースで間を開けてください。
変数を宣言したらその変数が使えるようになります。
変数へのデータ格納は【変数名 = 入れたいデータ】で変数に格納されます。
変数の型ですが、よく使うものを抜粋しておきます。

よく使用する変数の型

  • Long・・・整数のみ入る
  • Single・・・数値が入る。(小数点以下も可)
  • String・・・文字列が入る。
  • Date・・・日付が入る。
  • Variant・・・なんでも入る。

Variantはなんでも入りますが私は基本的に目的に合った物を使用しています。

データの処理

データの処理はIFや繰り返し文で行います。

繰り返しは最初はFor~Nextで行うとよいです。
For i=セルの開始行 to セルの終了行
Next i
これだけでセル開始行からセル終了行まで繰り返しになります。

IFは文は違いますがExcelのIf関数と同じような使い方をします。
単純にTrueの処理のみならこのように書きます。
If 論理式Then
   Trueの処理
End If

実際に書くとこのような形です。
If Sheet1.Range(“A” &i).Value>=10Then
  中に処理を記入するとA&iセルの値が10以上の時だけ処理を行います。
End If
Falseの場合何もしない場合はこれでよいですがFalseの場合の処理をする場合はこのように書きます。
If 論理式Then
   Trueの処理
Else
   Falseの処理
End If

ElseIfを使うことで条件分岐を複雑化できます。
If Sheet1.Range(“A” &i).Value>=10 Then
   Trueの処理
Else If Sheet1.Range(“A” &i).Value>=5 Then
  次のIfがTrueの場合の処理
Else それ以外
   2つともFalseの処理
End If

IfにはAndやOrが使えます。使用する場合は次のようにします。
If 論理式 And 論理式 Then
End If
論理式をIf~ Thenの間に2つ書いて間にAndまたはOrを入れると完成です。
Andに関してはTrueの処理の中にIfをさらに書いて条件分岐も可能です。
If  論理式 Then
  if 論理式 Then
Trueの処理
End if
End If

結果の出力

処理が終わったら結果の出力を行います。
セルに変数や値を入れる場合は変数格納と似たようなやり方を行います。
Sheet1.Range(“E2”).Value=sumvalue
入力したいセルにイコールで変数を指定するとその変数のデータがセルに入ります。

上達のコツ

基本の形を覚える。

基本の流れでも記載したようにデータの取得・処理⇒最後に結果の出力を行います。
基本はFor~Nextまでを1ブロックと考えて作成していくとより複雑なプログラムが作れるようになります。

まず一番小さな処理を書くと楽

一番小さな処理とは画像でいうやりたいことです。
やりたいことを書く⇒ある条件の時だけの場合はIFで囲む⇒ここからここまでの場合は
For~Nextで囲むという具合に処理のブロックを徐々に大きくすると理解しやすいです。
慣れないうちはここからやると複数のFor Nextにも対応できるようになります。

ちなみに、Range(“A”&i).Valueはセルの値取得です。
&iの部分を文字列のみで書くとA2とかになります。A2のセルのことでFor~Nextを使用してiの値を2から10まで増やしていきます。

やりたいことの部分はこちらでもまとめていますので参考にしてください。

ワークシートの指示方法について

一つのワークシートのみのマクロだとRange(“A1”).valueでA1セルの情報が扱えますが
複数のワークシートでの処理は無理です。
複数のワークシートを利用する場合はワークシート名を指定する必要が有ります。

ワークシート名で指示

Worksheets(“シート名”).Range(“A1).Value シート名はExcelのシート名です。

注意点としてワークシート名は簡単に変更が可能で、ワークシート名変更するとマクロが正常に動作しなくなります。

シートのオブジェクト名で指示

シートオブジェクト名.Range(“A1”).value と指示します。
画像の場合だと Sheet1.Range(“A1”).value です。

こちらもオブジェクト名部分で変更できますが
VBEを起動する必要が有るので変更されるリスクは低いです。
ただ違うWorkbook(別のExcel)だと指示できないのでどちらも覚えておきましょう。

For~Nextを書けるようにする。

繰り返しにはFor~Next,For Each~Next,Do~Loopの3種類有ります。
最初にやるのはセルの範囲を上から下まで検索することが多いので
For~Nextのみ書ければ問題ないと思います。
For i=セルの開始行 to セルの終了行
Next i
これだけでも見ずに書けるようになりましょう。
iは繰り返しの間1ずつ増えていきますのでセルの取得をするには使いやすいです。

セルの終了行が分からない場合は

セルの最終行がいつも特定の行とは限りません。むしろ違うことの方が多いです。

最終行の取得は下記の文で取得できます。コピペする場合はシート名,最終行取得列は修正してください。
Sheet1.Range(“A” & Sheet1.Rows.Count).End(xlUp).Row
説明は別の記事で後日行いますね。使用方法は下記を参考にしてください。
dim imax as long
imax=Sheet1.Range(“A” & Sheet1.Rows.Count).End(xlUp).Row
For i=1 To imax ‘i行からimax行まで繰り返し
Next i

IFやForなど段落を落として記入する

どちらも同じプログラムなんですがどっちが見易いですか?
全て左に寄っているどこからどこまでの部分が分かりにくく無いります。
IF文や繰り返し文,Withなどを使う場合はスペースをあけ見易くしましょう
TABキーを押すと簡単に動かせるので活用しましょう。

作成中の最初は固定値で徐々に変数化していく

マクロは組みながら動作確認すると思います。なので複雑な場合はいきなり変数にして
For Nextを重ねるのではなく細かい部分が完成後に作成すると複雑なプログラムも作りやすいです。

注意

日付の場合は””で囲んだ文字列でIf文を組むと書式によって正しくなりません。
日付はDate型の変数に入れた変数をIf文に組むようにしましょう。

まとめ

後まで閲覧して頂きありがとうございました!
最後にこの記事のまとめを記載します。

マクロ上達までのコツ

1. For~Nextまでを1ブロックとして作成する。
2.小さな処理から書いていき外側にプログラムを書いていくと理解しやすい
3.For~Nextだけでも結構できます。まずはFor~Nextを使いこなそう。
4.IFやFor~NextでTABキーを使用し見易くしましょう。
5.複雑な部分を組むときは外側を組むときに変動するようにする。

また別の記事で実際どういったマクロが組めるのか紹介したいと思います。

にほんブログ村 IT技術ブログへ
にほんブログ村

コメント

タイトルとURLをコピーしました