
前回、これまで学んできた事を使って旅館の予約管理システムに挑戦してもらいました。
うまく作れたでしょうか?
ここで作り方を解説するので、うまく作れた人も作れなかった人も確認してみましょう。
■前回の記事はこちら
目次
旅館の予約管理システムの作り方
まずどんな機能が必要だったかおさらい
今回作ろうと思っていた予約システムで実装したかった機能はざっくり以下の通りです↓
■機能
・新規の予約を追加できる
・1部屋ずつ予約状況を確認できる
・新規の予約を追加するとき、既に予約が入っていた場合「既に予約されています」とメッセージを出して予約できないようにする。
■レイアウト
では、さっそく作ってみます。
1.マクロとなるメイン関数を作る
まずはボタンを押したときに実行させる関数を作っていきます。
最初の処理として、予約日と部屋番号をシートから取得してくる処理を追加しておきます。
1 2 3 4 5 6 7 8 9 10 |
'メイン関数/マクロとして呼び出す Sub YoyakuMain() Dim YoyakuDate As String '予約日 Dim YoyakuLoom As String '部屋番号 YoyakuDate = Range("B3").Value '予約日を取得 YoyakuLoom = Range("C3").Value '部屋番号を取得 End Sub |
「Range(“セルの座標”).Value」で、特定のセルの中身を取ってこれるんでしたね。
これで、入力された予約日と部屋番号を取ってこれました。
ここまで作ったら、この「YoyakuMain」という関数をボタンに実行させるマクロとしてセットします。
ボタンにセットしたこの「YoyakuMain」という関数がメイン関数になります。
ボタンが押されると、まずこの関数の処理がスタートするようになります。
2. 取得した予約日・部屋番号を元に管理表に○を付ける処理を作る
次は、予約管理表の、取得した予約日と部屋番号のセルに「予約が入っている」という意味の「○」を付ける処理を作っていきます。
前回のヒントでも解説しましたが、予約管理表を確認してみると、G列に日付、2行に部屋番号の情報が入っています。
さらに、部屋番号は1~5まであり、それぞれ下のように分けることが出来ます。
部屋1:2行目以降のH列
部屋2:2行目以降のI列
部屋3:2行目以降のJ列
部屋4:2行目以降のK列
部屋5:2行目以降のL列
この列と行の取得方法はこのように考える事が出来ます。
■入力させる「列」の取得方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
Dim Col As String '部屋番号の列 Select Case YoyakuLoom '取得した部屋番号 Case "部屋1" Col = "H" Case "部屋2" Col = "I" Case "部屋3" Col = "J" Case "部屋4" Col = "K" Case "部屋5" Col = "L" End Select |
この処理は、取得した部屋番号「YoyakuLoom」の値をもとに、select case文で値ごとの列文字を変数「Col」にセットしています。
■入力させる行の取得方法
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 |
Dim DateList As String '日付行の日付を格納 Dim Cnt As Integer 'プール処理に使うカウンター Dim Row As String '入力させる行数 DateList = Range("G3").Value '日付行の一番先頭のセルを取得 Cnt = 3 '日付行の一番先頭が3行目からなので3を代入しておく While DateList <> "" If DateList = YoyakuDate Then Row = CStr(Cnt) '○入力させる行を取得 DateList = "" 'ループを解くための条件""を入れる Else '次の行のセルの値をDateListに代入 Cnt = Cnt + 1 DateList = Range("G" + CStr(Cnt)).Value End If Wend |
こっちは少し厄介です。
列は5列しかなかったので、select case文を使って取得することが出来ましたが、行(日付)は30行以上あります。
今は1カ月分の日付しか表示していませんが、半年とか1年分表示させたかったらselect case文ではあまり実用的ではありません。
コードを沢山書かなければならないし、日数が増えたらさらにコードを書き足さないといけないからです。
こんな時は、FOR文やWhile文のような繰り返し処理を使って取得します。
FOR文は、繰り返す数が決まっている場合にのみ使えるため、今回のような表示させる日数が今後増えたり減ったりする場合は不向きです。
なので、今回はWhile文を使って行の取得をしていきます。
Whileの中では、IF文で2通りに分岐しています。
1つは、現在のDateListの中身と取得してきたYoyakuDateの中身が一致した場合、そのDateListの行をRowに詰め込んで、行を取得しループを抜ける処理。
もう1つは、DateListの中身と取得してきたYoyakuDateの中身が一致しない場合は、DateListの中に次の行の日付を入れてもう一度ループさせる処理。
これで○を入力させる行も取得できました。
最後に取得した行と列を繋ぎ合わせれば、○を入力させるセルの場所が完成します↓
Range(Col + Row).Value
これらを元に作ったのがこちらのコードです↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 |
'メイン関数/マクロとして呼び出す Sub YoyakuMain() Dim YoyakuDate As String '予約日 Dim YoyakuLoom As String '部屋番号 Dim YoyakuCell As String '入力するセル YoyakuDate = Range("B3").Value '予約日を取得 YoyakuLoom = Range("C3").Value '部屋番号を取得 '予約状況にマッチしたセルを取得 YoyakuCell = MatchingCell(YoyakuDate, YoyakuLoom) '管理表のセルに○を追加 Range(YoyakuCell).Value = "○" End Sub '予約状況にマッチしたセルの座標を取得する関数 Function MatchingCell(ByVal YDate As String, ByVal YLoom As String) As String Dim DateList As String '日付行の日付を格納 Dim Cnt As Integer 'プール処理に使うカウンター Dim Row As String '入力させる行数 Dim Col As String '入力させる列 ' 入力する列の取得 Select Case YLoom '取得した部屋番号 Case "部屋1" Col = "H" Case "部屋2" Col = "I" Case "部屋3" Col = "J" Case "部屋4" Col = "K" Case "部屋5" Col = "L" End Select ' 入力する行の取得 DateList = Range("G3").Value '日付行の一番先頭のセルを取得 Cnt = 3 '日付行の一番先頭が3行目からなので3を代入しておく While DateList <> "" If DateList = YDate Then Row = CStr(Cnt) '○入力させる行を取得 DateList = "" 'ループを解くための条件""を入れる Else '次の行のセルの値をDateListに代入 Cnt = Cnt + 1 DateList = Range("G" + CStr(Cnt)).Value End If Wend ' 入力する行列を返す MatchingCell = Col + Row End Function |
実行したのがこちら↓
うまく管理表に○が追加されている事が分かります。
3. 新規の予約を追加するとき、既に予約が入っていた場合「既に予約されています」とメッセージを出して予約できないようにする
ここまで来れば、この機能の追加は非常に簡単です。
○を入力する処理の前にIF文で既に○が入力されていないかチェックしてあげればいいだけです。
入っていれば、処理を分岐させてこのメッセージを表示させます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 |
'メイン関数/マクロとして呼び出す Sub YoyakuMain() Dim YoyakuDate As String '予約日 Dim YoyakuLoom As String '部屋番号 Dim YoyakuCell As String '入力するセル YoyakuDate = Range("B3").Value '予約日を取得 YoyakuLoom = Range("C3").Value '部屋番号を取得 '予約状況にマッチしたセルを取得 YoyakuCell = MatchingCell(YoyakuDate, YoyakuLoom) '管理表のセルに○を追加 Range(YoyakuCell).Value = "○" End Sub '予約状況にマッチしたセルの座標を取得する関数 Function MatchingCell(ByVal YDate As String, ByVal YLoom As String) As String Dim DateList As String '日付行の日付を格納 Dim Cnt As Integer 'プール処理に使うカウンター Dim Row As String '入力させる行数 Dim Col As String '入力させる列 ' 入力する列の取得 Select Case YLoom '取得した部屋番号 Case "部屋1" Col = "H" Case "部屋2" Col = "I" Case "部屋3" Col = "J" Case "部屋4" Col = "K" Case "部屋5" Col = "L" End Select ' 入力する行の取得 DateList = Range("G3").Value '日付行の一番先頭のセルを取得 Cnt = 3 '日付行の一番先頭が3行目からなので3を代入しておく While DateList <> "" If DateList = YDate Then Row = CStr(Cnt) '○入力させる行を取得 DateList = "" 'ループを解くための条件""を入れる Else '次の行のセルの値をDateListに代入 Cnt = Cnt + 1 DateList = Range("G" + CStr(Cnt)).Value End If Wend ' 入力する行列を返す If Range(YoyakuCell).Value = "○" Then MsgBox "既に予約されています" Else Range(YoyakuCell).Value = "○" End If End Function |
実行したのがこちら↓
お疲れさまでした。以上が、予約管理表の作り方でした!
自分で作ったものが、私の作り方と全然違ったとしても問題ありません。
人の数だけ作り方があるのです。
おまけ 予約キャンセル機能
前回の記事で、「予約キャンセル機能」に挑戦した人向けの解説です。
予約キャンセル機能は、ざっくり言うと予約の「○」を消せる機能です。
この機能を追加するには、まずシートデザインを少し変えなければなりません。
新たに「タイプ」という入力項目を追加しました。
ここに「予約」か「キャンセル」のどちらの機能を使うか記入します。
そして、キャンセル機能を追加したのがこちらのコードです↓
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
'メイン関数/マクロとして呼び出す Sub YoyakuMain() Dim YoyakuDate As String '予約日 Dim YoyakuLoom As String '部屋番号 Dim yoyakuType As String 'タイプ Dim YoyakuCell As String '入力するセル YoyakuDate = Range("B3").Value '予約日を取得 YoyakuLoom = Range("C3").Value '部屋番号を取得 yoyakuType = Range("D3").Value '予約タイプを取得 '予約状況にマッチしたセルを取得 YoyakuCell = MatchingCell(YoyakuDate, YoyakuLoom) '予約タイプによって処理を切り替え If yoyakuType = "予約" Then '予約だった場合 '管理表のセルに○を追加 If Range(YoyakuCell).Value = "○" Then MsgBox "既に予約されています" Else Range(YoyakuCell).Value = "○" End If Else 'キャンセルだった場合 Range(YoyakuCell).Value = "" End If End Sub '予約状況にマッチしたセルの座標を取得する関数 Function MatchingCell(ByVal YDate As String, ByVal YLoom As String) As String Dim DateList As String '日付行の日付を格納 Dim Cnt As Integer 'プール処理に使うカウンター Dim Row As String '入力させる行数 Dim Col As String '入力させる列 ' 入力する列の取得 Select Case YLoom '取得した部屋番号 Case "部屋1" Col = "H" Case "部屋2" Col = "I" Case "部屋3" Col = "J" Case "部屋4" Col = "K" Case "部屋5" Col = "L" End Select ' 入力する行の取得 DateList = Range("G3").Value '日付行の一番先頭のセルを取得 Cnt = 3 '日付行の一番先頭が3行目からなので3を代入しておく While DateList <> "" If DateList = YDate Then Row = CStr(Cnt) '○入力させる行を取得 DateList = "" 'ループを解くための条件""を入れる Else '次の行のセルの値をDateListに代入 Cnt = Cnt + 1 DateList = Range("G" + CStr(Cnt)).Value End If Wend ' 入力する行列を返す MatchingCell = Col + Row End Function |
一応開設すると、単純に「タイプ」に入力された文字によって処理をIF文で切り分けています。
この程度の予約管理表なら手で打て!って感じもしますけどね笑
まとめ
これで、VBAの基本講座は終了です。
もうすでに簡単なシステムであれば、発想次第でなんでも作る事が出来るはずです!
しかし、「クラス」「オブジェクト指向」「フォーム画面」「インスタンス」などのように、VBAにはまだまだ沢山の機能が備わっており、いずれ必要になってきます。
今後も、定期的にVBAの解説をしていこうと思うので、このブログなどを使ってしっかり学習を続けていくようにしましょう。
最後に、ここまでの学習お疲れさまでした!
また、ご覧くださりありがとうございました!
追記
While DateList <>
の箇所でコンパイルエラーが出てしまうというコメントを頂きました
恐らく、<>がエスケープされて<>と表記されていましたので、それによるものかと思います!
大変申し訳ありませんでした!
こちらのページを参考にしている者です。
While DateList <> “”
の部分でエラーが起きるのですがどうすればよいでしょうか。
While DateList <> “”
がコンパイルエラーになってしまいます。