これからExcelのマクロを勉強したいという方に!簡単な練習問題作りました。
何気なくアクセス解析を眺めていたら、“マクロ 勉強のコツ”というキーワードで検索してくださった方がいらっしゃいました。そういえば私は、一番最初はどんなふうにして覚えたんだっけか…と、当時出された問題を思い出しながら作ってみました。
下準備
Sub test() 'この中にこれからプログラムを書きます End Sub
それではまず、このようなプログラムの箱を用意します。こちらの記事を参考にして、ボタンを押すとプログラムが起動するように設定してください。
問1. A1セルに1, A2セルに2…の要領で、A5セルまで埋めよう
このようになれば正解です。いろいろな方法があります。
解1
Sub test() Range("A1").Value = 1 'A1セルに1 Range("A2").Value = 2 'A2セルに2 Range("A3").Value = 3 'A3セルに3 Range("A4").Value = 4 'A4セルに4 Range("A5").Value = 5 'A5セルに5 End Sub
ひとつずつセルと数値を指定して入れる方法です。プログラムが1行動くごとにセルに数値が入っていく様子を、ステップ実行しながら見てみると勉強になります。
※試験的に動画を撮ってみました。ブラウザによっては再生できないものもあるかもしれません。ダメだったらファイル名クリックしてみると見れるかも。
解2
Sub test() Dim i As Long '変数を宣言 For i = 1 To 5 '1~5まで繰り返す Cells(i, 1).Value = i 'A列i行セルにiを入れる Next i '+1して繰り返し地点まで戻る End Sub
解1より、ちょっとプログラム的な解答です。これなら、100だろうと1000だろうと簡単にセルを埋められます。
変数
を使っていること、Range
をCell
で指定していること、繰り返し処理を使っていることで、解1よりも難しそうに見えますが、これらをマスターすることで幅がぐっと広がりますので、下記の記事を参考に、是非ひとつずつ、ゆっくり挑戦してみてください。
解3
Sub test() Dim i As Long '変数を宣言 i = 1 'まず変数iに1を入れておく Do '繰り返す Cells(i, 1).Value = i 'A列i行セルにiを入れる i = i + 1 '変数iをひとつずつ増やす If i > 5 Then Exit Do 'iが5より大きくなったらDoを抜ける Loop '繰り返し地点まで戻る End Sub
繰り返し処理をFor~Next
ではなく、Do~Loop
で行ってみたものです。今回のような数字がきっちり決まっている問題ならば、解2のほうがコードが少なくて済みますが、数値に依存しない問題ではDo~Loop
を使って繰り返す方が良い場合もあります。
問2. A1セル~A5セルのクリアボタンを作ろう
もうひとつボタンをつくって、それを押すとA1~A5のセルがクリアされるボタンを作ります。いちいち次のプログラムを起動させる前に手で消すの、面倒ですもんね(´ω`)
あ、これは、Sub test~End Sub
とは違うものなので、今まで書いてきたコードの、End Subの下に書いてくださいね!
解1
Sub clearValue() Range("A1:A5").Clear End Sub
範囲を指定して、クリア。覚えてしまえばそんなに難しくないですね。
解2
Sub clarValue() Range("A1:A5").ClearContents End Sub
ちなみにこのように書くと、書式設定を残してクリアすることができます。キーボードでDelete押すのと同じ感じです。先程の.Clear
だけだと、色の設定や罫線まで全て消えてしまうので、注意しましょう。
忘れずに、ボタンから起動するようにしておきましょう。いかがでしょう、消えましたか?クリアボタン、起動ボタン、交互に押して動作を確かめてみてください!
問3. 入力された数値より大きいものを赤くしよう
まずはA1~A5セルにランダムに数値を入れておいてください。
解1
Sub test() Dim i As Long, n As Long '変数を宣言 n = InputBox("数値を入力してください") '入力要求 For i = 1 To 5 '1~5まで繰り返す If Cells(i, 1).Value > n Then 'A列i行セルの値がnより大きいとき Cells(i, 1).Font.ColorIndex = 3 'フォントを赤に End If Next i '繰り返し地点まで戻る End Sub
変数がふたつになりました。nが入力された数値を格納する変数で、iがセルの位置をひとつずつループさせる変数です。セルの値をひとつずつずらしながらnより大きいか確認して、大きければ色を変えています。
Cells(i, 1).Font.ColorIndex = 3 'ColorIndexでの赤指定 Cells(i, 1).Font.Color = RGB(255, 0, 0) 'Colorでの赤指定
上記ではColorIndexで1=黒、2=白、3=赤…のように、あらかじめ数値に色が割り振られているものを利用していますが、RGBで指定することもできます。
InputBox
に10を入力してみると、こんな感じになりました。いろんな数値で試してみてください!
クリアボタンの改造
今のままのクリアボタンだと、いろいろ試したいのにいちいち消えてしまいますよね。フォントの色だけ自動に戻すようにしてみましょう。
Sub clearValue() Range("A1:A5").Font.ColorIndex = xlAutomatic 'フォント色を自動へ戻す End Sub
これでフォントの色が戻ります。InputBox
に入れる数値を変えてみて、色々試してみてくださいー。
自分の作りたいものをプログラミングするには
いかがでしょうか、ここまでなんとなくでもわかってきたら、基本はだいたいOKです。自分の作りたいものをイメージしてみてください。それは、どんなものでしょう?
イメージを細分化
全て箇条書きで紙に書き出すのが効果的です。
- ○○というファイルを××という名前でコピー
- ××というファイルを開く
- E1セルに今日の日付を入れる
- A1~A31セルに今月の日付を入れる
- B1~B31セルに今月の曜日を入れる
- B1~B31セルが日曜日ならフォントを赤に
- ・・・
検索→コピペの繰り返し
「ExcelVBA ファイル コピー」で検索してみましょう。たくさんやり方が載っているはずです。次は、「ExcelVBA ファイル 開く」です。連続した日付を入れるなら、さっきやったFor~Next
でできそうですよね?曜日の判定はIf~End If
ですね。
こんな感じで、細分化した目的をひとつずつ検索すれば、それに適したコード(スニペットと言います)が必ず見つかりますので、それをコピーして繋げていきます。検索スキルというものも必要ですが、できるだけ汎用的な単語をスペースで区切って検索するのがコツです。
「マクロの記録」を使って、やりたい動きをコード化するのも有効です。記録したコードはだいたい必要ないもの含まれてしまうので(何行スクロールしたとか、どのセルをアクティブにしたとか)、必要なところだけをコピーして組み込むのがおすすめです。
1行ずつの積み重ねでできている
プログラムの大きな塊を想像すると、「どうせ自分にはできっこない」と思ってしまいがちですが、1行1行は決して難しいものではありません。根気のいる作業ですが、自分の仕事が楽になると思えば、ちょっと楽しくなってきませんか?
エラーにビビらない!
エラーは、「ここがこういうふうに間違ってるよ」ということをきちんと教えてくれています。頭から「自分には分からない」と決め付けてしまっては前に進むことはできません。是非、読んでみて、分からなければ調べてみて、自分で解決する癖をつけていきましょう。
最後に
プログラムは、ちょっと乱暴な言い方をすると「目的が達成できればOK」です。人それぞれ癖というものがありますし、正解は一つではありません。最初のうちから、スマートなコード、短いコードを目指さなくても、ある程度知識がついてくれば、「あ、ここはもっと短くできるな」ということが分かってくると思います。
私も、過去のコードを見て「よくもまぁこれだけの遠回りを…」と思うようなもの、いっぱいありますw そんな風に思えることができることこそが、自分が成長している証なのかもしれません。
Excelというものは、かなりの確率で仕事をするPCには入っているソフトです。それだけ、Excelのマクロは特殊な環境がいらなくて、誰でも、簡単に始められるものです。“興味を持ってるけどなかなか踏み出せない”、そんな方が一人でも多く、自分の仕事を効率化できるようになってくれたらいいなと思っています。
ほかの入門記事はこちら
- ExcelVBA入門第0回 始める前に
- ExcelVBA入門第1回 動かしてみる
- ExcelVBA入門第2回 とりあえず覚えておくべきこと
- ExcelVBA入門第3回 変数の宣言
- ExcelVBA入門第4回 RangeとCells
- ExcelVBA入門第5回 ステップ実行
- ExcelVBA入門第6回 If ~ End Ifステートメント
- ExcelVBA入門第7回 インデントとコメントアウト
- ExcelVBA入門第8回 繰り返し処理
- ExcelVBA入門第9回 5種類のモジュールの違い
- ExcelVBA入門第10回 3種類のプロシージャと命名規則
- ExcelVBA入門第11回 スコープ(適用範囲)
- これからExcelのマクロを始めたいという方に!簡単な練習問題作りました。
- 私がExcelVBAでよく使う便利なコード・スニペットまとめ
- プログラム初心者さんへ贈る、エラーが起きたら試してみて欲しいこと
- ExcelVBAのクラスモジュールって何?という人向けの使い方まとめ
書籍を執筆しています。
1件のピンバック
[…] 手動 […]
コメントは承認制ですので、反映までしばらくお待ち下さい。(稀にスパムの誤判定にて届かないこともあるようですので、必要な際はお問い合わせからお願い致します。)
YouTubeでQ&Aコンテンツを企画しています
運営しているYouTubeチャンネルで、ご相談やご質問を募集しています。動画のコメントやお問い合わせページからお気軽にご相談をお寄せください。