プロが教えるわが家の防犯対策術!

エクセル2002にてカレンダーを作りました。
(例)       2008年1月
  |  C  D  E  F  G  H  I
 8| 月  火  水  木  金  土  日
 9|     1  2  3   4  5   6     
10| 7   8  9 10  11 12  13
11|14  15 16 17  18 19  20
12|21  22 23 24  25 26  27
13|28  29 30 31
この下に2月~6月、横に7月~12月があり、休日を塗りつぶしています。
休日は祝日ではなくて当社の休日です。(2色)
セルの値は書式設定で「yyyy/mm/dd」を「dd」だけにして表示させています。
例えば1月21日~2月20日で塗りつぶしたセルの合計を出したいのです。(2色なので色別に)
数式ではダメなようですので、VisualBasciでもOKですので、
どなたか御教授いただけないでしょうか?
宜しくお願いします。

A 回答 (3件)

多少汎用的に考えてユーザ定義関数にしてみました


以下のマクロをALT+F11でVBE画面を開き、左上のVBA Projectでシート名を右クリックし「挿入」→「標準モジュール」で表示される画面に貼り付けて下さい。

VBE画面を閉じてワークシート画面に戻り
 =Csum(C8:I50,A3,A1,A2)
のように4つの引数を指定して式を入力します
 1番目:塗りつぶしたセルを数えるセル範囲
 2番目:数えたい色で塗られているセルアドレス
 3番目:開始日が入力されたセルアドレス
 4番目:終了日が入力されたセルアドレス

2番目の引数で指定するセルは、予め背景色を塗っておいてください。
また3、4番目のセルが日付型の値でない場合や、開始日>終了日のときは#VALUE!エラーを返します

Function Csum(ByVal rng, trg, dt1, dt2 As Range) As Long
Dim r As Range
Dim tCidx
Dim fDate, tDate As Date
 tCidx = trg.Cells(1, 1).Interior.ColorIndex
  If IsDate(dt1.Value) And IsDate(dt2.Value) Then
    fDate = dt1.Value
    tDate = dt2.Value
  Else
    Csum = ""
    Exit Function
  End If
  If fDate > tDate Then
    Csum = ""
    Exit Function
  End If
  For Each r In rng
    If r.Interior.ColorIndex = tCidx Then
      If IsDate(r.Value) Then
        If r.Value >= fDate And r.Value <= tDate Then
          Csum = Csum + 1
        End If
      End If
    End If
  Next r
End Function

なおセルの背景色を変更する動作を行っても関数の再計算は自動的にされません。カレンダの日付を先に入力して、後から背景色を変更した場合は
 ALT+Ctrl+F9
で強制再計算させる必要があります。

この回答への補足

御回答有難うございます。
ほぼ自分の意図した物になってきましたが、
なんとか自動で再計算させる方法はないのでしょうか?
これが出来きたら完璧なるのですが。

補足日時:2007/10/02 09:58
    • good
    • 0

#02です


>ほぼ自分の意図した物になってきましたが
ということはご自身で手を加えていただいたと言うことですね。参考になって幸いです。

私はきれいな方法で確実に強制再計算を自動化する方法を知りません。
Loop処理の中でSendkeysとDoEventsを用いて{Alt+Ctrl+F9}を一定間隔で発生させる方法は考えられますが、間隔をあまり短くすると普通の操作に支障が出るかもしれません。あるいはOnTimeメソッドでSendkeysを呼ぶのもアリでしょうし、Worksheet_CalculateイベントでSendkeysを呼ぶ方法も考えられます。

これらの方法は試していませんので、ご自身で色々とお試しください。
    • good
    • 0

セルの塗りつぶし(文字のフォント色も同じ)は


(1)書式設定 書式ーセルーパターンー色指定
(2)条件付書式 書式ー条件付書式ー値が(式が)・・-色指定
の2つがあります。
ーー
C3は(1)で赤(セルパターン色)
C5は(2)で赤(セルパターン色)
を設定しました
Sub test01()
MsgBox Cells(3, "C").Interior.ColorIndex
MsgBox Cells(5, "C").Interior.ColorIndex
End Sub
を実行すると(1)は3、(2)は-4142(色設定なしと同じ)
になりました。
条件付貴書式の方の色判別は(Msgboxはわざと表示用にしている。)
MsgBox Cells(5, "C").FormatConditions(1).Interior.ColorIndex
のようにしないとならないようです。
ーー
ですから、本件質問の場合は
(1)か(2)のどちらであるのか
(2)の場合は条件は何か
を書かないと、この質問に回答できません。
ーー
>休日は祝日ではなくて当社の休日です
とあるところから推測すると、(1)のケースでないかと思う。
ーー
そこで
1月の場合
Sub test02()
Dim cl As Range
k = 1
For Each cl In Range("C9:i13")
If cl.Interior.ColorIndex = 3 Then
k = k + 1
Next
Cells(3, "Z") = k
End Sub
のようなコードを組むことになるが、12ヶ月を1度に出すには
1月以外は、セルの情報が質問に具体的でないので、コードが書けない。
質問者が修正する力があれば、参考にしてください。
    • good
    • 0
この回答へのお礼

お返事、有難うございます。
他の方から教えて頂いた方法で試してみたいと思います。
なかなか難しいですね・・・

お礼日時:2007/10/02 09:54

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!