エクセル、マクロを教えてください。 その日に宿泊予約が何件入っているかわかる表を作りたいです。
エクセル、マクロを教えてください。 その日に宿泊予約が何件入っているかわかる表を作りたいです。 見づらいかもしれませんが写真の様に、お客さまの名前、イン、アウトを別シートに入力するとその期間にお客様の名前が入る様にしたいです。(画像では同じシートにしていますが) 本当は縦の番号を部屋として空き状況も管理したいのですが、インとアウトが別のお客様で重なることもあるので上から見ていって空白だったら名前を入力するようにしようとしていました。 予約は変更になる場合もあるので、インとアウトを修正したら表も直るようにしたいです。 家にあるパソコンがエクセルもどきしか使えず、職場ではパソコンが使える時間が限られているため、行き詰まってしまいました。 良いやり方をご存知の方、教えていただきたいです。
Visual Basic | Excel・160閲覧・100
ベストアンサー
マクロ使うなら自分で勉強しないと厳しいですよ。最低限自宅でエクセル使えないと厳しいです。慣れた人間なら職場の限られた時間で動作テストして安全に動かす事は出来ますが、初心者なら不具合でたら困ると思います。 とりあえず簡単な内容ですのでサンプルとしてコードは書いてみました。 次の説明内容で理解できない場合はマクロの書き方など一旦調べて勉強してから再トライしてください。 1.シートを準備する。1シート目の予約件数確認するカレンダー型のシートはシート名を「カレンダー」とする。2シート目のシート名は「予約表」とする。ブックは名前を付けて保存でファイル形式は「.xlsm」を選択して保存する。 2.カレンダーシートの構成はあなたの写真そのまま。(予約表省いた形) 3.予約表シートの構成はあなたの写真の予約表そのまま。1行目に見出しで2行目以降に入力。 4.マクロを実装する。Alt+F11を押してVBEを開く。左側プロジェクトウインドウ内の「Sheet〇(カレンダー)」をダブルクリックする。 5.右側に「〇〇.xlsm - Sheet〇(コード)」という窓が開かれるので、そこに下記のプログラムをコピペする。(Option Explicitから下全部) 6.貼り付けたプログラム内の緑色の文字にも注意事項を書いているので一通り読んで確認する。 7.予約表シートを選択して、そのあとカレンダーシートを選択するとマクロが実行される。内容確認。 8.細かいエラー処理等は入れていないので想定外の事をしたら変なエラーが出る可能性はある。(カレンダーと予約表の周囲に余計な入力をしない事) これより下がコピペするプログラム Option Explicit '動作条件、シート構成 'シート名は1シート目の予約件数確認シートが「カレンダー」 '2シート目の予約情報入力シートが「予約表」 '予約表は1行目が見出しで2行目からデータを入力。A列が名前、B列がIN、C列がOUT '名前・IN・OUTの3つが入力されている行のみ実行する。INOUTが日付以外の場合は無視する。 '表の周囲に余計な入力が無い事 'カレンダーは1行目が日付、2行目が曜日、1列目が件数の数字 '日付けと曜日は右にどの列まで有っても良い。ただしカレンダー以外の余計な入力が無い事 '予約表の名前に色を付けるとカレンダーにも色が反映される。 'マクロ動作のタイミング:カレンダー以外のシートを選択した後にカレンダーシートを選択したときにマクロが実行される Private Sub Worksheet_Activate() Dim i As Long With ThisWorkbook.Worksheets("カレンダー") .Range(.Cells(3, 2), .Cells(Rows.Count, Columns.Count)).Value = "" .Range(.Cells(3, 2), .Cells(Rows.Count, Columns.Count)).Interior.Color = xlNone End With With ThisWorkbook.Worksheets("予約表") For i = 2 To .Cells(Rows.Count, 1).End(xlUp).Row If .Cells(i, 1).Value <> "" Then If .Cells(i, 2).Value <> "" Then If .Cells(i, 3).Value <> "" Then Call DataWrite(.Cells(i, 1), .Cells(i, 2).Value, .Cells(i, 3).Value) End If End If End If Next End With End Sub Private Sub DataWrite(ByVal mName As Range, ByVal InDate As Variant, ByVal OutDate As Variant) Dim mDate As Date Dim i As Long Dim j As Long Dim CT As Long If Not IsDate(InDate) Then Exit Sub If Not IsDate(OutDate) Then Exit Sub mDate = InDate CT = 0 Do While mDate <= OutDate With ThisWorkbook.Worksheets("カレンダー") For i = 2 To .Cells(1, Columns.Count).End(xlToLeft).Column If .Cells(1, i).Value = mDate Then j = .Cells(Rows.Count, i).End(xlUp).Row + 1 .Cells(j, i).Value = mName.Value .Cells(j, i).Interior.Color = mName.Interior.Color Exit For End If Next End With mDate = DateAdd("D", 1, mDate) CT = CT + 1 If CT > 1000 Then Exit Sub '無限ループ回避 Loop End Sub
ありがとうございます。仰る通りです。 夏のボーナスが出たらエクセルを自宅でも使えるようにしようと思います! 金曜日に職場で試させていただき、うまく動きました! しかし、私が今までボタンを押すとマクロが実行されるというやり方しか経験なかったため、シート選択で実行する方法がわからず… 帰宅してから調べて、標準モジュールに入力した他に、プロジェクトエクスプローラーからシートを開き、オブジェクトのリストボックスで「Worksheet」を選択し、プロシージャのリストボックスで「Activate」を選択、そして記載いただいたコードを入力する、と言うのが必要なのかなと思いました。 明日試してみる予定です。
質問者からのお礼コメント
上手く出来ました!ありがとうございます。 私の返信の、標準モジュールへの入力という部分は不要でした。 もし、同じようなことで困ってこちらに行き着いた方がいた時のために(^^)
お礼日時:5/16 21:24