[[20150118184751]] 『カレンダーの作成』(寅次郎) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『カレンダーの作成』(寅次郎)

 Sheet1のA列にカレンダーを表示したいです。
 Sheet1のA1に基準月を表示し、Sheet2には月ごとのカレンダーが予め置いてあります。
 下記の例でいうと、Sheet1のA1(基準月)をSheet2の1行目から探し、A2からA21を
 コピーし、Sheet1のA3に貼り付けるマクロをご教授お願いします。
 このやり方しか思い浮かびません。Sheet1のレイアウトは変えずに、他に良い方法
 があれば教えてください。

  Sheet1         Sheet2
      A             A       B                                             
  1 2015/1      2015/1   2015/2 
  2 日付           1/5     2/2  
  3  1/5           1/6     2/3             
  4  1/6           1/7     2/4             
  5  1/7           1/8     2/5
  6  1/8           1/9     2/6
  7  1/9          1/12     2/9
  8 1/12          1/13    2/10
  9 1/13          1/14    2/11
 10 1/14          1/15    2/12
 11 1/15          1/16    2/13
 12 1/16          1/19    2/14
 13 1/19          1/20    2/16
 14 1/20          1/21    2/17
 15 1/21          1/22    2/18
 16 1/22          1/23    2/19
 17 1/23          1/26    2/20
 18 1/26          1/27    2/23                  
 19 1/27          1/28    2/24
 20 1/28          1/29    2/25
 21 1/29          1/30    2/26                
 22 1/30                  2/27
 23                

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 なんか似たような質問が続いていますね。

 >Sheet2には月ごとのカレンダーが予め置いてあります。
 このカレンダーを作るのって面倒じゃないですか?

 「休日のリスト」と「土日出勤日のリスト」をSheet2に作って置くらいで
 処理できる仕掛けにした方が楽だと思うんですけど、そうでもないんですかねぇ・・・

(半平太) 2015/01/18(日) 20:49


 半平太さんありがとうございます。
 >「休日のリスト」と「土日出勤日のリスト」をSheet2に作って
 もう少し、具体的に教えて教えてもらえもませんか?
(寅次郎) 2015/01/19(月) 06:55

 Sheet2のそれぞれの日付リストに「祭日」「土日出勤」と名前を付ける
 それぞれ、範囲は2行目〜100行目くらいにしておけば充分かと思います。

  行  ___A___  ____B____
   1  祭日     土日出勤 
   2  1月1日   2月14日  
   3  1月2日            
   4  1月3日            
   5  1月4日            
   6     以下省略                  

 Sheet1のシート見出しを右クリックして、「コードの表示」でシートモジュールを
 表示させ、後記コードを貼り付ける。

 以後、Sheet1のA1セルに指定年月を入力すると、下図のように所要日付が表示される。
 ※セルの書式はそちらでアジャストしてください。

  行  ______A______
   1  2015/2       
   2  日付         
   3  2015/2/2(月) 
   4  2015/2/3(火) 
   5  2015/2/4(水) 
   6  2015/2/5(木) 
   7  2015/2/6(金) 
   8  2015/2/9(月) 
   9  2015/2/10(火)
  10  2015/2/11(水)
  11  2015/2/12(木)
  12  2015/2/13(金)
  13  2015/2/14(土)
  14  2015/2/16(月)
    以下省略

 ’Sheet1のシートモジュールに貼り付けるコード(↓)

 Private Sub Worksheet_Change(ByVal Target As Range)
    Dim App As Application
    Dim topDate As Variant
    Dim stDate As Date
    Dim dateAry(1 To 31, 1 To 1) As Variant
    Dim posOfRow As Long
    Dim NN As Long

    If Target.Address(0, 0) <> "A1" Then Exit Sub

    Set App = Application
    topDate = Range("A1").Value

    If IsDate(topDate) Then
        stDate = App.EoMonth(CDate(topDate), -1) + 1
    Else
        MsgBox "要日付!"
        Exit Sub
    End If

    For NN = stDate To App.EoMonth(stDate, 0)
       If App.CountIf(App.Range("土日出勤"), NN) Or _
            (App.WorkDay(NN + 1, -1, App.Range("祭日")) = NN) Then
            posOfRow = posOfRow + 1
            dateAry(posOfRow, 1) = NN
       End If
    Next

    App.EnableEvents = False
        Range("A3:A33").Value = dateAry
    App.EnableEvents = True
 End Sub

(半平太) 2015/01/19(月) 09:42


 すでに半平太さんから回答がでていますので、まったく別のポイントで。
 祝祭休日リストや休日出勤リストを設けて処理するカレンダー作成の王道からはずれて。
 これらのリストの悩みは、yyyy があるところですね。月日は同じでも毎年書き換え、ないしは追加が必要。
 もう1つ、寅次郎さんのミッションが年間のカレンダーをにらみながら、毎月の出勤日カレンダーを作成する
 人事部関連であれば、毎年、何かしら行わなければいけない、この作業を支援する仕組みとして、以下のようなものは
 どうだろうとの思いつきです。

 Sheet2ができあがれば、Sheet1への展開そのものはマクロでもできますが、まずは手作業で。
 なお、当方、関数は詳しくなく、専門の方々からみればどんくさいものだとは思いますが、
 そこは、よりスマートな式にしていただければと思います。

 Sheet2

 A1 2015 ユーザー書式で 0年
 B1 =(COLUMN()-2)/6+1 ユーザー書式で 0月
 B2 =DATE($A$1,B1+1,0)-DATE($A$1,B1,1)+1 ユーザー書式で ""
 C1 "日付"
 D1 "曜日"
 E1 "祝祭日" 
 F1 "休日出勤
 G1 "出勤日"
 C2 =IF(ROW()-1<=B$2,DATE($A$1,B$1,ROW()-1),"")
 D2 =TEXT(C2,"aaa")
 G2 =IF(AND($F2="",OR(ISNUMBER(FIND("土日",$D2)),$E2=""),ROW()-1<=B$2),"○","")

 C2:G2を選択し、これを 32行目までフィルコピー

 B列:列を選択して Ctrl/c
 H1を選択して Ctrl/v
 N1を選択して Ctrl/v
 T1を選択して Ctrl/v
 以降、12月分まで同じ要領で。

 で、祝祭日列と休日出勤列にマーク(○でも数字でも文字でもなんでもOK)

 結果、出勤日については出勤日列に○がマークされる。

 で、たとえば2月の処理をしようとすれば
 ・H列:M列を選択してデータタブのフィルタ設定
 ・出勤日の▼をおして、○を指定
 ・結果、2月の 出勤日だけのリストができているので
 ・I列:J列を選択して Ctrl/c
 ・Sheet1のA2を選択してCtrlv

(β) 2015/01/19(月) 10:20


 ↑ ごめんなさい。作業していたシートから質問のレイアウトにあわせる変更の際に間違いあり。

 ×)G2 =IF(AND($F2="",OR(ISNUMBER(FIND("土日",$D2)),$E2=""),ROW()-1<=B$2),"○","")

 ○)=IF(AND($F2="",ISERROR(FIND($D2,"土日")),$E2="",ROW()-1<=B$2),"○","")

 これでいいと思います・・・たぶん・・・

 1/20 10:45 これでもだめです。そもそもお、列記号を絶対参照してるし。
      ただいま、足りない頭を使って試行錯誤中。

(β) 2015/01/19(月) 10:51


 半平太さま、βさまお返事遅れて申し訳ありません。
 半平太さまの、マクロを手順どおりに実施ましたが、
 workdayのところで、Rangeメゾットは失敗しましたとでます。
 何がダメなんでしよう?考えられるところをお教えください。
 βさまのご回答まで、まだ到達できてません。
 後ほど確認させていただきます。すみません。
(寅次郎) 2015/01/20(火) 12:48

まず

B列:列を選択して Ctrl/c

これは

B列:G列を選択して Ctrl/c

です。

で、

G2 =IF(AND($F2="",OR(ISNUMBER(FIND("土日",$D2)),$E2=""),ROW()-1<=B$2),"○","")

これは

G2 =IF(AND(ROW()-1<=B$2,OR(F2<>"",AND(ISERROR(FIND(D2,"土日")),E2=""))),"○","")

でした。

(β) 2015/01/20(火) 13:36


 > マクロを手順どおりに実施ましたが、
 > workdayのところで、Rangeメソッドは失敗しましたとでます。
 > 何がダメなんでしよう?考えられるところをお教えください。

 多分、祭日と土日出勤日のリストに名前定義がされていないのだと思いますが、
 現時点ではそのトラブルを何かして解決する必要はないです。

 私のこの考え方が具体的イメージとして伝わりさえすれば十分な段階なので。
    ↓
 >「休日のリスト」と「土日出勤日のリスト」をSheet2に作って置くらいで
 > 処理できる仕掛けにした方が楽だと思うんですけど、そうでもないんですかねぇ・・・

(半平太) 2015/01/20(火) 23:39


 なぜか、私の(β) 2015/01/20(火) 13:36 の投稿が消えていましたので差分から復元します。

 まず

 B列:列を選択して Ctrl/c

 これは

 B列:G列を選択して Ctrl/c

 です。

 で、

 G2 =IF(AND($F2="",OR(ISNUMBER(FIND("土日",$D2)),$E2=""),ROW()-1<=B$2),"○","")

 これは

 G2 =IF(AND(ROW()-1<=B$2,OR(F2<>"",AND(ISERROR(FIND(D2,"土日")),E2=""))),"○","")

 でした。

(β) 2015/01/21(水) 04:08


 半平太さま、ありがとうございます。
 定義、勉強不足で知りませんでした。名前の定義で検索してやってみました。
 名前「祭日」 範囲「ブック」 参照範囲「A1:B100」と定義し、Sheet1のA1セルに指定年月を入力
 入力しますが,
 前記と同じエラーが出てしまいます。ご指導お願いします。
(寅次郎) 2015/01/21(水) 21:07

 > 名前「祭日」 範囲「ブック」 参照範囲「A1:B100」と定義し、Sheet1のA1セルに指定年月を入力
 > 入力しますが,

 名前 「祭日」  範囲「ブック」 参照範囲「A2:A100」と定義、(タイトルの1行目は含めないでください)
 名前「土日出勤」 範囲「ブック」 参照範囲「B2:B100」と定義
 そしてSheet1のA1セルに指定年月を入力してみる。

 なのですが、既述の通り、現時点ではたとえマクロは動かなくても話の進行上は支障ないです。
 寅次郎さんの当初の構想と、私の提案を比較して「どっちが良さそうか」を判断するのが先なので。。。
 ダメそうな案にエネルギーを使うのは無駄骨です。
 ※実際に動かしてみないと判断できなさそう、と云うことなら話は別ですけども。

(半平太) 2015/01/21(水) 23:32


 半平太さま、きちんとカレンダーが出来上がりました。
 祭日と土曜出勤だけを登録するだけですむので、先々も使えそうです。
 定義、お手数かけました。ありがとうございました。

 βさんのようなやり方もあるんですね。勉強になります。
 ありがとうございました。

(寅次郎) 2015/01/23(金) 21:20


コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.