作ってるもの
エクセルを読み込んで下図のようにデータを抽出するコードを書きました。
データは読み込むと「データ」シートの左から順に埋まっていきます。
先ほどのデータを「1月」シートで利用しています。
時間帯別の数量がE列で計算されていきます。
日付が下にいくに連れて計算式は「データ」の$A→$B→$Cとなってます。
日付には条件付き書式で
「=WEEKDAY($A5,2)>= 6」で灰色の網掛けをしています。
###やりたいこと
①土曜または日曜のE列にある計算式は無し。スキップして次の日付からまたCOUNTIFSの計算をしたい。
例:
金曜:$A → 土曜:$B → 日曜:$C これを
金曜:$A → 月曜:$B → 火曜:$C(土日スキップ)こうしたい
②翌月シートを作ったときには翌月用のデータから読み込めるようにしたい。(「データ」1シートで1月分)
また、翌月作成ボタンを押した時には日付列の日付も更新されてほしい。
データのコード
Dim export 'Excelファイルのシート名を入れ込む変数' Dim Exe_Import_File 'Excelファイルに取り込むCSVファイルの名前を入れ込む変数' export = ActiveSheet.Name '現在アクティブなシート名を変数 export に入れ込む' Exe_Import_File = Application.GetOpenFilename("ブック, *.xls") 'エクセルファイルを選択する' If Exe_Import_File = "False" Then Exit Sub 'キャンセルなら終了' '画面更新の非表示 Application.ScreenUpdating = False '新しいシートとしてシートの最後にコピー、挿入 Worksheets().Add After:=Worksheets(Worksheets.Count) ActiveSheet.Name = "受付履歴" Application.DisplayAlerts = False Sheets("データ").Visible = True With Workbooks.Open(Exe_Import_File) .Sheets(1).Cells.Copy ThisWorkbook.Sheets("受付履歴").Range("A1") '全てのデータをこのブックの「受付履歴」シートにコピー' .Close 'ファイルを閉じる' End With 'BとCの間に列を挿入 Columns("C").Insert Columns("F").Insert '発注依頼日を日付と時間に分ける 'B列の9以降を選択、区切り位置でハイフンで区切る Range(Range("B9"), Cells(Rows.Count, 2).End(xlUp)).Select Selection.TextToColumns Destination:=Range("B9"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _ :=" ", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True Application.DisplayAlerts = False 'ドーナツ、コーヒー、ケーキを抽出するために分割 Range(Range("E9"), Cells(Rows.Count, 5).End(xlUp)).Select Selection.TextToColumns Destination:=Range("E9"), DataType:=xlDelimited, _ TextQualifier:=xlDoubleQuote, ConsecutiveDelimiter:=False, Tab:=True, _ Semicolon:=False, Comma:=False, Space:=False, Other:=True, OtherChar _ :=" ", FieldInfo:=Array(Array(1, 1), Array(2, 1)), TrailingMinusNumbers:=True Application.DisplayAlerts = False 'ドーナツ、コーヒー、ケーキを消すための変数宣言 Dim i As Long Dim LstRow As Long Dim Code As String '最終行の取得 'Cellの中の「5」は5列目の行(コードの列)を指す LstRow = Cells(Rows.Count, 5).End(xlUp).Row '繰り返し処理 For i = LstRow To 1 Step -1 Code = Cells(i, 5).Value '削除したいコードを""の中に入れる。//コード汚い If Code = "ドーナツ" Then Rows(i).Delete End If If Code = "コーヒー" Then Rows(i).Delete End If If Code = "ケーキ" Then Rows(i).Delete End If Next 'F列の削除 Columns("F").Delete '時間内で人数をカウント。※人数だけ 'C列で重複しているものは削除 Dim a As Long With Range("C9") For a = .CurrentRegion.Rows.Count To 1 Step -1 If .Offset(a, 0) = .Offset(a - 1, 0) Then .Offset(a, 0).EntireRow.Delete Next a End With '受付履歴の時間を"データ"シートに保存しておく Range("B9").Copy Range("C8").Select ActiveSheet.Paste Range(Range("C8"), Cells(Rows.Count, 3).End(xlUp)).Copy ThisWorkbook.Sheets("データ").Cells(1, Columns.Count).End(xlToLeft).Offset(, 1) 'B9を"基"シートのA列最終行にペーストしていきたい Sheets("受付履歴").Delete '"データ"を非表示にしておく 'Sheets("データ").Visible = False Sheets(1).Select
翌月シート作成のコード
'バックグラウンドで作動 Application.ScreenUpdating = False Dim i As Integer '最後のシートをコピーしその後ろに追加 Sheets(Sheets.Count).Copy After:=Sheets(Sheets.Count) '名前を変更 i = Left(Sheets(Sheets.Count - 1).Name, Len(Sheets(Sheets.Count - 1).Name) - 1) Sheets(Sheets.Count).Name = IIf(i + 1 > 12, 1, i + 1) & "月" Range("G5:G345").ClearContents
説明が難しくごちゃごちゃとしてしまいましたが、
どなたかお力添え頂けると幸いです…
宜しくお願い致します。

回答2件
あなたの回答
tips
プレビュー