- 締切済み
vba スケジュール更新マクロ研究中(長文です)
いつもお世話になります。 私の会社では、スケジュール管理するにあたり、1日を3つに分けています。 つまり、「午前」「午後」「夜間」「午前午後」「午後夜間」「全日」の6種になります。 只今私は、スケジュールが更新されたときに、上書きして変更点をメッセージボックスで返すマクロを考えています。 (趣味の範囲ですので締め切りはないのですが、なんせVBA始めて1ヶ月目なもんですから四苦八苦してます><) そこで、とりあえず下記のような「更新前のスケジュール区分を検知してメッセージで返す」ところまで出来ました。 (もう少しスッキリできないものかと思っております。) ここに「更新版と見比べて変更し、メッセージで返す」という働きを足していこうと思っています。 が、別々にコードが書けても、それを合体させようとなると、どうやったらいいのか皆目見当が付きません。 難解に思われるのは、結合セルと入力済みデータの扱いです。 例えば、とある1日に対して、「午前」「午後」「夜間」と別々の予定が入ってたとします。 予定に変更が出て「夜間」が「全日」になってしまったとします。 コードに「生き残っているのは夜間だ」という判断をさせることは出来ませんよね? (というのも、区分が変更された場合、文字列が一致しているとは限らないのです。) 対話型にして、チェックボックスみたいな形で選択させるのがいいのでしょうか? オーバースペックで耳から煙が出そうです・・・ とりあえず下記がコードです。 "strage1"を古いスケジュール、"strage2"を更新版としています。 つたない記述ですが、ヒントをご教授くださいませ。 ------------------------------------ Sub 何を書き換えたかMsgBox2() Dim i As Integer, j As Integer Dim myMsg As String Dim myold As Worksheet, mynew As Worksheet Set myold = Sheets("strage1") Set mynew = Sheets("strage2") j = 5 For j = j To 35 i = 6 For i = i To 8 If IsEmpty(myold.Cells(j, i)) And Not IsEmpty(mynew.Cells(j, i)) Then myMsg = myMsg & mynew.Cells(j, i) & "が追加になりました" & vbCrLf ElseIf Not IsEmpty(myold.Cells(j, i)) And IsEmpty(mynew.Cells(j, i)) Then myMsg = myMsg & myold.Cells(j, i) & "がキャンセルになりました" & vbCrLf ElseIf myold.Cells(j, i) <> mynew.Cells(j, i) Then myMsg = myMsg & myold.Cells(j, i).Value & "から" & mynew.Cells(j, i) & "に変更しました" & vbCrLf End If myold.Cells(j, i).Value = mynew.Cells(j, i) Next Next MsgBox myMsg End Sub --------------------------------------------- Sub 区分識別3() Dim i As Integer Dim myMsg As String i = 5 For i = i To 35 If Cells(i, 6) <> "" Then If Cells(i, 6).MergeArea.Count = 3 Then myMsg = myMsg & i - 4 & "日、全日枠の" & Cells(i, 6).Value & "です。" & vbCrLf ElseIf Cells(i, 6).MergeArea.Count = 2 Then myMsg = myMsg & i - 4 & "日、午前午後枠の" & Cells(i, 6).Value & "です。" & vbCrLf Else myMsg = myMsg & i - 4 & "日、午前枠の" & Cells(i, 6).Value & "です。" & vbCrLf End If End If If Cells(i, 7) <> "" Then If Cells(i, 7).MergeArea.Count = 2 Then myMsg = myMsg & i - 4 & "日、午後夜間枠の" & Cells(i, 7).Value & "です。" & vbCrLf Else myMsg = myMsg & i - 4 & "日、午後枠の" & Cells(i, 7).Value & "です。" & vbCrLf End If End If If Cells(i, 8) <> "" Then myMsg = myMsg & i - 4 & "日、夜間枠の" & Cells(i, 8).Value & "です。" & vbCrLf End If Next MsgBox myMsg End Sub ------------------------------------------------------- 以上です。 よろしくお願いいたします。
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- bin-chan
- ベストアンサー率33% (1403/4213)
二重ループ廻して、ループ終了後にメッセージだすのであれば細かな処理は難しいかも。 strage1(旧)、strage2(新)に加え、差分シート(Storage3?)を設けるのはどうでしょう。 Set myCheck = Sheets("storage3") If IsEmpty(myold.Cells(j, i)) And Not IsEmpty(mynew.Cells(j, i)) Then myCheck.Cells(j, i) = mynew.Cells(j, i) & "が追加になりました" ElseIf Not IsEmpty(myold.Cells(j, i)) And IsEmpty(mynew.Cells(j, i)) Then myCheck.Cells(j, i) = myold.Cells(j, i) & "がキャンセルになりました" ElseIf myold.Cells(j, i) <> mynew.Cells(j, i) Then myCheck.Cells(j, i) = myold.Cells(j, i).Value & "から" & mynew.Cells(j, i) & "に変更しました" のように。 で Next Next MsgBox myMsg End Sub を Next i Next j ''''MsgBox myMsg call 区分識別3 End Sub にする。 なお > j = 5 > For j = j To 35 > i = 6 > For i = i To 8 は For j = 5 To 35 For i = 6 To 8 で良いですよ。
お礼
早速の回答ありがとうございます。 なるほど差分シートですかー データを一旦別シートに入れて、メッセージは出さずに、区分識別コードへ流す・・・ということでしょうか。 Callはまだ勉強してないキーワードでした^^; Gotoかなぁと思っていたのですが、あんまり評判がよくないので手を出しかねていました。 ForNextの修正文ありがとうございます。 参考書どおりに書いてしまってますね私^^; 大変参考になりました。