• ベストアンサー

済みません。追加質問です(EXCEL2000使用)

"土・日・祝日・水曜日"抜きのカレンダー作成に、詰まってしまいました。 B5に5月を入れると、B7から5月の土日祝日水曜日を抜いたカレンダーの日にちが 表示されるように関数で持って行くことは出来ませんか。 よろしくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • tom04
  • ベストアンサー率49% (2537/5117)
回答No.3

こんばんは! 一例です。 ↓の画像のように下準備が必要です。 まず、今年の祝日データをシリアル値でF列に作成しておきます。 そしてI2セル(セルの表示形式はユーザー定義からdとして)に =IF(MONTH(DATE($B$4,$B$5,ROW(A1)))=$B$5,DATE($B$4,$B$5,ROW(A1)),"") J2セルに =TEXT(I2,"aaa") という数式を入れ、I2・J2セルを範囲指定 → J2セルのフィルハンドルで3下へ31日目までオートフィルでコピーしておきます。 G2セルには =IF(COUNTIF($J$2:$J$32,"水")<ROW(A1),0,INDEX($I$2:$I$32,SMALL(IF($J$2:$J$32="水",ROW($A$1:$A$31)),ROW(A1)))) これは配列数式になりますので、Shift+Ctrlキーを押しながらEnterキーで確定し 祝日データと同じ行数だけオートフィルでコピーしておきます。 最後に B7セル(セルの表示形式は日付)に =IF(MONTH(WORKDAY(DATE($B$4,$B$5,ROW($A$1))-1,ROW(A1),$F$2:$G$16))=$B$5,WORKDAY(DATE($B$4,$B$5,ROW($A$1))-1,ROW(A1),$F$2:$G$16),"") C7セル(セルの表示形式はユーザー定義から (aaa)としておく)に =IF(B7="","",B7) としてB7・C7セルを範囲指定 → C7セルのフィルハンドルで下へコピー! で画像のような感じになります。 尚、WORKDAY関数を使用するにあたり メニュー → ツール → アドイン → 「分析ツール」にチェックを入れておく必要があります。 以上、参考になれば良いのですが・・・m(_ _)m

7MissShots
質問者

お礼

表まで付けていただき、わかりやすく助かりました。

その他の回答 (5)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.6

常連の方の回答が既に出ています。 この問題は関数だけでやろうとすると式が複雑になるように思う。 (1)VBAででもやらないと、やりにくい課題のように思う。 (2)1つは月中の日を全て作業列に持って、除外する日の右セルにでも除外サインを作れば、あとは除外サインの無い行の抜き出し問題になる。抜き出し問題もエクセル関数では難しいが。 (3)質問者は初心者と思うが、無理しないで、土日水を除いた日々なら下記で出来るので、それをつくり 祝日、会社休業日などはセルに色でも付けるか休日というコメントを付けて我慢したらどうです。 質問者は好まないかもしれないが、参考に 例えばG2:I8に ーーーーG列 ーーーーI列 日 1 1 月 2 1 火 3 2 水 4 0 木 5 1 金 6 3 土 7 0 とテーブルを作っておく ーー A1にはッ月初めの土・日・水意外の第1日を入れる。 2011/7/1 金でOK A2セルに =A1+VLOOKUP(WEEKDAY(A1),$H$2:$I$8,2,FALSE) ト入れて下方向に式複写。 結果 2011/7/1 2011/7/4 2011/7/5 2011/7/7 2011/7/8 2011/7/11 2011/7/12 2011/7/14 2011/7/15 2011/7/18 2011/7/19 2011/7/21 2011/7/22 2011/7/25 2011/7/26 2011/7/28 2011/7/29 2011/8/1 18日は祝日だが 祝日テーブルからVLOOKUPで検索してB列に祝日と入れる。または色を変える。 ーーー VBAでもやってみた G2:J8に 日 1 1 1 月 2 0 火 3 0 水 4 1 1 木 5 0 金 6 0 土 7 1 2 を作る。飛ばす日と、次の日までの日数を表にした。 祝日と会社休業日を表にする。下記は7月分だけ。 2011/7/18   1 2011/7/22   1 ' 会社休業日のつもり 標準モジュールに Sub test02() Dim myr As Variant tuki = 7 z = DateSerial(2011, tuki, 1) '1日 i = 1 '1行目 Do If WorksheetFunction.VLookup(Weekday(z), Range("H2:I8"), 2, False) = 0 Then Else z = z + WorksheetFunction.VLookup(Weekday(z), Range("H2:j8"), 3, False) If Month(z) <> tuki Then Exit Sub End If Set myr = Range("h10:h11").Find(z) If myr Is Nothing Then Cells(i, "B") = z z = z + 1 i = i + 1 Else z = z + 1 End If Loop While Month(z) = tuki End Sub ト入れて実行する。 結果はB列。 2011/7/1 金 2011/7/4 月 2011/7/5 火 2011/7/7 木 2011/7/8 金 2011/7/11 月 2011/7/12 火 2011/7/14 木 2011/7/15 金 2011/7/19 火 2011/7/21 木 2011/7/25 月 2011/7/26 火 2011/7/28 木 2011/7/29 金 会社休業日2011/7/22はスキップされています。 十分テストできてないが参考まで。 ーー 8月のテスト 会社盆休み(仮定)を入れて 2011/7/18 '祝日 2011/7/22 '会社休業日a 2011/8/15 '盆休み 2011/8/16 2011/8/17 2011/8/18 としてSet myr = Range("h10:h15").Find(z) にしてやると 2011/8/1 月 2011/8/2 火 2011/8/4 木 2011/8/5 金 2011/8/8 月 2011/8/9 火 2011/8/11 木 2011/8/12 金 2011/8/19 金 2011/8/22 月 2011/8/23 火 2011/8/25 木 2011/8/26 金 2011/8/29 月 2011/8/30 火

7MissShots
質問者

お礼

VBAがあまり出来ませんが、今回挑戦してみます。 ありがとうございました。

noname#204879
noname#204879
回答No.5

何処への「追加」か明記しない限り、「追加質問です」なんてな書き込みは無駄なこと! 添付図参照 Sheet2 において、 A1: 空白 A2: =DATE(Sheet1!B$4,Sheet1!B$5,ROW(A1)) 範囲 D2:D17 に休日の日付を入力 B2: =IF(NETWORKDAYS(A$2,A2,D$2:D$17),IF(OR(MOD(A2,7)=4,NETWORKDAYS(A$1,A2,D$2:D$17)=NETWORKDAYS(A$1,A1,D$2:D$17)),"",IF(MONTH(A2)=MONTH(A$2),A2,"")),"") 範囲 A2:B2 を下方にズズーッとドラッグ&ペースト Sheet1 において、 mm/dd に書式設定したセル B7 に次式を入力   =IF(ROW(A1)>COUNT(Sheet2!B:B),"",SMALL(Sheet2!B:B,ROW(A1))) "("aaa")"に書式設定したセル C7 に式 =B7 を入力 範囲 B7:C7 を下方にズズーッとドラッグ&ペースト

7MissShots
質問者

お礼

表題をよく考えてみます。ありがとうございました。

  • KURUMITO
  • ベストアンサー率42% (1835/4283)
回答No.4

土・日を除く日付はWORKDAY関数で対応できますが祝日や水曜日ととなりますと、これらを一緒にして祝日と同じとして扱うことでWORKDAY関数を使うことができます。 祝日や水曜日の日付については例えばシート2のAおよびB列にその表を作成することにして例えばA1セルには西暦年の2011を、A2セルには前のご質問で述べたように水曜日ですので4と入力します。 B1セルから下方に2011年の祝日などをB19セルまでに入力するとして、B20セルから下方には前のご質問で答えたようにB20セルに次の式(前の式とは若干違っています)を入力して下方にオートフィルドラッグします。 =IF(YEAR(DATE(A$1,1,1)+A$2-WEEKDAY(DATE(A$1,1,1))+IF(WEEKDAY(DATE(A$1,1,1))>A$2,ROW(A1)*7,(ROW(A1)-1)*7))=A$1,DATE(A$1,1,1)+A$2-WEEKDAY(DATE(A$1,1,1))+IF(WEEKDAY(DATE(A$1,1,1))>A$2,ROW(A1)*7,(ROW(A1)-1)*7),"") これでシート2のB列には祝日や水曜日の日付が表示されます。 そこでお求めの表ですがシート1のB4セルに2011、B5セルには5を入力し、B7セルには次の式を入力して下方にオートフィルドラッグします。 =IF(MONTH(WORKDAY(DATE(B$4,B$5,1),ROW(A1),Sheet2!B$1:INDIRECT("Sheet2!B"&MATCH(10^10,Sheet2!B:B))))<>B$5,"",WORKDAY(DATE(B$4,B$5,1),ROW(A1),Sheet2!B$1:INDIRECT("Sheet2!B"&MATCH(10^10,Sheet2!B:B)))) C7セルには次の式を入力して下方にオートフィルドラッグします。 =TEXT(B7,"(aaa)")

7MissShots
質問者

お礼

他の方法もあったのですね。勉強になります。 ありがとうございました。

  • keithin
  • ベストアンサー率66% (5278/7941)
回答No.2

祝祭日を除外したい場合,エクセルは日本の祝日を知らないので別にリストアップしておいて,これが除外日だよと教えてやる必要があります。たとえばシート2のA1以下に。 すると結局今回のご質問では,水曜日も会社の休日で祝祭日と同じ扱いで構わないので,シート2のA20以下に一つ前のご質問で教わっていた方式で水曜日一覧をずらり並べておきます。 準備: ツールメニューのアドインで分析ツールのチェックを入れる 基本的な数式の作成: B4に年 B5に月 B7セルに =WORKDAY(DATE($B$4,$B$5,0),ROW(B1),Sheet2!$A$1:$A$100) と記入し,下向けにコピー。

7MissShots
質問者

お礼

少し簡単になったようで助かります。ありがとうございました。

  • Cupper-2
  • ベストアンサー率29% (1342/4565)
回答No.1

答えを書くと質問者さんは大満足なのでしょうが、それでは問題解決力が付かないので 本当の意味での解決には至らないと思います。 ですので、アドバイスに留めさせていただきます。 ・WEEKDAY関数を使うと曜日を判定できます。 ・祝日の一覧を作成して VLOOKUP関数などで参照し、該当があれば祝日と判断できます。  (一覧は年月日で作成しましょう。月日だけでは一致しないことがあります) こういった方法を組み合わせてみてください。 自身で考え、試行錯誤することで、条件が変わっても対処できるようになります。 がんばってください。

7MissShots
質問者

お礼

済みません。ありがとうございます。

関連するQ&A