プロが教える店舗&オフィスのセキュリティ対策術

目的は仕事で何日に誰が休むむかを一目で知りたくてエクセルで作成したカレンダーを作りました(縦型日付表示) 現在は届けの用紙が来たらカレンダーに手打ちしてます。

(シート1) 種類は名前に色分けをしたかったので種類を入れてます。
      (上手く作成できたら種類によって名前に色わけとかしたくて種類を作りました)
       横に名前が出るようにしてます。同じ日に休みの人が増えれば HIJKと横に続きます。
  A      B    C      D     E      F     G
1 日付   曜日  名前   種類  名前   種類
2 1日         桃    有給  (みかん)   (休み)
3 2日
4 3日
以下日にちは月末まであります。
別のシート(シート2)で作成したデータを反映させたいのですが同じ日付でデータがある場合
どうすれば反映されるのでしょうか?ためしにD3にカウント式(=COUNTIF($A$3:$A3,$A3))を入れて
順番をつけてみました。
  A      B    C      D
1 日付  名前  種類  カウント
2 5/1  桃    有給   1
3 5/3  奈々   半日   1
4 5/1  みかん 休み   2
以下休み届けなどが出されたら随時追加します。

わからないなりにネットで見て数式を入れてみました。
シート1のC2に
=IF(ISERROR(VLOOKUP(A2,シート2!$A:$C,2,0)),"",VLOOKUP(A2,シート2!$A:$C,2,0))
C3に
=IF(ISERROR(VLOOKUP(A2,休み!$A:$D,3,0)),"",VLOOKUP(A2,休み!$A:$D,3,0))
入力すると始めの 5/1 桃 有給はカレンダーにあがるのですが5/1 みかん 休みを出せません
あまりエクセルなどに詳しくなく、他の数式なども活用できるのかこういう表がそもそもエクセルでできるのかも勉強不足でわかりません。なんだかマネて作成したらあまりに長くて引数が足りませんみたいな表示がでました。
お手数をおかけしますが、教えていただけたら嬉しいです。よろしくお願い致します。

A 回答 (2件)

こんばんは!


お望みの方法とは異なるかもしれませんが、手っ取り早くVBAでやってみました。
まずSheet1にカレンダーを作成します。
↓の画像で上側がSheet1、下側がSheet2とします。
(お手元のSheetは画像通りの配置にしてください)

まずSheet1のA1セルに西暦年を、C1セルに表示させたい月の数値を入力します。
A4セル(セルの表示形式はユーザー定義から d日 としておく)に
=IF(MONTH(DATE(A$1,C$1,ROW(A1)))=C$1,DATE(A$1,C$1,ROW(A1)),"")
という数式を入れます。
B4セル(セルの表示形式はユーザー定義から aaa としておく)に
=IF(A4="","",A4)
という数式を入れ → A4・B4セルを範囲指定 → B4セルのフィルハンドルで月末の34行目までコピー!
これでA1・C1セルの数値を入れ替えるだけでカレンダーができます。

次にAlt+F11キー → メニュー → 挿入 → 標準モジュール → VBE画面のカーソルが点滅しているところに
↓のコードをコピー&ペースト

Dim i As Long, j As Long, lastRow As Long, lastCol As Long, wS As Worksheet 'この行から
Sub 表示()
Set wS = Worksheets("Sheet1")
lastCol = wS.Cells(3, Columns.Count).End(xlToLeft).Column
With Worksheets("Sheet2")
lastRow = .Cells(Rows.Count, "A").End(xlUp).Row
If lastRow > 1 Then
Range(.Cells(2, "A"), .Cells(lastRow, "C")).ClearContents
End If
For i = 4 To 34
For j = 3 To lastCol Step 2
If wS.Cells(i, j) <> "" Then
With .Cells(Rows.Count, "A").End(xlUp).Offset(1)
.Value = wS.Cells(i, "A")
.Offset(, 1) = wS.Cells(i, j)
.Offset(, 2) = wS.Cells(i, j + 1)
End With
End If
Next j
Next i
End With
End Sub 'この行まで

そしてExcel画面に戻り、画面左下のSheet1のSheet見出し上で右クリック → コードの表示 → VBE画面に
↓のコードをコピー&ペースト

Private Sub Worksheet_Change(ByVal Target As Range) 'この行から
Dim lastCol As Long
lastCol = Cells(3, Columns.Count).End(xlToLeft).Column
If Intersect(Target, Range(Cells(4, "C"), Cells(34, lastCol))) Is Nothing Then Exit Sub
Call 表示
End Sub 'この行まで

最後にExcel画面に戻り、Sheet2のA列の表示形式を「日付」にしておきます。

これでSheet1のデータ変更があるたびにSheet2に画像のような感じで表示されます。m(_ _)m
「カレンダー作成 別シートよりデータ反映」の回答画像2
    • good
    • 2
この回答へのお礼

回答1の方から教えて頂いたように、私がバージョン情報を書いていない中でご解答いただきありがとうございます。
回答が早くてこちらにまずビックりしております。
しかも画像付きで!!カレンダーが大変みやすいですね。
内容も詳しく書いていただきすごく助かります。
これから早速やってみたいと思います。本当にありがとうございました。

お礼日時:2014/05/13 23:30

シート1にカレンダー,シート2に休暇届一覧とします



簡単のため,次のように準備します
シート1:
A2にはとりあえず
5/1
を記入,以下コピーして5/31まで準備します(後述)
B2は
=TEXT(A2,"aaa;;;")
以下コピー


シート2:
A列には年/月/日を記入します
簡単のためB列に「カウント」を用意します
B2:
=IF(A2="","",TEXT(A2,"yyyymmdd-")&COUNTIF($A$2:A2,A2))
以下コピー
邪魔ならB列は隠しておきます
C列,D列に名前,休暇種別を記入します


改めてシート1:
C2には
=IF(COLUMN(A2)/2>COUNTIF(Sheet1!$A:$A,$A2),"",VLOOKUP(TEXT($A2,"yyyymmdd-")&TEXT(COLUMN(A2)/2,"0"),Sheet1!$B:$D,MOD(COLUMN(A2)+1,2)+2,FALSE))
右にコピー,下にコピーして完成。



#参考
実際には無意味に数式を複雑にしないため
C2には
=IF(COLUMN(B2)/2>COUNTIF(Sheet1!$A:$A,$A2),"",VLOOKUP(TEXT($A2,"yyyymmdd-")&COLUMN(B2)/2,Sheet1!$B:$D,2,FALSE))
D2に
=IF(C2="","",VLOOKUP(TEXT($A2,"yyyymmdd-")&COLUMN(B2)/2,Sheet1!$B:$D,3,FALSE))
と記入,C2:D2を2つセットで右に下にコピーします。

#ご利用のエクセルのバージョンがご相談に書かれていませんが,エクセル2007以降ならもっと簡単な数式に出来ます。ご相談投稿では,普段ご利用のソフトのバージョンまでキチンと明記することを憶えて下さい。次回以降のご参考に。




#参考:
A2の5/1は,実際にはどこかのセルに年と月の数字を記入して計算によって表示させ,さらにセルの書式設定の表示形式のユーザー定義で
d日
のように設定して表示を整えます。

A列の縦のカレンダーを計算式で上手に表示する方法について,別途ご相談を投稿して解決して下さい。
    • good
    • 0
この回答へのお礼

詳しくやり方を書いていただきありがとうございます。
バージョンとか書くの忘れてました・・・・。投稿の仕方も教えていただきありがとうございます。(何を使用しているかわからないと答えようが無いですものね・・。)
こんなに早く回答がもらえるとは思ってなかったし親切に教えていただけるとは考えていなかったのですごく嬉しいです。
これから早速試してみます。本当にありがとうございました。

お礼日時:2014/05/13 23:24

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