VBAコードを記述を行う時はVBE(Visual Basic Editor)に行います。
VBEを表示させるには
Excelの画面のリボンの【開発】からVisual Basicをクリックし
挿入よりモジュールをクリックするとエディターが起動します。
そこにぱちぱち入力していくのです。
もし、【開発】のタブがない場合は、
スタートメニュー、オプション、リボンのユーザー設定で開くと
リボンの設定画面が開くので
開発のところにチェックを入れて下さい。
さて、表題の件ですが
マクロの記述をしたあと、そのコードを確認しに行くと
コードが書かれています。
マクロの記述を行った場合、自動的に
【プロシージャ】というものが作成され、そこにコードが記載されます。
その時、何も設定しない場合Macro1という名前で登録されるのですが、
その名称をプロシージャ名といいます。
つまり、1括りの記述の集まりをプロシージャといいます。
基本形ですが、1つのプロシージャは
SubからEnd Subまでの間に処理内容を記述します。
そして、モジュールの中には
複数のプロシージャを記述することが可能です。
複雑な処理を行う場合、
どうしても記述するコードが長くなります。
もちろん、全体把握がしっかり出来ている頭のいい方であれば
1つのプロシージャに全ての処理内容を記述してもかまいません。
でも、私のようなポンコツおじさんは限界があります。
そんな時は、全体処理を部分化させて全体把握をしやすくします。
つまり、プロシージャごとに処理内容を分けて記述します。
しかし、そんなことをすると、
全処理を実行するにはプロシージャ1つ1つを実行しなければなりません。
それはそれで面倒です。
そんな時は、Callステートメントを使います。
Callステートメントは
あるプロシージャ内で、別のプロシージャ(つまり別の処理)を
呼び出すことができます。
記述の仕方は
Call プロシージャ名
だけです。
サンプル画像
サンプル画像のVBE内、一番上のプロシージャがメインプロシージャで
以降は具体的な処理を記述したプロシージャです。
一番最初の全処理工程を記述のプロシージャを実行すると
2番目から4番目までのプロシージャが順番に実行されます。
さらにサンプル画像2
このCallステートメントを使用することで
全体を把握しやすくなったり、
各パーツごとでデータを実行したりと、
後々編集もしやすくなりますし、エラーが発生した場合でも
メンテナンスがしやすくなります。
VBAの記述量が少ないうちは
あまり使用することはないですが、
多くの処理内容があるコードを記述する場合は
こまめにプロシージャを分けることをおすすめします。
2016年6月12日日曜日
2016年6月11日土曜日
【VBAコラム】VBAの技術を身に付けたいのであれば、是非読んでみてください。
さて、このブログも2016年5月31日に開設し、
早10日が経過しようとしてます。
今日はここで少し重要なお話をしようと思っています。
こんな私でも、今まで素人に羽毛が生えた程度の柔らかさで
よくも偉そうにしゃあしゃあと記事を書いてきたものです。
■変数の宣言
【VBAリファレンス】変数は宣言してください。お願いします。
■Rangeや行列の選択
【VBAリファレンス】セルの値を指定する方法は主に2種類あるのです。
【VBAリファレンス】行や列を指定する
■Forステートメント
【VBAリファレンス】For文を理解してフォアフォアしてみよう。
■Ifステートメント
【VBAリファレンス】もし、If文を使うなら…True、使わないならFalse
などなど
しかし、ForやIfなんか覚えただけでは
何の役にも立ちません!!
ズコーーっ!!!
はい、皆さんも一緒に
ズコーーーっ!!!!!
ただ、一部の方の中には
そうだね~と共感していただける方もいるはずです。
誤解を与えるような書き方をしてしまい申し訳ありません。
ここまで、記事でご案内したForやIf、変数の宣言から
Range、Cellsプロパティを思い出してください。
・変数の宣言をして、値を変数に代入したからどうするのん?
・セルを選択したあとどうするのん?
・Forを使ってカウンタが上がっていくからなんなん?
・Ifで分岐させた後、どうなるん?
勉強を始めようとしたとき、
こういった疑問持つ人の方が圧倒的に多いと思います。
それが自然なんです。
私もそうでした。
何故なら、使いたい使い方を知らないからなんです。
家の台所に真っ白い金属製の白い箱があったとします。
その箱は、煮る、焼く、茹でる、揚げる、炒めるをすべて1台でこなす
超ハイパー家電だったとします。
でも、説明書はありませんでした。
ハイそこー!
しかも、料理経験が全くありません。
さらにそこー!
先ほど疑問を抱いた方は、
説明書がない状態、もしくは料理経験がない状態なだけです。
説明書や、経験がなければ何もできないのは当然です。
For文もIf文も組み合わせて、
さらに複数の変数を宣言したうえで、
注釈のコメント書きながらやるからこそ、
手作業で10時間かかる作業がボタン1クリックするとものの数分で処理が完了する
コードが本当に役に立つコードです。
書籍やWebサイトを見ても、自分がやりたい処理の
具体的なコードが見つからなくて、嘆いた経験はありませんか?
私は、ありました。
特にVBAの勉強を本気で使用と思ってすぐの時でした。
しかし、今同じ条件でWebで検索すると
答えはごろごろ転がっています。
ど~れ~に~し~よぅ~か~な~って感じです。
その差は何かというと、
最初はWebなどで記述されてるコードの意味が分からないだけなのです。
だから、使い方はおろか、正解か不正解かの前に
見つからないと結論付けるのです。
でもそれは慣れなんですね。
毎日何かしらコードを記述したりすることで
自然と身に付く、自転車運転方法でしかありません。
基本が乗っている書籍なんて本屋さんや
AMAZONでいくらでも売っているので、本来ここに書くべきものでもないのですが
私自身、ずいぶん遠回りしながらも、どうにか身に付けてきた知識を
皆様は遠回りしないようショートカットで身に付けていただければと考えました。
書籍には使用方法は書かれていますが
例や目的は書かれていないことがとても多いです。
どのリファレンス(教材)本にも共通することですが
評価が高い本は、実用的な使用方法がたくさん書かれていることが多いです。
あるいは、本当に使用方法だけがギッチリぱんぱんに詰め込まれているかのどちらかです。
しかし、実用的な使用方法が書かれている本は
やはり少ないのです。
おこがましい話ですが
私も1から始めたことで、たくさんの壁や挫折を経験してきたからこそ
まだ、初心者の目線は忘れてはいません。
だからこそお伝えできる例え方や、文章が書けるだろうと調子に乗ってます。
適度なリファレンスと、オーソドックスで変態的な使用例を
うまく合わせて、お伝えできればと考えます。
まだまだ、お伝えしたいことがたくさんあります。
なので、じっくりお付き合いください。
少しでも、誰かのお役に立てれば幸いです。
P.S 最終回ではありません
早10日が経過しようとしてます。
今日はここで少し重要なお話をしようと思っています。
こんな私でも、今まで素人に羽毛が生えた程度の柔らかさで
よくも偉そうにしゃあしゃあと記事を書いてきたものです。
■変数の宣言
【VBAリファレンス】変数は宣言してください。お願いします。
■Rangeや行列の選択
【VBAリファレンス】セルの値を指定する方法は主に2種類あるのです。
【VBAリファレンス】行や列を指定する
■Forステートメント
【VBAリファレンス】For文を理解してフォアフォアしてみよう。
■Ifステートメント
【VBAリファレンス】もし、If文を使うなら…True、使わないならFalse
などなど
しかし、ForやIfなんか覚えただけでは
何の役にも立ちません!!
ズコーーっ!!!
はい、皆さんも一緒に
ズコーーーっ!!!!!
ただ、一部の方の中には
そうだね~と共感していただける方もいるはずです。
誤解を与えるような書き方をしてしまい申し訳ありません。
ここまで、記事でご案内したForやIf、変数の宣言から
Range、Cellsプロパティを思い出してください。
・変数の宣言をして、値を変数に代入したからどうするのん?
・セルを選択したあとどうするのん?
・Forを使ってカウンタが上がっていくからなんなん?
・Ifで分岐させた後、どうなるん?
勉強を始めようとしたとき、
こういった疑問持つ人の方が圧倒的に多いと思います。
それが自然なんです。
私もそうでした。
何故なら、使いたい使い方を知らないからなんです。
家の台所に真っ白い金属製の白い箱があったとします。
その箱は、煮る、焼く、茹でる、揚げる、炒めるをすべて1台でこなす
超ハイパー家電だったとします。
でも、説明書はありませんでした。
ハイそこー!
しかも、料理経験が全くありません。
さらにそこー!
先ほど疑問を抱いた方は、
説明書がない状態、もしくは料理経験がない状態なだけです。
説明書や、経験がなければ何もできないのは当然です。
For文もIf文も組み合わせて、
さらに複数の変数を宣言したうえで、
注釈のコメント書きながらやるからこそ、
手作業で10時間かかる作業がボタン1クリックするとものの数分で処理が完了する
コードが本当に役に立つコードです。
書籍やWebサイトを見ても、自分がやりたい処理の
具体的なコードが見つからなくて、嘆いた経験はありませんか?
私は、ありました。
特にVBAの勉強を本気で使用と思ってすぐの時でした。
しかし、今同じ条件でWebで検索すると
答えはごろごろ転がっています。
ど~れ~に~し~よぅ~か~な~って感じです。
その差は何かというと、
最初はWebなどで記述されてるコードの意味が分からないだけなのです。
だから、使い方はおろか、正解か不正解かの前に
見つからないと結論付けるのです。
でもそれは慣れなんですね。
毎日何かしらコードを記述したりすることで
自然と身に付く、自転車運転方法でしかありません。
基本が乗っている書籍なんて本屋さんや
AMAZONでいくらでも売っているので、本来ここに書くべきものでもないのですが
私自身、ずいぶん遠回りしながらも、どうにか身に付けてきた知識を
皆様は遠回りしないようショートカットで身に付けていただければと考えました。
書籍には使用方法は書かれていますが
例や目的は書かれていないことがとても多いです。
どのリファレンス(教材)本にも共通することですが
評価が高い本は、実用的な使用方法がたくさん書かれていることが多いです。
あるいは、本当に使用方法だけがギッチリぱんぱんに詰め込まれているかのどちらかです。
しかし、実用的な使用方法が書かれている本は
やはり少ないのです。
おこがましい話ですが
私も1から始めたことで、たくさんの壁や挫折を経験してきたからこそ
まだ、初心者の目線は忘れてはいません。
だからこそお伝えできる例え方や、文章が書けるだろうと調子に乗ってます。
適度なリファレンスと、オーソドックスで変態的な使用例を
うまく合わせて、お伝えできればと考えます。
まだまだ、お伝えしたいことがたくさんあります。
なので、じっくりお付き合いください。
少しでも、誰かのお役に立てれば幸いです。
P.S 最終回ではありません
2016年6月10日金曜日
【VBAリファレンス】記載するコードは長くても短くてもコメントはたっぷりお願いします。
VBAのコード入力も波に乗ってくると
調子にものって、ガツガツたくさんのコードを1つのプロシージャに
書いてしまいがちです。
VBAのコードというのは皆様もご存知の通り
英字と数字と記号を主に記述します。
日本語が入る時は、大体If文の条件分岐とかで
特定のワードに対して使ったり
ワークシートに対する処理を行うときなどに日本語が入り混じります。
さて、ひとまず以下のコードをご覧ください(ちょっと長いです)
---------------------------------------------------------------------------------
Sub Maxif()
Dim datavalue, cntvalue, d_one, d_two, Boobyvalue, Lastvalue, Maxvalue As Long
Maxvalue = WorksheetFunction.Max(Range("B1:B40"))
For cntvalue = 1 To Maxvalue
Lastvalue = 0
For datavalue = 1 To 40
Boobyvalue = Lastvalue
If Cells(datavalue, 2) = cntvalue Then
d_one = Cells(datavalue, 3)
Else
d_one = 0
End If
If Cells(datavalue + 1, 2) = cntvalue Then
d_two = Cells(datavalue + 1, 3)
Else
d_two = 0
End If
If d_one > d_two Then
Lastvalue = d_one
ElseIf d_one < d_two Then
Lastvalue = d_two
Else
End If
If Lastvalue > Boobyvalue Then
Lastvalue = Lastvalue
ElseIf Lastvalue < Boobyvalue Then
Lastvalue = Boobyvalue
Else
End If
Cells(cntvalue, 7).Value = Lastvalue
Next datavalue
Next cntvalue
End Sub
---------------------------------------------------------------------------------
これは実際に数日前に私が記述した
Maxifの代用で試しに起こしてみたコードです。
これをみて、若干イヤんなちゃった人は少なくないはずです。
これでも、そこまで長くはない記述ですが
こんなコードがたくさんあって、プロシージャがさらに連なってってなると
もう、見るだけで嫌になります。
当然のことです。
VBAではコードを記述する際
どういった処理のコードか、メモ書きのようにしておける機能があります。
人はそれをコメントといいます。
シングルクォーテーションを最初に入れて
そのあとに入れたい文字を入れます。
-----------------------------------
Sub test()
'セルのA1にこんにちはと入れる
Range("A1").Value = "こんにちは"
End Sub
調子にものって、ガツガツたくさんのコードを1つのプロシージャに
書いてしまいがちです。
VBAのコードというのは皆様もご存知の通り
英字と数字と記号を主に記述します。
日本語が入る時は、大体If文の条件分岐とかで
特定のワードに対して使ったり
ワークシートに対する処理を行うときなどに日本語が入り混じります。
さて、ひとまず以下のコードをご覧ください(ちょっと長いです)
---------------------------------------------------------------------------------
Sub Maxif()
Dim datavalue, cntvalue, d_one, d_two, Boobyvalue, Lastvalue, Maxvalue As Long
Maxvalue = WorksheetFunction.Max(Range("B1:B40"))
For cntvalue = 1 To Maxvalue
Lastvalue = 0
For datavalue = 1 To 40
Boobyvalue = Lastvalue
If Cells(datavalue, 2) = cntvalue Then
d_one = Cells(datavalue, 3)
Else
d_one = 0
End If
If Cells(datavalue + 1, 2) = cntvalue Then
d_two = Cells(datavalue + 1, 3)
Else
d_two = 0
End If
If d_one > d_two Then
Lastvalue = d_one
ElseIf d_one < d_two Then
Lastvalue = d_two
Else
End If
If Lastvalue > Boobyvalue Then
Lastvalue = Lastvalue
ElseIf Lastvalue < Boobyvalue Then
Lastvalue = Boobyvalue
Else
End If
Cells(cntvalue, 7).Value = Lastvalue
Next datavalue
Next cntvalue
End Sub
---------------------------------------------------------------------------------
これは実際に数日前に私が記述した
Maxifの代用で試しに起こしてみたコードです。
これをみて、若干イヤんなちゃった人は少なくないはずです。
これでも、そこまで長くはない記述ですが
こんなコードがたくさんあって、プロシージャがさらに連なってってなると
もう、見るだけで嫌になります。
当然のことです。
VBAではコードを記述する際
どういった処理のコードか、メモ書きのようにしておける機能があります。
人はそれをコメントといいます。
シングルクォーテーションを最初に入れて
そのあとに入れたい文字を入れます。
-----------------------------------
Sub test()
'セルのA1にこんにちはと入れる
Range("A1").Value = "こんにちは"
End Sub
-----------------------------------
VBAに記述する際もシングルクォーテーションを入れた後
文字は緑色になり
その行の最後までは処理に関係のないものとされます。
つまり、メモを入れるということになります。
改行をする場合は新たにシングルクォーテーションをつける必要があります。
記述したコードは
何も自分ばかりが見るものではなく、他の方が見たり
手入れしたりする可能性もあります。
その際、どの部分でどういった処理が起こるか、
その簡易説明があるかないかで
確認作業や修正作業、
さらには、人に説明をしなければいけない場合など、
作業が円滑に進むものです。
おそらく、こういった作業は個人差(性格)が出るものですが
出来る限り分かりやすく、簡潔に書いておくことに越したことはありません。
今日お仕事で、私はそのコメントの記述を怠ったばかりに
どういった処理が行われているか、すぐに説明できませんでした。
戒めの意味で、自分のメガネをヤスリでサッ!ってやっておきます。
意外と軽視されがちですが
やはりコメントというのは重要です。
それは、たくさんのコードを書けば書くほど身に染みるものです。
だからといってやたらめったら書いていいものではないです。
先ほども申し上げましたが
出来る限り分かりやすく、簡潔に書くというのが前提です。
さて、先ほどのコード。
コードが付いているものを改めて乗せてみたいと思います。
---------------------------------------------------------------------------------
Sub Maxif()
Dim datavalue, cntvalue, d_one, d_two, Boobyvalue, Lastvalue, Maxvalue As Long
'B1~40までの最大値をMaxvalueに代入
Maxvalue = WorksheetFunction.Max(Range("B1:B40"))
For cntvalue = 1 To Maxvalue 'Maxvalueの数だけループ
Lastvalue = 0 'Lastvalueを初期化
For datavalue = 1 To 40 '元データの末端行の値
Boobyvalue = Lastvalue 'LastvalueデータをBoobyvalueデータに移行
'd_oneに1個目のデータを代入 なければ0で初期化
If Cells(datavalue, 2) = cntvalue Then
d_one = Cells(datavalue, 3)
Else
d_one = 0
End If
'd_twoに2個目のデータを代入 なければ初期化
If Cells(datavalue + 1, 2) = cntvalue Then
d_two = Cells(datavalue + 1, 3)
Else
d_two = 0
End If
'd_oneとd_twoを比較し、大きい方をLastvalueに代入
If d_one > d_two Then
Lastvalue = d_one
ElseIf d_one < d_two Then
Lastvalue = d_two
Else
End If
'この前にLastvalueからBoobyvalueに代入していた値と最新のLastvalueを比較し、
'大きい方をLastvalueに代入
If Lastvalue > Boobyvalue Then
Lastvalue = Lastvalue
ElseIf Lastvalue < Boobyvalue Then
Lastvalue = Boobyvalue
Else
End If
Cells(cntvalue, 7).Value = Lastvalue
Next datavalue
Next cntvalue
End Sub
Dim datavalue, cntvalue, d_one, d_two, Boobyvalue, Lastvalue, Maxvalue As Long
'B1~40までの最大値をMaxvalueに代入
Maxvalue = WorksheetFunction.Max(Range("B1:B40"))
For cntvalue = 1 To Maxvalue 'Maxvalueの数だけループ
Lastvalue = 0 'Lastvalueを初期化
For datavalue = 1 To 40 '元データの末端行の値
Boobyvalue = Lastvalue 'LastvalueデータをBoobyvalueデータに移行
'd_oneに1個目のデータを代入 なければ0で初期化
If Cells(datavalue, 2) = cntvalue Then
d_one = Cells(datavalue, 3)
Else
d_one = 0
End If
'd_twoに2個目のデータを代入 なければ初期化
If Cells(datavalue + 1, 2) = cntvalue Then
d_two = Cells(datavalue + 1, 3)
Else
d_two = 0
End If
'd_oneとd_twoを比較し、大きい方をLastvalueに代入
If d_one > d_two Then
Lastvalue = d_one
ElseIf d_one < d_two Then
Lastvalue = d_two
Else
End If
'この前にLastvalueからBoobyvalueに代入していた値と最新のLastvalueを比較し、
'大きい方をLastvalueに代入
If Lastvalue > Boobyvalue Then
Lastvalue = Lastvalue
ElseIf Lastvalue < Boobyvalue Then
Lastvalue = Boobyvalue
Else
End If
Cells(cntvalue, 7).Value = Lastvalue
Next datavalue
Next cntvalue
End Sub
---------------------------------------------------------------------------------
このようにコメントの記載があるかないかで
読みにいく気持ちも変わってきます。
他人のためでもあり、自分のためのコメントなので
長い、短いにかかわらず、コメントはたっぷりしっかり記述するようにしましょう。
2016年6月8日水曜日
【VBAリファレンス】もし、If文を使うなら…True、使わないならFalse
さて、前回のForステートメントに続き
今回はIfステートメントをご紹介します。
Forステートメントの記事はこちら。
【VBAリファレンス】For文を理解してフォアフォアしてみよう。
一般的な事務や、データ解析、操作系の仕事をされているのであれば
For文と、If文をマスターしていれば
大体のことは出来るのではないでしょうか。
ちょっと大げさかもしれませんが
そこから派生した疑問などは
大体Webを見ると解決したりするものです。
つまり、基本をしっかり!マスターしていれば
あとはGoogle先生が教えてくれるものです。
実際に私も、Ifは理屈的に理解していましたが
For文の理解度を高めた事で、二段飛ばしくらいあれをあれしたものです。
それではIf文の基本的な説明ですが
原理はこうです。
もし○○が□□だったら、▲▲する
そうじゃなければ△△する。
または
もし○○が□□だったら、▲▲する
それか、◇◇だったら、☆☆する。※1
そうじゃなければ△△する。
※1 それか、◇◇じゃなければ、☆☆するは何回も重ねられます。
If文はFor文と違って上から下に流れて終わります。
その際にとある条件に一致しているか、していないか、のどちらかで
処理内容が変わる、条件分岐、分かれ道方式になります。
またその条件は柔軟に変動が可能です。

その時の答えとして
そうだ!って時はTrue、違う!って時は、Falseに置き換えたうえで
処理が進められます。
それでは、さっそく基本文を書いてみます。
-------------------------------
Sub test()
If Range("A1") = "1" Then
Range("B1").Value = "男"
End If
End Sub
-------------------------------
これは、セルのA1に1が入力されていた場合
その隣のB1のセルに男と入れるIf文です。
1以外の文字列、もしくは何も入ってなかったら
何も起きません。
If Range("A1") = "1" Then → もしセルのA1に1が入っていたら
Range("B1").Value = "男" → B1に男と入れてね。
ですね。
つまり、1以外の時は End Ifに飛んで、このコードは終わります。
次に、1以外のデータが入っていたときは
B1に女と入れるコードを書きたい時、
Else(エルス)を使用します。
-------------------------------
Sub test()
If Range("A1") = "1" Then
Range("B1").Value = "男"
Else
Range("B1").Value = "女"
End If
End Sub
-------------------------------
セルのA1に1以外のデータ(空欄含む)が入っている場合は
セルのB1に女が入力されます。
つまり、1以外どんな状態でも女と入るわけです。
これではちょっと雑だな~って時は
さらにElse If(エルスイフ)を使用します。
-------------------------------
Sub test()
If Range("A1") = "1" Then
Range("B1").Value = "男"
ElseIf Range("A1") = "2" Then
Range("B1").Value = "女"
Else
Range("B1").Value = "エラーです"
End If
End Sub
-------------------------------
これは、セルのA1に1と入っていた場合はB1に男と入力され
2と入力されていた場合はB1に女と入力され
それ以外のデータだった場合は、B1にエラーですと返すコードです。
この時点で、条件分岐は3つに分かれるわけです。
このElseIfはいくつも連結が可能ですが
最後は必ずElseをつけて終わりに導いてください。
Elseで特に指定したい条件がない場合は
Else以降何も書かなくてよいです。
そして、条件は必ずしもイコール(一致)だけというわけではありません。
○○より大きい
○○以上
○○と等しい(今まで使っていたイコールです)
○○と等しくない
の主に6種類あり、
それを比較演算子といいます。
意味さえ知っていれば、特に言葉を覚えなくてもいいです。
比較演算子の記号は以下の通りです。
○○< →○○より大きい
○○≦ →○○以上
○○= →○○と等しい(今まで使っていたイコールです)
○○<> →○○と等しくない
となります。
やはり使う頻度が多いのは、<、>、=、<>の4つが多いでしょうか。
<や>は使い方を誤ると、えらい方向にはまりがちなので
ぜひぜひご注意ください。
先ほど【条件は柔軟に変動が可能です】と記載をしましたが
私が普段使用しているIfの条件サンプルを記述してみたいと思いますので
ご参考頂ければ幸いです。
その1
-------------------------------
Sub test1()
If Range("A1") = "" Then
Range("A1").Value = "○"
ElseIf Range("A1") = "○" Then
Range("A1").ClearContents
Else
End If
End Sub
-------------------------------
その1は完全な2択です。
何も入っていなければ○を入れる、○が入っていたら消すの繰り返しです。
これをたくさん作って、それぞれコントロールフォームのボタンに
当て込めば、チェック表のようなものが作れます。
※コントロールフォームの使用方法は後日ご案内いたします。
その2
-------------------------------
Sub test()
Dim i, a, b As Long
For i = 1 To 10
If Cells(i, 1) <> "" Then
a = Cells(i, 1)
b = a * 1.08
Cells(i, 1).Value = b
Else
End If
Next i
End Sub
一旦、指定したセルに値が入っていないかを確認するため
If文を使い、ダブルクォーテーション2つ""(何も入っていない)という条件を記載し
その条件に当てはまらない<>をクリアした場合、
選択しているセルの値を一旦変数aの箱に代入します。
その変数aに消費税1.08をかけた値をさらに変数bの箱に代入します。
その変数bの値を選択中のセルに上書きすることで
自動で課税金額に上書きすることが出来ます。
例えばとなりのセルに課税した金額を記載したい場合は
Cells(i, 1).Value = bをCells(i, 2).Value = bに変えればOKです。
ちょっとここでは書ききれないので、
色々なサンプルは後日ご案内しますね。
今回はIfステートメントをご紹介します。
Forステートメントの記事はこちら。
【VBAリファレンス】For文を理解してフォアフォアしてみよう。
一般的な事務や、データ解析、操作系の仕事をされているのであれば
For文と、If文をマスターしていれば
大体のことは出来るのではないでしょうか。
ちょっと大げさかもしれませんが
そこから派生した疑問などは
大体Webを見ると解決したりするものです。
つまり、基本をしっかり!マスターしていれば
あとはGoogle先生が教えてくれるものです。
実際に私も、Ifは理屈的に理解していましたが
For文の理解度を高めた事で、二段飛ばしくらいあれをあれしたものです。
それではIf文の基本的な説明ですが
原理はこうです。
もし○○が□□だったら、▲▲する
そうじゃなければ△△する。
または
もし○○が□□だったら、▲▲する
それか、◇◇だったら、☆☆する。※1
そうじゃなければ△△する。
※1 それか、◇◇じゃなければ、☆☆するは何回も重ねられます。
If文はFor文と違って上から下に流れて終わります。
その際にとある条件に一致しているか、していないか、のどちらかで
処理内容が変わる、条件分岐、分かれ道方式になります。
またその条件は柔軟に変動が可能です。

その時の答えとして
そうだ!って時はTrue、違う!って時は、Falseに置き換えたうえで
処理が進められます。
それでは、さっそく基本文を書いてみます。
-------------------------------
Sub test()
If Range("A1") = "1" Then
Range("B1").Value = "男"
End If
End Sub
-------------------------------
これは、セルのA1に1が入力されていた場合
その隣のB1のセルに男と入れるIf文です。
1以外の文字列、もしくは何も入ってなかったら
何も起きません。
If Range("A1") = "1" Then → もしセルのA1に1が入っていたら
Range("B1").Value = "男" → B1に男と入れてね。
ですね。
つまり、1以外の時は End Ifに飛んで、このコードは終わります。
次に、1以外のデータが入っていたときは
B1に女と入れるコードを書きたい時、
Else(エルス)を使用します。
-------------------------------
Sub test()
If Range("A1") = "1" Then
Range("B1").Value = "男"
Else
Range("B1").Value = "女"
End If
End Sub
-------------------------------
セルのA1に1以外のデータ(空欄含む)が入っている場合は
セルのB1に女が入力されます。
つまり、1以外どんな状態でも女と入るわけです。
これではちょっと雑だな~って時は
さらにElse If(エルスイフ)を使用します。
-------------------------------
Sub test()
If Range("A1") = "1" Then
Range("B1").Value = "男"
ElseIf Range("A1") = "2" Then
Range("B1").Value = "女"
Else
Range("B1").Value = "エラーです"
End If
End Sub
-------------------------------
これは、セルのA1に1と入っていた場合はB1に男と入力され
2と入力されていた場合はB1に女と入力され
それ以外のデータだった場合は、B1にエラーですと返すコードです。
この時点で、条件分岐は3つに分かれるわけです。
このElseIfはいくつも連結が可能ですが
最後は必ずElseをつけて終わりに導いてください。
Elseで特に指定したい条件がない場合は
Else以降何も書かなくてよいです。
そして、条件は必ずしもイコール(一致)だけというわけではありません。
○○より大きい
○○以上
○○より小さい
○○以下○○と等しい(今まで使っていたイコールです)
○○と等しくない
の主に6種類あり、
それを比較演算子といいます。
意味さえ知っていれば、特に言葉を覚えなくてもいいです。
比較演算子の記号は以下の通りです。
○○< →○○より大きい
○○≦ →○○以上
○○> →○○より小さい
○○≧ →○○以下○○= →○○と等しい(今まで使っていたイコールです)
○○<> →○○と等しくない
となります。
やはり使う頻度が多いのは、<、>、=、<>の4つが多いでしょうか。
<や>は使い方を誤ると、えらい方向にはまりがちなので
ぜひぜひご注意ください。
先ほど【条件は柔軟に変動が可能です】と記載をしましたが
私が普段使用しているIfの条件サンプルを記述してみたいと思いますので
ご参考頂ければ幸いです。
その1
-------------------------------
Sub test1()
If Range("A1") = "" Then
Range("A1").Value = "○"
ElseIf Range("A1") = "○" Then
Range("A1").ClearContents
Else
End If
End Sub
-------------------------------
その1は完全な2択です。
何も入っていなければ○を入れる、○が入っていたら消すの繰り返しです。
これをたくさん作って、それぞれコントロールフォームのボタンに
当て込めば、チェック表のようなものが作れます。
※コントロールフォームの使用方法は後日ご案内いたします。
その2
-------------------------------
Sub test()
Dim i, a, b As Long
For i = 1 To 10
If Cells(i, 1) <> "" Then
a = Cells(i, 1)
b = a * 1.08
Cells(i, 1).Value = b
Else
End If
Next i
End Sub
-------------------------------
その2はA列の1から10に
税抜きの金額が入っていると仮定してください。
ただし、その中には何も入っていないセルもある場合、
そのセルは飛ばします。
先日の記事のFor文を使用します。
カウントの変数はiになります。
で、そのカウントをCellsプロパティに当て込みながら
セルのA1からA10までを指示するFor文を作ります。
一旦、指定したセルに値が入っていないかを確認するため
If文を使い、ダブルクォーテーション2つ""(何も入っていない)という条件を記載し
その条件に当てはまらない<>をクリアした場合、
選択しているセルの値を一旦変数aの箱に代入します。
その変数aに消費税1.08をかけた値をさらに変数bの箱に代入します。
その変数bの値を選択中のセルに上書きすることで
自動で課税金額に上書きすることが出来ます。
例えばとなりのセルに課税した金額を記載したい場合は
Cells(i, 1).Value = bをCells(i, 2).Value = bに変えればOKです。
ちょっとここでは書ききれないので、
色々なサンプルは後日ご案内しますね。
2016年6月7日火曜日
【VBAリファレンス】For文を理解してフォアフォアしてみよう。
大量のデータ処理を行う上で、必要なステートメント(述べること)が
いくつかあります。
その中でも私が現在とても重きを置いているのが
Forステートメント(以下For文って言います)と
Ifステートメント(以下If文って言います)があります。
ちなみにIf文は後程ご紹介します。
For文とは
For~Nextという基本構文の~の部分に処理内容を記述します。
では、肝心のFor~Nextとは一体何をするものなのかですが、
まず、ざっくりいうと
カウントするんです。
まず、カウントするという言葉を頭の中に置いておいてください。
記述サンプルは以下の通りです。
-----------------------------------------
Sub test()
Dim i As Long 'ロング型の変数を宣言します
For i = 1 To 10
'ここに処理内容を書く
Next i
End Sub
-----------------------------------------
For i =の後がポイントです。
ここで記述している 1 To 10というのは
1から10までカウントするという意味です。
最初のiには1が入り、処理が行われます。
そして、処理が終わるとNext iに到着。
しかし、カウントはまだ1回目なので、このiは2回目のi、つまり
上に戻り、カウントは2にアップし、2回目の処理が行われます。
そして、それが10回まで繰り返されます。
もちろん、数字の入力は自由です。
2 To 5
これは、2~5カウントします。
1 To 1000
これは、1~1000までカウントします。
さて、ここまでカウントといってはぐらかしてきましたが
このカウントこそが最大のポイントです。
カウントとして使用するこの変数i(もちろん変数名はiじゃなくてもいいです)は
列の値、行の値、処理を行う回数など、
様々な使い方が出来るんです。
だって変数だから
その変数iを直接処理内容のCellsプロパティやRowsプロパティに
当て込んであげれば、もうエクセル内縦横無尽に
行ったり来たり出来ます。
あっちこっちに処理が出来ます。
ただ、For文というのは
掴むまで個人差があり、私は開花するまで数か月かかりました。
そのかわり、一度掴むと結構複雑な動作が出来るようになります。
具体例をコードで記述してみます。
-----------------------------------------
Sub test()
Dim i As Long
For i = 1 To 10
Cells(i, 1).Value = "カウント" & i
Next i
End Sub
-----------------------------------------
これはCellsプロパティを使って、Rowの値を1つずつ増やし、
尚且つ、指定したセルにカウントというコメントと変数を組み合わせて入れてます。
その結果は以下の通りです。
先ほどのCells(i, 1).Valueのiと1入れ替えると
RowとColumnが入れ替わるので
横向きに入力されていきます。
ただし、これは基本的な使用になります。
例えばAとB列に数値が入っていて
その数値に対してC列へ処理を実行したい場合、
また、そのC列の処理が終了したら、
隣の列に移動して別の処理を行いたいなど、
様々な処理が可能になります。
なんだかワクワクしませんか?
また、このカウントは段飛ばしにカウントすることも出来ます。
For i = 1 To 10の後に Step 2とつけると1段飛ばし
For i = 1 To 10の後に Step 3とつけると2段飛ばしが出来ます。
例):For i = 1 To 10 Step 2
※下の図はStep 2を実行したものです。
もちろん、カウントの逆打ちも出来ます。
逆打ちの場合はToを挟む数字も逆になります。
-----------------------------------------
Sub test()
Dim i As Long
For i = 10 To 1 Step -2
Cells(i, 1).Value = "カウント" & i
Next i
End Sub
-----------------------------------------
逆打ちでStepを使用する場合はマイナスをつけてください。
この、逆打ちは不要な列の削除をする際に
大活躍します。
具体的には後々ご案内しますね。
さて、ここまでカウントの数値を具体数で記述していましたが
ここのカウント値に変数を使用することが出来ます。
ここで??と思う方もいるかもしれません。
→For i = 1 To count (Countが変数とします)
変数には値を代入しなければならないので
結局2度手間じゃないの?と思うかもしれません。
ここで魔法の言葉です。
先日紹介しました記事にも記載しています。
Cells(Rows.Count, 1).End(xlUp).row
Cells(1, Columns.Count).End(xlToLeft).Column
それぞれCellsの後に記述しているの
Cells(Rows.Count, 1).End(xlUp).rowはA列
Cells(1, Columns.Count).End(xlToLeft).Columnは1行目の意味です。
その1の部分はデータ最終行、もしくは列まで入っているところを記述します。
※こちらも詳しくは後日ご案内します。
そして、その左辺に変数を入力してあげれば
最終行が入っている行が変数に代入されます。
例):A列に10行目までデータが入ってた場合、
count = Cells(Rows.Count, 1).End(xlUp).rowと記述すると
変数countには10という値が代入されます。
さて、もうお判りでしょうか。
あとはその変数countをForのカウントとして設定してあげればいいわけですね。
つまり、データが入っている最終までVBAで調べ
その値をForのカウンタに設定するわけです。
なので、Forは慣れればなれるほど
拡張性が増し、よりパフォーマンスの幅が広がってきます。
慣れてくると、エディター内はフォアフォアしまくるようになってくるでしょう。
最後に、先日私がプライベートで調査のために書いた
For文だらけのサンプルコードを乗っけておきます。
参考にはしないでください。
-----------------------------------------
Sub Sample()
Dim cc, re, sc, colcount, rocount, i As Long
cc = Cells(1, Columns.Count).End(xlToLeft).Column
rc = Cells(Rows.Count, 1).End(xlUp).Row
For sc = 1 To Sheets.Count
Sheets.count(sc)
For colcount = 1 To cc
For rocount = 1 To rc
For i = 1 To 30
'処理実行
Next i
Next rocount
Next colcount
Next sc
End Sub
Dim cc, re, sc, colcount, rocount, i As Long
cc = Cells(1, Columns.Count).End(xlToLeft).Column
rc = Cells(Rows.Count, 1).End(xlUp).Row
For sc = 1 To Sheets.Count
Sheets.count(sc)
For colcount = 1 To cc
For rocount = 1 To rc
For i = 1 To 30
'処理実行
Next i
Next rocount
Next colcount
Next sc
End Sub
-----------------------------------------
2016年6月6日月曜日
【VBAリファレンス】行や列を指定する
以前、セルの指定方法について記事を書きました。
詳しくはこちら:【VBAリファレンス】セルの値を指定する方法は主に2種類あるのです
今回は行や列を指定したり、選択したりする記述方法についてご案内します。
その前にCellsプロパティについて、少し復習してみます。
Cellsプロパティ
------------------------------------------
Cells(1, 1).Select ’A1を選択
Cells(3, 2).Select ’B3を選択
------------------------------------------
詳しくはこちら:【VBAリファレンス】セルの値を指定する方法は主に2種類あるのです
今回は行や列を指定したり、選択したりする記述方法についてご案内します。
その前にCellsプロパティについて、少し復習してみます。
Cellsプロパティ
------------------------------------------
Cells(1, 1).Select ’A1を選択
Cells(3, 2).Select ’B3を選択
------------------------------------------
列と行を逆に記述するわけですが、
内容は変数、または数字で指定をすることがルールでした。
行や、列を表示する場合も基本的には同じ考え方で大丈夫です。
でも、実は列の場合AやBなどで指定することも可能です。
基本的には
行はRow(ロウ)
列はColumn(カラム)です。
では、さっそく基本的な記述をやってみます。
行の選択
------------------------------------------
'1行目だけを選択
Rows(1).Select
'1~5行目をまとめて選択
Rows("1:5").Select
------------------------------------------
Rows(1)のカッコの中は整数を代入した変数名を指定することも可能です。
なお、複数指定する場合はダブルクォーテーションで囲ったうえで
数値の間をコロンで挟んでください。
変数名を指定する場合の記述はちょっとややこしいですが以下の通りです。
Rows(a & ":" & b).Select (aに1を代入し、bに5を代入した時、1~5行目まで選択されます)
変数と組み合わせてセルの値や指定箇所を記述する詳しい方法は
後日ご紹介します。
列の選択
------------------------------------------
'A列を選択
Columns(1).Select
'同じくA列を選択
Columns("A").Select
'A~D列を選択
Columns("A:D").Select
------------------------------------------
列の場合は、整数での指定や
単独列の時はアルファベットを1文字入力して指定することが可能です。
その場合同じくダブルクォーテーションで囲うようにしてください。
私の場合、行、列を指定したうえで処理を行うことが多く、
For文を使用して特定間隔に処理を実行していくときに使用することが多いです。
その為、カッコの中は変数名が入ることが多いです。
また、お分かりかと思いますが
Select(選択する)だけではないので、Selectの箇所をDeleteに置き換えると
その列が削除されます。
もちろん、Copy&Pasteも可能なので
セルの操作と行列の操作を覚えるだけで、
データの操作性が拡張します。
是非色々と試してみてください。
2016年6月5日日曜日
【VBAリファレンス】初心者だからこそ、MsgBox(メッセージボックス)、結構慣れてきたからこそMsgBox(メッセージボックス)。
メッセージボックス(MsgBox)はVBAをやり始めたときに
メッセージが表示できるので、よく遊んで使っていました。
しかし、簡易的にプログラムの内容を確認するときや
実行コードの処理完了を報告する際など、
さまざま利用用途があります。
なので、初心者だからこそ、結構慣れてきた頃だからこそ、
利用用途を掴んで、活用してみてください。
基本使用例1
------------------------------
Sub test()
MsgBox "こんにちわ"
End Sub
メッセージが表示できるので、よく遊んで使っていました。
しかし、簡易的にプログラムの内容を確認するときや
実行コードの処理完了を報告する際など、
さまざま利用用途があります。
なので、初心者だからこそ、結構慣れてきた頃だからこそ、
利用用途を掴んで、活用してみてください。
基本使用例1
------------------------------
Sub test()
MsgBox "こんにちわ"
End Sub
------------------------------
上記コードを実行すると
基本使用例2
------------------------------
Sub test()
MsgBox 123456789
End Sub
------------------------------
直接、文字列を入力する場合はダブルクォーテーションで
囲んであげる必要があります。
しかし、数値や変数の結果を表示させる場合は
そのまま入力をしてあげれば大丈夫です。
基本使用例3
------------------------------
Sub test()
Dim a, b
a = 2 '変数aの箱に2を代入
b = 3 '変数bの箱に3を代入
MsgBox a + b 'aとbを足した結果をメッセージボックスで表示
End Sub
------------------------------
ここまで、基本使用例1~3まで記述してきましたが
主に使用頻度が多いのは1と3です。
1は長いコードを書いて、処理的にも時間がかかる場合、
全ての処理が完了した時、コードの最後に
MsbBox "完了しました"
と記載をすれば、そのメッセージが出たときに作業が完了したと判断できます。
3はForをお試しで使用したとき、カウンターの変動を確認したり
変数の結果を表示してみたりすることが出来ます。
初心者であれば、最初はそのような使い方をして全然良いと思います。
※慣れてきたころには【Debug.Print 変数】を使用して
イミディエイトウィンドウで表示し、確認してください。
Debug.Printとイミディエイトウィンドウの使用方法は後程ご紹介します。
登録:
投稿 (Atom)









