- ベストアンサー
CSVで出力された予定表から必要な情報をEXCELファイルの対応箇所へマクロでコピーする
- EXCELで作成している月間報告書に、CSVで出力された予定表の情報を挿入するためのマクロを作成したい。
- CSVから取得した「予定詳細」と「場所」をEXCELのE列とF列に挿入するマクロが必要。
- グループウェアからエクスポートしたCSVデータを報告書の該当日付の行に挿入するためのマクロを作成したい。
- みんなの回答 (5)
- 専門家の回答
質問者が選んだベストアンサー
とりあえず考え方のみになりますが Sub Macro1() For Each shi In Worksheets(1).Range("D2:" & Worksheets(1).Range("D2").End(xlDown).Address) '開始日データ列(D列)にデータ入力されている分だけの繰り返し処理 For l = Day(shi.Value) To Day(shi.Offset(0, 2).Value) '開始日と終了日の差分の繰り返し処理 If Worksheets(2).Range("D4").Offset(l, 0).Value = "" Then Worksheets(2).Range("D4").Offset(l, 0).Value = shi.Offset(0, 4) Else Worksheets(2).Range("D4").Offset(l, 0).Value = Worksheets(2).Range("D4").Offset(l, 0).Value & "," & shi.Offset(0, 4) End If 'CSVデータの予定列(H列)の内容を報告書のD列に書き加え Next l Next shi End Sub 同一ブックのsheet1にCSVデータ、sheet2に報告書テンプレートを用意した状態でマクロを実行するとCSVデータのH列(予定)が報告書のD列に転記されます 処理自体は単純にCSVデータの日付から報告書に転記するセルの位置情報を求めて追加記載しているだけです あとは ・H列未入力時(-表記)の処理 ・場所の処理 を付け加えるだけですが、明示しているコードの一部変更で対応可能かと思われます
その他の回答 (4)
- web2525
- ベストアンサー率42% (1219/2850)
>同じ日に何件も予定が入力される場合に「、」の代わりに順番に >(1)~~~(2)~~~(3)~~~ >のように(1)(2)(3)と番号を付ける良い方法があるでしょうか? これも考え方という意味で 前回の回答の If Hk.Offset(l, 0).Value <> "" Then Hk.Offset(l, 0).Value = Hk.Offset(l, 0).Value & "," & Std '報告書転記位置にすでにデータが入力されている場合、データを続けて転記 ElseIf Std <> "" Then Hk.Offset(l, 0).Value = Std '報告書転記位置にすでにデータが入力されている場合で転記するデーターがある場合はそのまま転記 End If Next l この部分を With Hk.Offset(l, 0) 'With文はわかりますよね? kc = 1 'カッコ内の数値をセットしています If .Value <> "" Then '転記先の状態の確認 For mc = 1 To Len(.Value) kc = kc + (Mid(.Value, mc, 1) = "(") * -1 Next mc '転記先が空欄以外の場合”(”の数を数えてkcに追加しています End If .Value = .Value & "(" & kc & ")" & Std '(No)付きでデータの転記 End With こんな形に変化させれば可能です
お礼
御礼遅くなりました。 おかげさまで、参考にさせていただきうまくできるようになりました。 ありがとうございます。 是非またお願いいたします。
- web2525
- ベストアンサー率42% (1219/2850)
若干補足 日程が当月内で完結しない場合には先月からの引き続きのパターンもあるかと思います その場合: For l = Day(Yc.Value) To Dend '報告書への転記繰り返し処理 この処理を変更することで対応可能かと思います 例:For l = Dkaisi To Dend その場合は開始日と終了日が当月であるかどうかの判定が必要です 判定の結果を元に 開始日: 先月:Dkaisi = 1 (月初めは必ず一日なので) 当月:Dkaisi = Day(Yc.Value) 終了日: 当月:Dend = Day(Yc.Offset(0, 2).Value) 来月:Dend = Day(DateValue(Year(Yc.Value) & "/" & Month(Yc.Value) + 1 & "/1") - 1) (翌月の一日から1引いて当月末日を求めています報告書のカレンダーデータの最終日から求める方法もあります = Worksheets(2).Range("A65535").End(xlUp).Value 最初に動作確認する場合は =28 =29 =30 =31 と直接指定して見るのも一つの方法です) If または Select Case で状況に合わせた処理を追加してください あと、投稿したコードはそのまま貼り付けても正常に動作しなかったり、思っている動作にならないケースが多々発生します (サンプルデーターとして私が作成したデータと、質問者の実際のデータが異なっているため) あくまで考え方の参考程度にとどめておくことをお勧めします 特に他人の作成したマクロの解析はマクロに精通した人でも困難なものですのでw
お礼
web2525さんへ お世話になっています。 回答してくださった内容でアレンジさせていただいて、無事に「予定」と「場所」を報告書に反映させることができました! ありがとうございます。 おかげさまで、恥ずかしながらSelect case文が使えるようになりました。 ありがとうございました。 追加で教えていただければと思うのですが、 同じ日に何件も予定が入力される場合に「、」の代わりに順番に (1)~~~(2)~~~(3)~~~ のように(1)(2)(3)と番号を付ける良い方法があるでしょうか? 良ければまたお知恵をお貸しください。
- web2525
- ベストアンサー率42% (1219/2850)
翌月繰り越しに関してと予定、予定詳細の入力状況に合わせた処理を追加してみました Set De = Worksheets(1).Range("D2:" & Range("D65535").End(xlUp).Address) 'CSVデータ読込先の開始日入力範囲 Set Hk = Worksheets(2).Range("D4") '報告書テンプレートのデーター転記場所の起点セル 'マクロ内で参照する範囲を定数指定しています、CSVデータの読み込み先や報告書のテンプレートに書き換える事で汎用性を持たせています For Each Yc In De '開始日データ範囲内の繰り返し If Month(Yc.Value) = Month(Yc.Offset(0, 2).Value) Then '開始日と終了日が同一月内であった場合(月内で完了している場合) Dend = Day(Yc.Offset(0, 2).Value) '報告書に転記するループ回数の指定 Else '翌月に繰り越した場合 Dend = Day(DateValue(Year(Yc.Value) & "/" & Month(Yc.Value) + 1 & "/1") - 1) '報告書に転記するループ回数の最終を当月末に指定 End If For l = Day(Yc.Value) To Dend '報告書への転記繰り返し処理 Select Case (Yc.Offset(0, 4).Value = "-") * 2 + (Yc.Offset(0, 5).Value = "") '予定と予定詳細の状況を確認 '以下、報告書に転記する内容を指定 Case 0 '予定、予定詳細ともに入力あり Std = Yc.Offset(0, 4).Value & "," & Yc.Offset(0, 5).Value '形式が ”予定,予定詳細” Case -1 '予定のみ入力あり Std = Yc.Offset(0, 4).Value Case -2 '予定詳細のみ入力あり Std = Yc.Offset(0, 5).Value Case -3 '予定、予定詳細ともに未入力 Std = "" End Select If Hk.Offset(l, 0).Value <> "" Then Hk.Offset(l, 0).Value = Hk.Offset(l, 0).Value & "," & Std '報告書転記位置にすでにデータが入力されている場合、データを続けて転記 ElseIf Std <> "" Then Hk.Offset(l, 0).Value = Std '報告書転記位置にすでにデータが入力されている場合で転記するデーターがある場合はそのまま転記 End If Next l Next Yc
- web2525
- ベストアンサー率42% (1219/2850)
添付された表が細かすぎてよく見ませんw ざっと内容だけ確認したいのですが 1.CSVデーターの D列:開始日 F列:終了日 I列:予定詳細 J列:場所 で良いのかな? 2.開始日と終了日の記載があるということは予定が2日以上連続して実施される場合があるということですか? その場合、場所は固定ですか?それとも日によって変わりますか? 3.同一の日付で複数の予定が入る可能性はありますか? 複数の予定が入る場合は場所も複数になるのでしょうか? 4.確認の3.がNoの場合はマクロではなく関数でも表記可能ですがマクロが必要ですか?
補足
そうですよね。画像付で質問するのが初めてだったので表示されている画像を見てびっくりしました… すみません。 1. そのとおりです。 更に追加しなければならない情報がありました。 「H列」に「予定」という列があるのですが、H列に予定が表示されている場合があります。 また、「K」列に「場所詳細」という列があるのですがK列に場所が表示されている場合もあります。 この「H」と「I」、「J」と「K」の違いは、グループウェア上での記入の仕方の違いで、「HとJ」はプルダウンから選択した場合に入力され、「IとK」は手打ちで入力された場合です。 なので、考えられるパターンとして、 1 H列「予定が表示されている」、I列「空白」(手打ち未記入の場合は空白になる) 2 H列「--」(未選択の場合「--」が記入されている)、I列「予定が表示されている」 3 H列「予定が表示されている」、I列「予定が表示されている」 があります。 場所についても同様です。 HをJに、IをKに置き換えて考えてください。 2.同じ予定が二日以上連続して実施される場合があります。 その場合の場所は固定です。 また、二日以上連続して実施される場合に月をまたぐ場合もあります。 挿入したい報告書は一月単位なのでその場合は月の最終日まで同じ内容を入力したいです。 3.同じ日に複数の予定が入る場合もあります。 場所も複数になることもあります。 予定は複数で、場所は同じ場合もあります。 その場合は「、」で区切りたいと思っています。 また、場所は記入されていない場合もあります。 入力時「予定」は必須なので、HかIに記入が必ずありますが、「場所」は必須ではないので、「J列」--、「K列」空白、の場合があります。 その場合は報告書へは「--」を入れたいと思います。 4.今回の画像はサンプル用に「作業1」等にしていますが、実際には自由な文字列が入ります。 複雑で分かりにくいと思いますので、不明な点はそのつどお聞きください。 ぜひお力をお借り出来ればうれしく思います。 よろしくお願いします。
補足
早速の回答ありがとうございます。 参考にさせていただきアレンジしてみました。 繰り返し処理について大変参考になります。 それで、良いところまでできました。 更にもう少し付け加えたい点があります。 グループウェアから出力されるCSVファイルは、任意の期間を指定できるので、報告書の「月」には該当しない日付が「schedule.csv」に含まれている場合があります。 ですので、報告書のA列には一月の日付が記入されているので、報告書のA列と、CSVの「D列F列」を一つずつ年月日を照合して挿入するようにできないでしょうか? また、例えば開始日が 4/1 で 終了日が 5/8 の場合、4月の報告書に挿入する場合、4/1~4/30まで同じ内容で挿入したいのですが、今のままではまだできていません。 アレンジしたものを貼り付けます。 Private Sub CommandButton2_Click() Dim fName As String, orgDir As String If MsgBox("スケジュールを挿入します" & vbLf & _ "今月分スケジュールをダウンロードしましたか?", vbOKCancel + vbInformation, "確認") = vbCancel Then Exit Sub End If Const タイトル = "スケジュールの「csv」ファイルを選択してから、[開く]ボタンをクリックしてください。" Const ファイルの場所 = "C:" 'ファイルの場所 Const フィルタ1a = "CSV" 'ファイルの種類 Const フィルタ1b = "*.csv" 'ファイルの拡張子 orgDir = CurDir ChDir ファイルの場所 fName = Application.GetOpenFilename(フィルタ1a & "," & フィルタ1b, 1, タイトル) If fName <> "False" Then Workbooks.Open fName ブック名 = ActiveWorkbook.Name シート名 = ActiveSheet.Name Else MsgBox "[キャンセル]または[×]ボタンがクリックされました。", , "タイムカード注入" Exit Sub End If ChDir orgDir Windows(ブック名).Activate For Each shi In Sheets(シート名).Range("D3:" & Sheets(シート名).Range("D3").End(xlDown).Address) '開始日データ列(D列)にデータ入力されている分だけの繰り返し処理 For l = Day(shi.Value) To Day(shi.Offset(0, 2).Value) '開始日と終了日の差分の繰り返し処理 ThisWorkbook.Activate If Range("E4").Offset(l, 0).Value = "" Then Range("E4").Offset(l, 0).Value = shi.Offset(0, 4) Else Range("E4").Offset(l, 0).Value = Range("E4").Offset(l, 0).Value & "," & shi.Offset(0, 4) End If 'CSVデータの予定列(H列)の内容を報告書のE列に書き加え Next l Next shi End Sub また、お時間のあるときに教えていただければうれしく思います。 よろしくお願いいたします。