【VBA】#1 マクロはじめの1歩
最近VBAにめちゃくちゃハマって、プロジェクト業務そっちのけでやっております。。
それまでは、プログラミング苦手だし、VBA難しそうっていうイメージで敬遠してたんだけど、
やってみたら面白すぎる。笑
本当に面白いし楽しいから、オススメします。笑
VBAにハマったきっかけ
普段はプロジェクト業務に従事していて、リーダーの立場で動いてるので、
私が手を動かすことはそこまで多くないです。
ただ、3年目なので、細々した雑用を押しつけられる 任せられることがたまにあって、
その一つが定例作業でした。
私忙しいのになんで!!
ふざけんなよ!おまえのが暇だろ!
って、正直思いました。。笑(最低)
でもまあやるしか無さそうだし、
でもやりたくないし面倒だし、
忘れそうだしやりたくないし、
、、じゃあもうマクロにしよう!
やったことないけど!!いけるっしょ!
っていう感じで、
どうしても仕事をしたくなかったので、
VBAで自動化することにしました!
(VBA書いたこともないのに笑)
作業内容
定例作業は3つ担当することになりました。
1つ目は、毎月第4週目の最初の営業日に
①勤怠管理ファイルを入力してない人数を取得
②上記①で取得した人数を記載した勤務時間入力依頼メールを送信
2つ目は、毎月第4週目の最初の営業日に
①当該月の離任者情報を要員計画から抽出
②社員番号・所属・名前を離任者管理簿に記載
③離任者ごとの詳細情報ファイルを作成
④先月分のバックアップを取得
⑤離任者にファイル記入依頼メールを送信
3つ目は、毎週金曜日に
①勤怠管理ファイルから、翌週出社する人の社員番号・所属・名前・プロジェクト名を抽出
②出社管理ファイルに記載
③変更があれば都度更新
こんな感じ。。
(ガチめんどい)
VBAの1歩目
VBA書いて自動化したいけど、どうすればいいの????って感じで、
いやほんとどうしたらいいんだろうっていう。笑
とりあえず、最初は、
Excelファイルのタブに「開発」を出すところからスタート。
ファイル>リボンのユーザ設定>開発
多分これで多分に開発が出てくる!!はず。笑
次に開発タブで「VBAプロジェクト」を押下すると、コード書くウィンドウが出てくる。
次に左側になんか色々出てくるから、
VBAを保存したいエクセルファイルに「標準モジュール」を作成して、そこに実現したいことを書いていくイメージ!!!
※イメージです。詳しいやり方は検索したら出てきます。
コーディング1歩目
まずコーディング経験の有無で少しスタートが変わってくるけど、一旦プログラミングかじったことある程度の人向けの説明です。。
変数
メソッド
基本的には、普通にコーディングなので、変数宣言して、メソッド書いて、っていう感じ。
例えば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番の近道かと、思いました。
これどうやるの?って思ったら、検索!笑
あとは、ネットのサンプルコードを丸々コピーして、自分のやりたいようにカスタマイズするのが、とっつきやすいしわかりやすいと思います!
まとめ
さっさと作業を自動化して
空いた時間はサボりたい人生。
この記事が気に入ったらサポートをしてみませんか?