- 締切済み
エクセルの作成(日にち入力)について
A1に1と入力すると、B列に1月の1日から31日までの土曜・日曜・祝祭日(休日)を除いた日、 A1に2と入力すると、B列に2月の1日から28、29日まで土曜・日曜・祝祭日(休日)を除いた日のように、 A1に月の数(1~12)を入力すると、その月の土曜・日曜・祝祭日(休日)を除いた日を表示させたいのですが、 可能でしょうか。 可能であれば、どのように作成すれば良いのか教えて頂きたいと思います。 よろしくお願いします。
- みんなの回答 (8)
- 専門家の回答
みんなの回答
- Wendy02
- ベストアンサー率57% (3570/6232)
rin01 さん、こんばんは。 Wendy02です。 質問主さんに、ここをお借りして、少し回答をよせておきます。 >検証もせず、いい加減な回答をしてしまってゴメンナサイ!! いいえ。それは、最初の日だけの問題なので、その出だしの数日間だけを別処理すればよいのではないでしょうか?私の書いた配列数式は、現実的ではありませんし、実用度は低いと思います。ただ、違ったものを考えただけですから。 >Wendy02さんは、以前、Q&Aで色々教えて頂いた >Wendyさんでしょうか? rinさんのお名前は、記憶にあります。あの頃の私と、今の私では、かなり違いがあるかもしれません。かなり手広く VBA に手を出すようになりました。VBAは、卒業だとは思っていても、つい書いてしまいます。 Niiさんがお書きになっていたので、公開する予定はありませんでしたが、このまま回答がないといけませんので、私の考えた、ユーザー定義関数を出しておきます。 数式は、このように書きます。D1:D16 に、祭日データを置きます。 =myWorkdays(Year(Now()),$A$1,ROW(A1),$D$1:$D$16) myWorkdays(年,月,1日から何番目, 祭日データ) 数式は、このようにして、フィルダウン・コピーします。祭日データは、既存のデータをシリアル値で、セルに書いてください。 標準モジュールに設定します。 '--------------------------------------------------------------------- Function myWorkdays(ByVal iYear As Integer, _ ByVal iMonth As Integer, _ Optional ByVal idx As Variant, _ Optional ByVal rHoliday As Range, _ Optional ByVal iWkEnd As Integer = 6) As Variant '使い方: 'myWorkdays(年,月,[インデックス],[祭日データ],[オプション]) 'インデックス: 月の初めから何番目-数字 '祭日データ: 祭日データをシリアル値で、セルの範囲に入れる 'ウィークエンドオプション:通常ナシ、6以外の数字を入れると土曜日が入る Dim arDates() As Date Dim rHolidays() As Variant Dim i As Integer, j As Integer, n As Integer Dim c As Range Dim dummy As Variant If Not rHoliday Is Nothing Then '祭日データを1次元に変換 For Each c In rHoliday If VarType(c.Value2) = vbDouble Then If IsError(CDate(c.Value)) = False Then ReDim Preserve rHolidays(n) rHolidays(n) = c.Value2 n = n + 1 End If End If Next c End If '祭日データの配列が成り立たない場合ダミーを作る On Error Resume Next dummy = UBound(rHolidays) If Err.Number > 0 Then ReDim rHolidays(0) rHolidays(0) = 0 End If On Error GoTo 0 If iWkEnd <> 6 Then iWkEnd = 7 '土曜オプション For i = 1 To Day(DateSerial(iYear, iMonth + 1, 0)) If Weekday(DateSerial(iYear, iMonth, i), vbMonday) < iWkEnd Then If UBound(Filter(rHolidays(), CLng(DateSerial(iYear, iMonth, i)))) < 0 _ Then ReDim Preserve arDates(j) arDates(j) = DateSerial(iYear, iMonth, i) j = j + 1 End If End If Next i If IsMissing(idx) Then myWorkdays = arDates(0) ElseIf idx - 1 > UBound(arDates) Then myWorkdays = "" Else myWorkdays = arDates(idx - 1) End If End Function '---------------------------------------------------------------------
- rin01
- ベストアンサー率43% (33/76)
Rinで~す。。♪ >1日が土曜日・日曜日、祭日の場合、例えば、06年1 >月,4月,7月,10月のような場合は、最初の日が成り立ち>ませんから Wendy02さんの 書かれている通りでした。 検証もせず、いい加減な回答をしてしまって ゴメンナサイ!! 私の回答は無視してください。 関係ないレスですみませんが Wendy02さんは、以前、Q&Aで色々教えて頂いた Wendyさんでしょうか? もしそうでしたら、大変嬉しいのですが~。。。 ホントに、関係ないレスでゴメンナサイ。。。Rin
- Nii
- ベストアンサー率48% (79/162)
No.5のPublic Function 平日(月 As Long) As Long ~ 最初のEnd Function迄は無視で^^; A1に月を入力した後、ボタンをクリックする必要はありませが、これでどうでしょう? Private Sub CommandButton1_Click() Dim 日 As Date Dim 月 As Long Dim 日数 As Long Dim セル As Long 月 = Cells(1, 1).Value セル = 1 For 日 = DateSerial(2006, 月, 1) To (DateSerial(2006, 月 + 1, 1) - 1) If 国民の祝日(日, 1) = "" And Weekday(日) > 1 And Weekday(日) < 7 Then Cells(セル, 2).Activate ActiveCell.Value = 日 セル = セル + 1 End If Next 日 End Sub
- Nii
- ベストアンサー率48% (79/162)
2006年固定で、平日をカウントする Public Function 平日(月 As Long) As Long Dim 日 As Date Dim 日数 As Long For 日 = DateSerial(2006, 月, 1) To (DateSerial(2006, 月 + 1, 1) - 1) If 国民の祝日(日, 1) = "" And Weekday(日) > 1 And Weekday(日) < 7 Then 日数 = 日数 + 1 End If Next 日 平日 = 日数 End Function Public Function 国民の祝日(今日 As Date, chk_l As Integer) As String Dim 年 As Long 国民の祝日 = "" 年 = Year(今日) If Format(今日, "yyyymm") < 194807 Then Exit Function End If If Format(今日, "mmdd") = 101 Then 国民の祝日 = "元日" Exit Function End If If 年 < 2000 And Format(今日, "mmdd") = 115 Then 国民の祝日 = "成人の日" Exit Function ElseIf 年 >= 2000 Then If 第一月曜(DateSerial(年, 1, 1)) + 7 = 今日 Then 国民の祝日 = "成人の日" Exit Function End If End If If 年 >= 1966 And Format(今日, "mmdd") = 211 Then 国民の祝日 = "建国記念の日" Exit Function End If If DateSerial(年, 3, Int(0.24242 * 年 - Int(年 / 4) + 35.84)) = 今日 Then 国民の祝日 = "春分の日" Exit Function End If If Format(今日, "mmdd") = 503 Then 国民の祝日 = "憲法記念日" Exit Function End If If Format(今日, "mmdd") = 429 Then If 年 < 1989 Then 国民の祝日 = "天皇誕生日" Exit Function ElseIf 年 >= 1989 And 年 < 2007 Then 国民の祝日 = "みどりの日" Exit Function Else 国民の祝日 = "昭和の日" Exit Function End If End If If 年 >= 2007 And Format(今日, "mmdd") = 504 Then 国民の祝日 = "みどりの日" Exit Function End If If Format(今日, "mmdd") = 505 Then 国民の祝日 = "こどもの日" Exit Function End If If 年 >= 1995 Then If 年 < 2003 And Format(今日, "mmdd") = 720 Then 国民の祝日 = "海の日" Exit Function ElseIf 年 >= 2003 Then If 第一月曜(DateSerial(年, 7, 1)) + 14 = 今日 Then 国民の祝日 = "海の日" Exit Function End If End If End If If 年 >= 1966 Then If 年 < 2003 And Format(今日, "mmdd") = 915 Then 国民の祝日 = "敬老の日" Exit Function ElseIf 年 >= 2003 Then If 第一月曜(DateSerial(年, 9, 1)) + 14 = 今日 Then 国民の祝日 = "敬老の日" Exit Function End If End If End If If DateSerial(年, 9, Int(0.24204 * 年 - Int(年 / 4) + 39.01)) = 今日 Then 国民の祝日 = "秋分の日" Exit Function End If If 年 >= 1966 Then If 年 < 2000 And Format(今日, "mmdd") = 1010 Then 国民の祝日 = "体育の日" Exit Function ElseIf 年 >= 2000 Then If 第一月曜(DateSerial(年, 10, 1)) + 7 = 今日 Then 国民の祝日 = "体育の日" Exit Function End If End If End If If Format(今日, "mmdd") = 1103 Then 国民の祝日 = "文化の日" Exit Function End If If Format(今日, "mmdd") = 1123 Then 国民の祝日 = "勤労感謝の日" Exit Function End If If 年 >= 1989 And Format(今日, "mmdd") = 1223 Then 国民の祝日 = "天皇誕生日" Exit Function End If If 今日 = #4/10/1959# Then 国民の祝日 = "皇太子明仁親王の結婚の儀" Exit Function End If If 今日 = #2/24/1989# Then 国民の祝日 = "昭和天皇の大喪の礼" Exit Function End If If 今日 = #11/12/1990# Then 国民の祝日 = "即位礼正殿の儀" Exit Function End If If 今日 = #6/9/1993# Then 国民の祝日 = "皇太子徳仁親王の結婚の儀 " Exit Function End If If chk_l Then If 今日 > #4/12/1973# Then If Weekday(今日) = 2 Then If Len(国民の祝日(今日 - 1, 0)) Then 国民の祝日 = "振替休日" Exit Function End If ElseIf 年 >= 2005 Then If Weekday(今日) = 3 Then If Len(国民の祝日(今日 - 1, 0)) Then If Len(国民の祝日(今日 - 2, 0)) Then 国民の祝日 = "振替休日" Exit Function End If End If ElseIf Weekday(今日) = 4 Then If Len(国民の祝日(今日 - 1, 0)) Then If Len(国民の祝日(今日 - 2, 0)) Then If Len(国民の祝日(今日 - 3, 0)) Then 国民の祝日 = "振替休日" Exit Function End If End If End If End If End If End If If 年 >= 1985 Then If Len(国民の祝日(今日 - 1, 0)) Then If Len(国民の祝日(今日 + 1, 0)) Then 国民の祝日 = "国民の休日" Exit Function End If End If End If End If End Function Public Function 第一月曜(今日 As Date) As Date 今日 = DateSerial(Year(今日), Month(今日), 1) Do Until Weekday(今日) = 2 今日 = 今日 + 1 Loop 第一月曜 = 今日 End Function
- Wendy02
- ベストアンサー率57% (3570/6232)
こんにちは。 厳密に、この言葉を守るとすれば、 >A1に2と入力すると、B列に2月の1日から28、29日まで土曜・日曜・祝祭日(休日)を除いた日のように、 1日が土曜日・日曜日、祭日の場合、例えば、06年1月,4月,7月,10月のような場合は、最初の日が成り立ちませんから、配列数式で行うしかありませんね。なお、WORKDAY関数の使い道を探しましたが、配列が受けないようでした。 =IF(SUM((WEEKDAY(DATE(YEAR(NOW()),$A$1,ROW($A$1:$A$31)),2)<6)*(ISERROR(MATCH(DATE(YEAR(NOW()),$A$1,ROW($A$1:$A$31)),$D$1:$D$20,0)))*(MONTH(DATE(YEAR(NOW()),$A$1,ROW($A$1:$A$31)))=$A$1))>=ROW(A1),SMALL(IF((WEEKDAY(DATE(YEAR(NOW()),$A$1,ROW($A$1:$A$31)),2)>5)+(ISERROR(MATCH(DATE(YEAR(NOW()),$A$1,ROW($A$1:$A$31)),$D$1:$D$20,0))=FALSE)>0,"",DATE(YEAR(NOW()),$A$1,ROW($A$1:$A$31))),ROW(A1)),"") ※配列の確定が必要です。 『配列の確定』 一旦、数式のところで、F2を押して、再度、SHIFT キーとCTRL キーを押しながら、ENTER を押すと、式が実体化して、値が出てきます。その後で、フィルドラッグで、コピーします。このレベルですと、VBAの処理のほうが簡単です。 D列 (祭日データ) 2006/1/1 2006/1/2 2006/1/9 2006/2/11 2006/3/21 2006/4/29 2006/5/3 2006/5/4 2006/5/5 2006/7/17 2006/9/18 2006/9/23 2006/10/9 2006/11/3 2006/11/23 2006/12/23
- rin01
- ベストアンサー率43% (33/76)
追伸で~す。。。♪ カレンダーでは、有名なサイトです。 ご参考にどうぞ~。。。 http://www.h3.dion.ne.jp/~sakatsu/CalendarTopic.htm
- Nii
- ベストアンサー率48% (79/162)
可能か不可能化で言えば、可能かと・・・ ただ、補足をお願いします。 土曜・日曜・祝祭日(休日)を除いた日:何日って表示ですか?それとも、日にちの一覧ですか? 祝祭日って、毎年変わりますよね?年度はどうすれば、いいのでしょう?
補足
B1から列に日にちの一覧を表示させたいと思っています。 年度は、A1に2007.1(年と月)と入力しても良いのですが、できるだけ簡単な方法をと思っています。
- rin01
- ベストアンサー率43% (33/76)
こんにちは~♪ ★どこかのセル範囲に、1年間の祝日一覧を作っておきます。 その範囲がD1:D20の場合。 B1: =IF($A$1=MONTH(WORKDAY(DATE(2006,$A$1,1),ROW(A1)-1,$D$1:$D$20)),WORKDAY(DATE(2006,$A$1,1),ROW(A1)-1,$D$1:$D$20),"") 下にコピーします。 WORKDAY関数は、「アドイン関数」なので、メニューバーの[ツール]-[アドイン]の「分析ツール」にチェックしてから使用してください。 ★その範囲がD1:D20を祝日一覧とかで名前定義して 式に組み込んでもいいと思います。 カン違いならゴメンナサイ!!。。。。Rinでした~♪♪
お礼
皆さん、本当にありがとうございました。 指示通り、いろいろやってみましたが、私の技量では難しすぎて、無理みたいです。 これからも、何とか出来るように頑張りたいと思います。