
sh1のB列に縦に最大31日分の曜日が並んでいます。この列から最初の1週間分の曜日を祝日を除いて切り取り、Sh2に貼り付けるコードを教えてください。
行を指定して貼り付ける下記コードだと、例として火曜日が祝日だった場合、次の1週間分のシートが月曜始まりにならないため、月曜から土曜までの行を指定し、無い曜日があっても次の1週間分のシートができるようにしたいのですが、、、
findを使って検索し、切り取っていくようなイメージにするには、どのようなコードになるか教えてください。
With Sheets("sh1")
.Range(.Cells(1, "A"), .Cells(6, "AA")).Copy _
Destination:=Sheets("sh2").Range("A1")
End With
2023/07/03 (月)
2023/07/05 (水)
2023/07/06 (木)
2023/07/07 (金)
2023/07/08 (土)
2023/07/10 (月)
2023/07/11 (火)
2023/07/12 (水)
・・・・・
・・・・・
_______________
【Sh1】
2023/07/03 (月)
2023/07/05 (水)
2023/07/06 (木)
2023/07/07 (金)
2023/07/08 (土)
________
【Sh2】
2023/07/10 (月)
2023/07/11 (火)
2023/07/12 (水)
・・・・・
・・・・・
_______
【sh3】
No.13ベストアンサー
- 回答日時:
どうも、こちらで確認した日付とあなたの環境の日付に齟齬が発生しているようです。
ソースを修正するためには、データ(日付)がどのようになっているかを正確に把握する必要があります。
>2023/07/03 (月)
>2023/07/04 (火)
>2023/07/05 (水)
>2023/07/06 (木)
>2023/07/07 (金)
>2023/07/08 (土)
この日付は、excelのsh1 B列をコピペしたものですか。それとも、手入力したものでしょうか。
2023/07/03と(月)の間に半角のスペースが1つありますが、それであってますか。(他の日付も同様)
又、(月)の後ろに半角又は全角の空白などがありませんか。
ありがとうございます。シリアル値にするため、日付をいじっていたことが原因でした。お手数をおかけし申し訳ございませんでした。
助かりました!
No.11
- 回答日時:
>sh2へ1行だけ
>2023/07/03 (月)の行が転記され、
>sh3へ
>2023/07/04 (火)
>2023/07/05 (水)
>2023/07/06 (木)
>2023/07/07 (金)
>2023/07/08 (土)
>が転記委されるのは何故でしょう?
こちらの環境では、
sh2へ
2023/07/03 (月)
2023/07/04 (火)
2023/07/05 (水)
2023/07/06 (木)
2023/07/07 (金)
2023/07/08 (土)
が転記されています。
Sh1のA1:B15の範囲を画像にしてアップしていただけませんでしょうか。
No.10
- 回答日時:
No9です。
もし、No9で、正常に動作した場合は、以下のことに注意してください。
sh1のB列の日付は、あなたが作成したのではなく、他の方が作成したということでしょうか。
そうであれば、今後も、今までと同じように日付を文字列で設定するように伝えてください。
もし、途中からシリアル日付を入力し、書式設定で曜日を表示するように変えてしまうと、マクロが動かなくなります。
No.9
- 回答日時:
>セル:B2の「2023/07/03 (月)」の書式設定は
>「標準」でした
日付は、文字列として設定されていると解釈しました。
2023/07/03 (月)から(月)を除いた"2023/07/03"の文字列を
シリアル日付に変換し、処理を行うようにしました。
前回のマクロは、全て破棄して、こちらを登録してください。
Option Explicit
Public Sub 週次シフト作成()
Dim ms As Worksheet
Dim ws As Worksheet
Dim sh_names As Variant
Dim maxrow As Long
Dim wrow As Long
Dim row2 As Long
Dim i As Long
Dim sx As Long
Dim wstr As String
Dim wday As Date
Dim stday As Date: stday = 0
Dim prevday As Date
Dim wendday As Date
Set ms = Worksheets("sh1")
maxrow = ms.Cells(Rows.Count, 2).End(xlUp).Row
sh_names = Array("sh2", "sh3", "sh4", "sh5", "sh6", "sh7")
For i = 0 To UBound(sh_names)
Set ws = Worksheets(sh_names(i))
ws.Cells.Clear
ms.Cells(1, 1).Resize(1, 27).Copy Destination:=ws.Cells(1, 1)
Next
For wrow = 2 To maxrow
wstr = ms.Cells(wrow, "B").Value
wstr = left(wstr, Len(wstr) - 3)
If IsDate(wstr) = False Then
Call error_proc("日付不正", ms, wrow)
End If
wday = CDate(wstr)
If Weekday(wday) = 1 Then
Call error_proc("日曜日不正", ms, wrow)
End If
If stday = 0 Then
stday = wday
prevday = stday - 1
wendday = wday + 7 - Weekday(wday)
sx = 0
row2 = 2
End If
If Year(wday) = Year(stday) And Month(wday) = Month(stday) Then
Else
Call error_proc("年、月不正", ms, wrow)
End If
If wday <= prevday Then
Call error_proc("日付順序不正", ms, wrow)
End If
If wday > wendday Then
wendday = wday + 7 - Weekday(wday)
sx = sx + 1
row2 = 2
If sx > UBound(sh_names) Then
Call error_proc("シート数オーバー", ms, wrow)
End If
End If
Set ws = Worksheets(sh_names(sx))
ms.Cells(wrow, 1).Resize(1, 27).Copy Destination:=ws.Cells(row2, 1)
row2 = row2 + 1
prevday = wday
Next
MsgBox ("完了")
End Sub
'エラー処理
Public Sub error_proc(ByVal err_msg As String, ByVal ms As Worksheet, ByVal wrow As Long)
MsgBox (err_msg)
ms.Activate
ms.Cells(wrow, "B").Select
End
End Sub
ありがとうございます。転記できました。
sh2へ1行だけ
2023/07/03 (月)の行が転記され、
sh3へ
2023/07/04 (火)
2023/07/05 (水)
2023/07/06 (木)
2023/07/07 (金)
2023/07/08 (土)
が転記委されるのは何故でしょう?
以降のシートはあ(月)~ (土)が転記されています?
ステップインしてみたところ、sh2へ2023/07/03 (月)の行を転記したあと、
ms.Cells(wrow, 1).Resize(1, 27).Copy Destination:=ws.Cells(row2, 1)
row2 = row2 + 1
でsh3へ移っていました。どのように変更したらよいかご教授いただけませんでしょうか。よろしくおねがいします。
No.7
- 回答日時:
No6です。
>B列の2行目から「2023/07/03 (月)」の形式で下に日付が並んでいるため、
>maxrow = ms.Cells(Rows.Count, 2).End(xlUp).Row
>としてみたところ、「日付不正」となりました。
>どこを修正したらよいか教えてください。
①maxrowについて
maxrow = ms.Cells(Rows.Count, 2).End(xlUp).Row
が正しいです。こちらで、試験時、A列とB列の行を同じにしておいたので、
ms.Cells(Rows.Count, 1)でも、動作してしまいました。
ms.Cells(Rows.Count, 2)に訂正いたします。
②「日付不正」の件
こちらでは、B列の日付は、以下の前提でマクロを作っています。
B列の日付はシリアル日付が設定され、セルの書式設定で
ユーザー定義で"yyyy/mm/dd(aaa)"を指定している。
そうすると、表示上 2023/07/01(土) のように表示されます。
B列の内容が日付として妥当か否かのチェックをしています。
If IsDate(ms.Cells(wrow, "B").Value) = False Then
Call error_proc("日付不正", ms, wrow)
End If
の箇所でエラーとなり、"日付不正"のメッセージが表示されます。
どのようにB列に日付を設定していますか?
(何か関数などを使っていれば、それも含めて提示してください)
ありがとうございます。セル:B2の「2023/07/03 (月)」の書式設定は
「標準」でした、ユーザー定義で"yyyy/mm/dd(aaa)"を指定したり、日付に変更してみましたが「シリアル値」ではないようなので転記できませんでした。予めB列をシリアル値へ変更しようとしましたが私の知識では無理でした。どのように変更したら良いか教えてください。
No.6
- 回答日時:
以下のマクロを標準モジュールに登録してください。
Option Explicit
Public Sub 週次シフト作成()
Dim ms As Worksheet
Dim ws As Worksheet
Dim sh_names As Variant
Dim maxrow As Long
Dim wrow As Long
Dim row2 As Long
Dim i As Long
Dim sx As Long
Dim wday As Date
Dim stday As Date: stday = 0
Dim prevday As Date
Dim wendday As Date
Set ms = Worksheets("sh1")
maxrow = ms.Cells(Rows.Count, 1).End(xlUp).Row
sh_names = Array("sh2", "sh3", "sh4", "sh5", "sh6", "sh7")
For i = 0 To UBound(sh_names)
Set ws = Worksheets(sh_names(i))
ws.Cells.Clear
ms.Cells(1, 1).Resize(1, 27).Copy Destination:=ws.Cells(1, 1)
Next
For wrow = 2 To maxrow
If IsDate(ms.Cells(wrow, "B").Value) = False Then
Call error_proc("日付不正", ms, wrow)
End If
wday = ms.Cells(wrow, "B").Value
If Weekday(wday) = 1 Then
Call error_proc("日曜日不正", ms, wrow)
End If
If stday = 0 Then
stday = wday
prevday = stday - 1
wendday = wday + 7 - Weekday(wday)
sx = 0
row2 = 2
End If
If Year(wday) = Year(stday) And Month(wday) = Month(stday) Then
Else
Call error_proc("年、月不正", ms, wrow)
End If
If wday <= prevday Then
Call error_proc("日付順序不正", ms, wrow)
End If
If wday > wendday Then
wendday = wday + 7 - Weekday(wday)
sx = sx + 1
row2 = 2
If sx > UBound(sh_names) Then
Call error_proc("シート数オーバー", ms, wrow)
End If
End If
Set ws = Worksheets(sh_names(sx))
ms.Cells(wrow, 1).Resize(1, 27).Copy Destination:=ws.Cells(row2, 1)
row2 = row2 + 1
prevday = wday
Next
MsgBox ("完了")
End Sub
'エラー処理
Public Sub error_proc(ByVal err_msg As String, ByVal ms As Worksheet, ByVal wrow As Long)
MsgBox (err_msg)
ms.Activate
ms.Cells(wrow, "B").Select
End
End Sub
ありがとうございます。学ぶべき箇所が多くありがたいです。
For i = 0 Toでシートを指定するのは初めてです。
お示しいただいたコードを実行したところ、「完了」となりましたがシートへの転記はありませんでした。B列の2行目から「2023/07/03 (月)」の形式で下に日付が並んでいるため、
maxrow = ms.Cells(Rows.Count, 2).End(xlUp).Row
としてみたところ、「日付不正」となりました。
どこを修正したらよいか教えてください。
よろしくお願いします。
No.5
- 回答日時:
以下のようにしたいということでしょうか。
1.Sh1の月間のシフト表を以下のように振り分ける。
①Sh2へ第1週の月~土のシフト表を転記
②Sh3へ第2週の月~土のシフト表を転記
③Sh4へ第3週の月~土のシフト表を転記
④Sh5へ第4週の月~土のシフト表を転記
⑤Sh6へ第5週の月~土のシフト表を転記
⑥Sh7へ第6週の月~土のシフト表を転記
但し、月がなければ火、なければ水...となり、
終了は同じ週の土で、土がなければ金、無ければ木...となる。
理論上6週まであるので、シートはSh7まで確保します。
2.Sh1の1行目は見出し行でしょうか。
それとも、データがいきなり1行目から開始でしょうか。
3.Sh1のA列が日付、B列が曜日でしょうか。
4.Sh2~Sh7へ転記するのは、A列~AA列で間違いないでしょうか。
5.Sh1の日付の年、月は、全て同じであり、他の年月の日付は存在しないと理解しました。間違いないでしょうか。
ありがとうございます。
1.のとおりです。
2.Sh1の1行目は見出し行になります。
3. Sh1のB列が日付(曜日)になっています。
4. Sh2~Sh7へ転記するのは、A列~AA列になります。
5. Sh1の日付の年、月は、全て同じです。
よろしくおねがいします。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 地球科学 太陽系の惑星と週(日曜日~土曜日)、月(1月~12月)に付いての質問です。 太陽系には、8つの惑星が 3 2022/10/08 22:32
- Visual Basic(VBA) 列 A に同じ日が2つが必要です。 1 2023/03/28 07:25
- Visual Basic(VBA) 集計シートA列のコードと一致する右に並んだシート名(コード)の3行目から10行目をコピーして貼り付け 4 2022/08/18 15:24
- その他(買い物・ショッピング) 24時間コスメのファンデーションを購入を18時10分頃に購入しました。 ご注文後、通常2~3日以内に 1 2023/05/27 18:46
- Visual Basic(VBA) 形式を選択して貼り付け 以下のコードで「元」シートと「先」シートのA列に同じ値があったら指定範囲をコ 5 2022/11/11 07:30
- その他(就職・転職・働き方) 祭日の所定労働時間 4 2023/04/26 12:00
- Visual Basic(VBA) VBA 毎日取得するデータを順番に反映していく方法 6 2023/08/26 16:22
- アルバイト・パート バイトが月、水、金、土入っていて、週2以上となっていて火曜から土曜の5日間休みが欲しくて、そうなると 3 2023/07/10 15:03
- Visual Basic(VBA) まとめシートから集計シートへA列のコードが一致したら1行コピーするマクロをネット上で見つけました。こ 1 2022/08/30 14:11
- 会社・職場 月曜日 8時間+1時間残業 火曜日 8時間+1時間残業 水曜日 8時間+1時間残業 木曜日 8時間+ 5 2023/03/26 15:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
VBA 空白行に転記する
-
Count Ifのセルの範囲指定に変...
-
VBA別シートの最終行の次行へ転...
-
マクロ実行後に別シートの残像...
-
EXCELのSheet番号って変更でき...
-
アクセスからエクセルへ出力時...
-
【VBA】データを各シートに自動...
-
VBAで質問ですが、皆さんはどの...
-
VBAで変数の数/変数名を動的に...
-
ExcelのVBAでグループ分けしたい
-
Excel VBA オートフィルターで...
-
VBA データ抽出 速度改善
-
vba 連続するとうまく作動せず
-
VBA シリアル値から月日への変換
-
FindNextがうまくいかない
-
VBA 実行時エラー1004 rangeメ...
-
VBAでのピボットテーブルの範囲...
-
VBA詳しい方、アドバイス願いま...
-
楽天RSSからエクセルVBAを使用...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXCELのSheet番号って変更でき...
-
マクロの「SaveAs」でエラーが...
-
マクロ実行後に別シートの残像...
-
VBA 空白行に転記する
-
VBA別シートの最終行の次行へ転...
-
Count Ifのセルの範囲指定に変...
-
【VBA】データを各シートに自動...
-
Changeイベントで複数セルへの...
-
VBAで変数の数/変数名を動的に...
-
VBA 別ブックからの転記の高速...
-
Excel VBA オートフィルターで...
-
【VBA】特定の条件でセルをコピー
-
VBAでEXCELから固定長...
-
Excel2013で切り取り禁止
-
Unionでの他のシートの参照につ...
-
楽天RSSからエクセルVBAを使用...
-
100万件越えCSVから条件を満た...
-
ExcelのVBマクロを、バックグラ...
-
VBA 実行時エラー1004 rangeメ...
-
同じ作業(データコピー・貼付...
おすすめ情報