No.1ベストアンサー
- 回答日時:
<質問から推定される要件>
1. シート2のB列の日付("末日")を上から順番に検査する
2. "末日"から6日間さかのぼった日("初日")の日付を求める
3. シート1のB列の日付を上から順に検査し、その日付が"初日"から"末日"の
間であれば、その行のC列の値を"合計"に加算する。.
4. シート2のC列に"合計"を入力する
5. シート2上に設けたコマンドボタンを押して、以上の処理を開始する
<手順>
1. 下のコードを標準モジュールに貼り付ける
2. シート2にコマンドボタンを配置する
[開発] - [挿入] - [フォームコントロール] - [ボタン]
3. 2で配置したボタンを右クリックし、[マクロの登録]で
"週ごとに集計して転記"を指定する
<コードの例>
'************************************************
'(注意)
'シート1のデータが日付昇順になっていない場合を考慮し、
'必ず先頭行から最終行まで検査するので、行数が多くなると時間がかかる
'************************************************
Public Sub 週ごとに集計して転記()
Const 履歴シート As String = "Sheet1"
Const 合計シート As String = "Sheet2"
Const 日付範囲1 As String = "B3:B33"
Const 日付範囲2 As String = "B3:B10"
Const 日付列から金額列までの距離 As Integer = 1
Const 日付列から合計列までの距離 As Integer = 2
Dim dateRng1 As Range, dateRng2 As Range
Set dateRng1 = ThisWorkbook.Sheets(履歴シート).Range(日付範囲1)
Set dateRng2 = ThisWorkbook.Sheets(合計シート).Range(日付範囲2)
Dim r1 As Range
For Each r1 In dateRng2
If Not IsDate(r1.Value) Then Exit For
Dim ed As Date: ed = r1.Value
Dim st As Date: st = DateAdd("d", -6, ed)
Dim r2 As Range, sum As Long
For Each r2 In dateRng1
If r2.Value >= st And r2.Value <= ed Then
sum = sum + r2.Offset(0, 日付列から金額列までの距離).Value
End If
Next
r1.Offset(0, 日付列から合計列までの距離) = sum
sum = 0
Next
End Sub
No.3
- 回答日時:
No.1 からの修正
<手順>
1. 下のコードを標準モジュールに貼り付ける
2. シート2にコマンドボタンを配置する
[開発] - [挿入] - [フォームコントロール] - [ボタン]
3. 2で配置したボタンを右クリックし、[マクロの登録]で
"転記"を指定する
<コードの例>
Public Sub 転記()
Const 履歴シート As String = "Sheet1"
Const 日付検査範囲 As String = "B3:B33"
Const 転記先シート As String = "Sheet2"
Const キー日付範囲 As String = "B3:B9"
Dim dateRng1 As Range, dateRng2 As Range
Set dateRng1 = ThisWorkbook.Sheets(履歴シート).Range(日付検査範囲)
Set dateRng2 = ThisWorkbook.Sheets(転記先シート).Range(キー日付範囲)
'キー日付範囲 を 1つずつ検査
Dim r As Range
Dim st As Long: st = 1 '検査開始行
For Each r In dateRng2
'当該行の金額入力範囲をクリア
Dim c As Integer: For c = 1 To 7: r.Offset(0, c) = "": Next
'キー日付セルの値が日付データでなければループを抜ける
If Not IsDate(r.Value) Then Exit For
'日付検査範囲 を 1つずつ検査
Dim i As Long
For i = st To dateRng1.Rows.Count
'検査中のセルの値が日付データなら
If IsDate(dateRng1.Item(i)) Then
Dim keyDate As Date: keyDate = r.Value 'キー日付
Dim thisDate As Date: thisDate = dateRng1.Item(i) '検査中の日付
'検査中の日付がキー日付と同じ週に属する場合
If InSameWeek(keyDate, thisDate) Then
'キー日付の行、該当曜日の列に金額を転記する
r.Offset(0, Weekday(thisDate)) = dateRng1.Item(i).Offset(0, 1)
'この日が週の末尾(土曜日)なら
If Weekday(thisDate, vbSunday) = 7 Then
'1つ下の行を次の検査開始行にしてiループを抜ける
st = i + 1: Exit For
End If
End If
End If
Next i
Next
End Sub
'二つの日付が同じ週に属するか否かを返す
Public Function InSameWeek(date1 As Date, date2 As Date) As Boolean
Dim diff As Integer
diff = Weekday(date2, vbSunday) - 1
If date1 = DateAdd("d", -diff, date2) Then
InSameWeek = True
End If
End Function
No.2
- 回答日時:
No.1 からの修正
<手順>
1. 下のコードを標準モジュールに貼り付ける
2. シート2にコマンドボタンを配置する
[開発] - [挿入] - [フォームコントロール] - [ボタン]
3. 2で配置したボタンを右クリックし、[マクロの登録]で
"転記"を指定する
<コードの例>
'************************************************
'(注意)
' セル内のデータが日付かどうかのチェックは行わない
' Sheet2のB列には日付が一つずつ連続して入力されおり、抜けや重複がないものとする
'************************************************
Public Sub 転記()
Const 履歴シート As String = "Sheet1"
Const 転記先シート As String = "Sheet2"
Const 日付範囲1 As String = "B3:B29"
Const 日付範囲2 As String = "B3:B9"
Dim dateRng1 As Range, dateRng2 As Range
Set dateRng1 = ThisWorkbook.Sheets(履歴シート).Range(日付範囲1)
Set dateRng2 = ThisWorkbook.Sheets(転記先シート).Range(日付範囲2)
Dim r1 As Range
For Each r1 In dateRng2
Dim i As Long
For i = 1 To dateRng1.Rows.Count
If dateRng1.Item(i) = r1.Value Then
Dim c As Long
For c = 0 To 6
r1.Offset(0, c + 1) = dateRng1.Item(i).Offset(c, 1)
Next
i = i + 7
If i > dateRng1.Rows.Count Then Exit For
End If
Next
Next
End Sub
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- Excel(エクセル) エクセルで”入力シート”の文字書式の変更を”出力シート”で同じ文字書式で印刷したいです。VBA希望 4 2023/04/24 11:07
- Excel(エクセル) vba 同じブック内での転記について 4 2023/01/15 14:42
- Excel(エクセル) Excelで、別シートの表のステータスに伴った動的な自動転記をしたいです。 2 2023/06/14 15:56
- Visual Basic(VBA) 【VBA】データを入力後に,同一シート内に履歴として転記するVBAコードを教えていただきたいです。 3 2022/11/16 01:37
- Excel(エクセル) ユーザー定義について質問です。 2 2023/06/28 13:21
- Visual Basic(VBA) 2つの条件に合うセルにデータを転記したい 4 2022/12/02 11:05
- Visual Basic(VBA) 【VBA】指定した検索条件に一致したら別シートに転記したい 2 2022/03/23 16:14
- Excel(エクセル) Excelについて 1 2023/03/06 10:26
- Excel(エクセル) 添付写真上のExcelシートのように時間と曜日ごとに担当者が振り分けられているシートがあります。 例 1 2023/03/08 13:02
- Excel(エクセル) セルによって印刷するシートを変える方法 EXCEL-VBA 2 2022/08/01 20:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
マクロ実行後に別シートの残像...
-
Count Ifのセルの範囲指定に変...
-
EXCELのSheet番号って変更でき...
-
100万件越えCSVから条件を満た...
-
Unionでの他のシートの参照につ...
-
VBA 空白行に転記する
-
複数シートの複数列に入力され...
-
Changeイベントで複数セルへの...
-
エクセル 複数シートの同一セ...
-
Excel VBA オートフィルターで...
-
RemoveDuplicatesメソッドにつ...
-
VBAで変数の数/変数名を動的に...
-
グラフマクロで系列を変数にす...
-
VBA 最終行を選んだシートにコ...
-
VBAでEXCELから固定長...
-
VBA別シートの最終行の次行へ転...
-
ExcelのVBマクロを、バックグラ...
-
【VBA】特定の条件でセルをコピー
-
VBAコードについて
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
VBA 空白行に転記する
-
EXCELのSheet番号って変更でき...
-
マクロ実行後に別シートの残像...
-
VBA 別ブックからの転記の高速...
-
VBA別シートの最終行の次行へ転...
-
【VBA】特定の条件でセルをコピー
-
Count Ifのセルの範囲指定に変...
-
100万件越えCSVから条件を満た...
-
楽天RSSからエクセルVBAを使用...
-
VBAコードについて
-
Changeイベントで複数セルへの...
-
VBAで変数の数/変数名を動的に...
-
Excel2013で切り取り禁止
-
グラフマクロで系列を変数にす...
-
VBA 実行時エラー1004 rangeメ...
-
ExcelのVBマクロを、バックグラ...
-
Unionでの他のシートの参照につ...
-
Excel VBA オートフィルターで...
-
アクセスからエクセルへ出力時...
おすすめ情報
ご丁寧にありがとうございます。
私の言葉不足だったのですが、シート2は以下のようになっています。
(B) (C)(D)(E) (F) (G) (H) (I)
ㅤㅤㅤㅤㅤㅤ 日 月 火 水 木 金 土
(3)2019/12/29
(4)2020/1/5
()内はセルの縦列と横列です。
シート1の2020/1/1に使った2000円をシート2の(F.3)に入れたいです。
シート1の日付に応じた金額をシート2に入れたいです。説明が分かりにくくてすみません。
折角長文で丁寧に送って下さったのにすみません。このような場合はどうしたらいいのでしょうか?
ありがとうございます。
プログラムを実行することができました。
ワークシート1が2020/1/1からのデータが書いてあるのですが、ワークシート2のB3は2019/12/29なので、2020/1/1〜2020/1/4までに数値が入っていません。どうしたら良いのでしょうか?