【VBA】#1 マクロはじめの1歩

最近VBAにめちゃくちゃハマって、プロジェクト業務そっちのけでやっております。。

それまでは、プログラミング苦手だし、VBA難しそうっていうイメージで敬遠してたんだけど、

やってみたら面白すぎる。笑

本当に面白いし楽しいから、オススメします。笑

VBAにハマったきっかけ

普段はプロジェクト業務に従事していて、リーダーの立場で動いてるので、
私が手を動かすことはそこまで多くないです。

ただ、3年目なので、細々した雑用を押しつけられる 任せられることがたまにあって、
その一つが定例作業でした。

私忙しいのになんで!!
ふざけんなよ!おまえのが暇だろ!

って、正直思いました。。笑(最低)

でもまあやるしか無さそうだし、
でもやりたくないし面倒だし、
忘れそうだしやりたくないし、

、、じゃあもうマクロにしよう!
やったことないけど!!いけるっしょ!

っていう感じで、
どうしても仕事をしたくなかったので、
VBAで自動化することにしました!
(VBA書いたこともないのに笑)

作業内容


定例作業は3つ担当することになりました。

1つ目は、毎月第4週目の最初の営業日に
①勤怠管理ファイルを入力してない人数を取得
②上記①で取得した人数を記載した勤務時間入力依頼メールを送信

2つ目は、毎月第4週目の最初の営業日に
①当該月の離任者情報を要員計画から抽出
②社員番号・所属・名前を離任者管理簿に記載
③離任者ごとの詳細情報ファイルを作成
④先月分のバックアップを取得
⑤離任者にファイル記入依頼メールを送信

3つ目は、毎週金曜日に
①勤怠管理ファイルから、翌週出社する人の社員番号・所属・名前・プロジェクト名を抽出
②出社管理ファイルに記載
③変更があれば都度更新

こんな感じ。。
(ガチめんどい)

VBAの1歩目

VBA書いて自動化したいけど、どうすればいいの????って感じで、
いやほんとどうしたらいいんだろうっていう。笑

とりあえず、最初は、
Excelファイルのタブに「開発」を出すところからスタート。

ファイル>リボンのユーザ設定>開発

多分これで多分に開発が出てくる!!はず。笑

次に開発タブで「VBAプロジェクト」を押下すると、コード書くウィンドウが出てくる。

次に左側になんか色々出てくるから、
VBAを保存したいエクセルファイルに「標準モジュール」を作成して、そこに実現したいことを書いていくイメージ!!!

※イメージです。詳しいやり方は検索したら出てきます。

コーディング1歩目

まずコーディング経験の有無で少しスタートが変わってくるけど、一旦プログラミングかじったことある程度の人向けの説明です。。

  1. 変数

  2. メソッド

基本的には、普通にコーディングなので、変数宣言して、メソッド書いて、っていう感じ。

例えば1つ目の定例作業
①勤怠管理ファイルを入力してない人数を取得
②上記①で取得した人数を記載した勤務時間入力依頼メールを送信
だとしたら、

▼変数
勤務管理ファイルのパス(A) String
人数カウンター(B)     Long

▼メソッド
public メイン() 戻り値なし ※下記privateメソッド呼出
private ファイルオープン(A) 戻り値なし
private 人数カウント(A) 戻り値ありB
private ファイルクローズ(A) 戻り値なし
private メール作成(B) 戻り値なし

こんな感じ。

変数宣言


変数宣言は、

Dim 変数名 As 変数型

これが基本。

例えばStirng型でCドライブ直下にあるfile.xlsxファイルのパスを宣言するなら、

Dim file_path As String: file_path = "¥C:¥file.xlsx"

こんな感じになる。

「Dim」で「変数宣言」になるって思ったけばOK

メソッド宣言

大きく2種類。戻り値なしと戻り値あり。

  • 戻り値なし

アクセス権限 Sub メソッド名 (引数 As 引数型)
 〜処理〜
End Sub

  • 戻り値あり

アクセス権限 Function メソッド名 (引数 As 引数型) As 戻り値型
 〜処理〜
メソッド名 = 戻り値
End Function

こんな感じ。
例えば定例作業1つめの
①勤怠管理ファイルを入力してない人数を取得
は、下記の通りになる。

private Function countNotUpdated(file_path As String) As Long
Dim cnt As Long : cnt = 0
Dim wBook As WorkBook: wBook = OpenBooks(file_path)
wBook.ActiveSheets(1)
.Range("A1").Select
With wBook
     Do while ActiveCell.Value <> ""
          If ActiveCell.Value  = "8:00" Then
                cnt = cnt + 1
          End If
     Loop
End With
     countNotUpdated = cnt
Set wBook = Nothing
End Function

※記憶でコード書いたからコンパイルとかしてないので、太字のとこだけ参考にしてください。

戻り値ないならSub、戻り値あるならFunction、
戻り値はメソッド名=戻り値で返す、
メソッドの終わりはEnd 〇〇

この辺を押さえておけばOK。

コーディング手順

ある程度は、調べれば、やりたいことをのサンプルコードがネットに散らばってるので、それを参考に書く。
で、あとは、トライアンドエラー。

「実行」してコンパイルが通らなければ、そこを解消
コンパイル通ったけど想定通り行かなかったら、
ブレークポイント打って、デバッグ。


あとは、MsgBox"" でメッセージを表示して、どこまで通ってるかな〜って見たりしてました!

とにかく手を動かしてみることが1番の近道かと、思いました。

これどうやるの?って思ったら、検索!笑

あとは、ネットのサンプルコードを丸々コピーして、自分のやりたいようにカスタマイズするのが、とっつきやすいしわかりやすいと思います!

まとめ

さっさと作業を自動化して
空いた時間はサボりたい人生。

この記事が気に入ったらサポートをしてみませんか?