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で質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
マクロ実行後に別シートの残像...
-
マクロの「SaveAs」でエラーが...
-
VBA 空白行に転記する
-
EXCELのSheet番号って変更でき...
-
Changeイベントで複数セルへの...
-
VBA別シートの最終行の次行へ転...
-
ExcelのVBマクロを、バックグラ...
-
Count Ifのセルの範囲指定に変...
-
100万件越えCSVから条件を満た...
-
別シートから年齢別の件数をカ...
-
VBAでのピボットテーブルの範囲...
-
VBA 別ブックからの転記の高速...
-
【VBA】特定の条件でセルをコピー
-
楽天RSSからエクセルVBAを使用...
-
グラフマクロで系列を変数にす...
-
ExcelのVBAでグループ分けしたい
-
【VBA】データを各シートに自動...
-
Excel2013で切り取り禁止
-
VBAで変数の数/変数名を動的に...
-
GASでチェックボックスを一括of...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
マクロの「SaveAs」でエラーが...
-
EXCELのSheet番号って変更でき...
-
VBA 空白行に転記する
-
マクロ実行後に別シートの残像...
-
VBA別シートの最終行の次行へ転...
-
Changeイベントで複数セルへの...
-
Count Ifのセルの範囲指定に変...
-
ExcelのVBマクロを、バックグラ...
-
VBA 実行時エラー1004 rangeメ...
-
VBAで変数の数/変数名を動的に...
-
VBA 別ブックからの転記の高速...
-
Excel VBA オートフィルターで...
-
100万件越えCSVから条件を満た...
-
複数シートの複数列に入力され...
-
【VBA】特定の条件でセルをコピー
-
Excel2013で切り取り禁止
-
楽天RSSからエクセルVBAを使用...
-
アクセスからエクセルへ出力時...
-
グラフマクロで系列を変数にす...
-
FindNextがうまくいかない
おすすめ情報