
Excel2016 特定の曜日のみ表示するカレンダー(スケジュール表)を作成したいです。
添付のExcelファイルは、関数や表示形式の設定はしておりません。
下記の条件を満たす関数またはVBA(マクロ)のコードを、どなたか教えてください。
内訳
・添付ファイルでは、6月までしか表示されておりませんが、1つのシートに1月~12月まであります。
・A1の年度を変更したら、その年の各月の火曜日と木曜日の日にちのみを表示する。
・火曜日、または木曜日が祝日の場合は、繰り下げた日にちを表示する。
・会社の定休日は、土日祝日と12/31~1/3となります。
・同じブックの別シート(シート2)に、1年間の祝日と会社の定休日を入力し、名前の定義で「祝日等」にしております。
どうぞよろしくお願いいたします。

No.3ベストアンサー
- 回答日時:
あ”~~~!
細かい検証をしていませんでした。
今までのコードは消去し
↓のコードにしてください。
尚、よく確認してみると第6週目がある曜日は日・月までなので
今回の場合、火・木限定というコトは結局5週間だけの処理で良かったですね。
Sub Sample3()
Dim i As Long, k As Long, cnt As Long
Dim myDay As Date
Dim myR, myAry
With Worksheets("Sheet1")
myAry = Array("A4", "H4", "A12", "H12", "A20", "H20", "A28", "H28", "A36", "H36", "A44", "H44")
For k = 0 To UBound(myAry)
With .Range(myAry(k)).Offset(2).Resize(5)
.NumberFormatLocal = "d日"
.ClearContents
End With
With .Range(myAry(k)).Offset(2, 3).Resize(5)
.NumberFormatLocal = "d日"
.ClearContents
End With
.Range(myAry(k)).Offset(2, 3).Resize(5).ClearContents
cnt = 1
myR = .Range(myAry(k)).Offset(2).Resize(5, 4)
For i = 1 To Day(WorksheetFunction.EoMonth(DateSerial(.Range("A1"), k + 1, 1), 0))
myDay = DateSerial(.Range("A1"), k + 1, i)
If WorksheetFunction.Weekday(myDay) = 7 Then
cnt = cnt + 1
End If
If WorksheetFunction.Weekday(myDay) = 3 Then
If WorksheetFunction.Weekday(WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))) <> 5 Then
If Month(WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))) = k + 1 Then '//●//
myR(cnt, 1) = WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))
End If
End If
ElseIf WorksheetFunction.Weekday(myDay) = 5 Then
If WorksheetFunction.Weekday(WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))) <> 3 Then
If Month(WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))) = k + 1 Then '//●//
myR(cnt, 4) = WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))
End If
End If
End If
Next i
.Range(myAry(k)).Offset(2).Resize(5, 4) = myR
Next k
End With
End Sub
※ 「●」の部分を追加しています。
今度はどうでしょうか?m(_ _)m
完璧です。
こんなに迅速かつ親切にご対応いただきまして、本当にうれしいです。
tom04さんには、以前もご回答いただいております。
いつも、私の質問を見つけてくださって、本当にありがとうございました。
また、よろしくお願いいたします。
No.2
- 回答日時:
No.1です。
投稿後画像をもう一度よく見ると
第二火曜日は2行目!といった感じにしなくてはならないのですね。
そして、WORKDAY関数で火・木曜日を求めた場合
万一連休が続き火・木曜に重なる場合も考慮する必要があるようなので・・・
前回のコードはすべて消去し↓のコードに変更してください。
そして今回は6週にも対応しています。
Sub Sample2()
Dim i As Long, k As Long, cnt As Long
Dim myDay As Date
Dim myR, myAry
With Worksheets("Sheet1")
myAry = Array("A4", "H4", "A12", "H12", "A20", "H20", "A28", "H28", "A36", "H36", "A44", "H44")
For k = 0 To UBound(myAry)
With .Range(myAry(k)).Offset(2).Resize(6) '//★//
.NumberFormatLocal = "d日"
.ClearContents
End With
With .Range(myAry(k)).Offset(2, 3).Resize(6) '//★
.NumberFormatLocal = "d日"
.ClearContents
End With
.Range(myAry(k)).Offset(2, 3).Resize(6).ClearContents '//★/
cnt = 1
myR = .Range(myAry(k)).Offset(2).Resize(6, 4) '//★//
For i = 1 To Day(WorksheetFunction.EoMonth(DateSerial(.Range("A1"), k + 1, 1), 0))
myDay = DateSerial(.Range("A1"), k + 1, i)
'//▼ココから少し訂正//
If WorksheetFunction.Weekday(myDay) = 7 Then
cnt = cnt + 1
End If
If WorksheetFunction.Weekday(myDay) = 3 Then
If WorksheetFunction.Weekday(WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))) <> 5 Then
myR(cnt, 1) = WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))
End If
ElseIf WorksheetFunction.Weekday(myDay) = 5 Then
If WorksheetFunction.Weekday(WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))) <> 3 Then
myR(cnt, 4) = WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))
End If
End If
Next i
'//▲ココまで//
.Range(myAry(k)).Offset(2).Resize(6, 4) = myR '//★//
cnt = 1
Next k
End With
End Sub
今度はどうでしょうか?m(_ _)m
tom04 様
ご回答いただきまして、ありがとうございます。
修正いただきましたコードにて、早速実行入力、実行させていただきました。
第二火曜日の2行目、5月の大型連休も考慮したコードに修正いただいて、本当に感謝いたしております。
ただ、12月のカレンダーに翌年の1月1日が表示されてしまいます。
そちらについても、考慮していただくことは可能でしょうか?
No.1
- 回答日時:
こんばんは!
VBAになりますが、一例です。
尚、前提条件として、お示しのデータシート名は「Sheet1」とし
A1セルの書式設定は
ユーザー定義から
A1 → 0年
とし、単に2020という数値のみを入力しているとします。
標準モジュールです。
Sub Sample1()
Dim i As Long, k As Long, cnt As Long
Dim myDay As Date
Dim myR, myAry
With Worksheets("Sheet1")
myAry = Array("A4", "H4", "A12", "H12", "A20", "H20", "A28", "H28", "A36", "H36", "A44", "H44")
For k = 0 To UBound(myAry)
With .Range(myAry(k)).Offset(2).Resize(5) '//★//
.NumberFormatLocal = "d日"
.ClearContents
End With
With .Range(myAry(k)).Offset(2, 3).Resize(5) '//★
.NumberFormatLocal = "d日"
.ClearContents
End With
.Range(myAry(k)).Offset(2, 3).Resize(5).ClearContents '//★/
cnt = 1
myR = .Range(myAry(k)).Offset(2).Resize(5, 4) '//★//
For i = 1 To Day(WorksheetFunction.EoMonth(DateSerial(.Range("A1"), k + 1, 1), 0))
myDay = DateSerial(.Range("A1"), k + 1, i)
If WorksheetFunction.Weekday(myDay) = 3 Then
myR(cnt, 1) = WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))
ElseIf WorksheetFunction.Weekday(myDay) = 5 Then
myR(cnt, 4) = WorksheetFunction.WorkDay(myDay - 1, 1, Range("祝日等"))
cnt = cnt + 1
End If
Next i
.Range(myAry(k)).Offset(2).Resize(5, 4) = myR '//★//
cnt = 1
Next k
End With
End Sub
※ お示しの画像では1か月5週間限定となっているので
5行だけの操作にしていますが、まれに1か月が6週になる月もあるはずです。
6週間に対応するコードにしても良かったのですが、
画像の配置だと11行目・19行目・・・にデータがある場合そのデータも消えてしまいますので
画像通り5週間限定としています。
6週対応にしたい場合はコード内の「★」の行の
「5」を「6」に変更してみてください。m(_ _)m
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
VLOOKUP FALSEのこと
-
【関数】【マクロ】売上X円以上...
-
【マクロ 画像あり】Exact関数...
-
空白処理を空白に
-
同じ名前(重複)かつ 日本 ア...
-
エクセルでフィルターした値を...
-
エクセルシートの見出しの文字...
-
空白のはずがSUBTOTAL関数でカ...
-
excel
-
if関数の複数条件について
-
【マクロ】数式を入力したい。...
-
Excelで4択問題を作成したい
-
Excel 複数のセルが一致すると...
-
Excel 日付の表示が直せません...
-
表計算ソフトでの様式の呼称
-
【マクロ】既存ファイルの名前...
-
【マクロ】エラー【#DIV/0!】が...
-
【マクロ】実行時エラー '424':...
-
エクセルの文字数列関数と競馬...
-
エクセルに写真が貼れない(フ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
金土祝前って、日曜は入るんで...
-
LibreOffice Clalc(またはエク...
-
案内状に記載する日付の書き方
-
訪問ヘルパーさんがどうしても...
-
土曜は平日?
-
Excel 2ヶ月後の日付(土日祝...
-
電子カレンダーで日本の祝日に...
-
12月23日が31年ぶりに平日に
-
Excel2016 特定の曜日のみ表示...
-
特定休日とは?? 現在、私の会...
-
Find関数で日付を検索した時に...
-
EXCEL関数(土日祝日自動色分け)
-
2019年11月2日、3日、4日三日間...
-
エクセルで平日を求める式
-
九月のカレンダーの祭日を黒く...
-
政府は祝日をずらしたり、作っ...
-
前月の条件に合った日にちの指定
-
活気なくなりましたね
-
祝日
-
土日祝を除いた、ある一定期間...
おすすめ情報
tom04 様
ご回答いただきまして、ありがとうございます。
修正いただきましたコードにて、早速実行入力、実行させていただきました。
第二火曜日の2行目、5月の大型連休も考慮したコードに修正いただいて、本当に感謝いたしております。
ただ、12月のカレンダーに翌年の1月1日が表示されてしまいます。
そちらについても、考慮していただくことは可能でしょうか?