[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『横カレンダーの内容を七曜カレンダーに表示』(ぷーこ)
はじめましてよろしくお願いします。
A | B | C | 〜〜〜〜 | AF 1 | | | ○月予定表 | 2 日にち | 1 | 2 | 〜〜〜〜 | 31 3 曜日 | 月 | 火 | 〜〜〜〜 | 水 ―――――――――――――――――――――――――――――――――――――――――― 4 なまえ@| 9:00〜16:30 | 9:00〜16:30 | 〜〜〜〜 | 5 なまえA| | 9:00〜16:30 | 〜〜〜〜 |9:00〜16:30 6 なまえB| 9:00〜16:30 | | 〜〜〜〜 |14:00〜16:30 7 なまえC| 11:00〜16:00| 9:00〜ショート| 〜〜〜〜 |14:00〜16:30 8 なまえD| | 13:00〜16:00 | 〜〜〜〜 |9:00〜16:30 ・ ・ | ・ | ・ | ・ | ・ ・ ・ | ・ | ・ | ・ | ・ ・ ・ | ・ | ・ | ・ | ・ 30 なまえ26|9:00〜ショート | | |14:00〜16:30
という横カレンダーに予定の時間を入力すると
A | B | C | 〜〜〜〜 | G 1 | | | ○月予定表 | 2 日 | 月 | 火 |〜〜〜〜 | 土 ―――――――――――――――――――――――――――――――――――――――――― 3 | 1 | 2 | 〜〜〜〜 | 6 ―――――――――――――――――――――――――――――――――――――――――― 4 |@くん9:00〜16:30 |@くん9:00〜16:30|〜〜〜〜 |Aさん9:00〜16:30 5 |Bくん9:00〜16:30 |Aさん9:00〜16:30|〜〜〜〜 |Cくん9:00〜16:30 6 |26さん9:00〜ショート |Cくん9:00〜ショート | 〜〜〜〜 |@くん14:00〜16:30 7 |Cくん11:00〜16:00|Dさん13:00〜16:00|〜〜〜〜 |Gさん14:00〜16:30 8 | | | 〜〜〜〜|Hくん14:00〜16:30 ・ ・ | ・ | ・ | ・ | ・ ・ ・ | ・ | ・ | ・ | ・ ―――――――――――――――――――――――――――――――――――――――――― 14 7 | 8 | 9 | ・ | 13 ―――――――――――――――――――――――――――――――――――――――――― 15 |Bくん9:00〜ショート | | |Dさん9:00〜16:30 ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ ・ 七曜カレンダーに名前と時間を表示したいのです。
横カレンダーは月が変わると曜日が変わり、七曜カレンダーは月が変わると日にちが変わるように設定したいです。 別シートのようになっていますが、できれば1枚のシートに作りたいです。(七曜カレンダーの隣に横カレンダー)
説明わかりづらいと思いますがよろしくお願いします。
こんにちは。かみちゃん です。
> 横カレンダーは月が変わると曜日が変わり、七曜カレンダーは月が変わると日にちが変わるように設定したいです。 > 別シートのようになっていますが、できれば1枚のシートに作りたいです。(七曜カレンダーの隣に横カレンダー)
VBAで処理することでも構わないでしょうか? 七曜カレンダーは、1日分に10行しか転記できないようなのですが、それ以上あったらどうするのですか?
(かみちゃん) 2009/08/29 22:52
かみちゃん様コメントありがとうございます。
VBAでも大丈夫です。 1日の定員が10名なので七曜カレンダーには10行でいいのですが、実際は11行目に別のことを書き込むので空の1行を作りたいです。 あと、名前と時間だけしか書いてなかったのですが、実は「@くん 9:00〜16:30 送迎 弁」ということを入れたいです。 送迎・迎え・送り・(空欄)の4パターン 弁もある時とない時があります。 付け加えのあって面倒だと思いますが、よろしくお願いします。
(ぷーこ)
こんにちは。かみちゃん です。
> 1日の定員が10名なので七曜カレンダーには10行でいい
1日10名を超えていたら、最初の10名分を転記するということでいいですよね? それとも、「10名を超えています」というメッセージを出したほうがいいのでしょうか?
> 送迎・迎え・送り・(空欄)の4パターン 弁もある時とない時があります。
この情報はどこから得るのでしょうか?横カレンダーにはないですよね?
> 七曜カレンダーに名前と時間を表示したいのです。
1日の10名の順番ですが、もしかして、開始時刻(?)の早い順、同じ開始時刻であれば、終了時刻(?)の早い順、ショートの場合は、最後、つまり
@くん9:00〜16:30 Bくん9:00〜16:30 26さん9:00〜ショート Cくん11:00〜16:00
という順番にしないといけないということでしょうか?
*****
これから空いた時間で考えるので、数日お時間をいただけますでしょうか? もちろん、他の方から書き込みがあれば、そちらを参照してくださっても結構です。
(かみちゃん) 2009/08/31 20:08 22:11追記 22:22追記
かみちゃん様
説明不足・付け足しでご面倒かけてすみません。
>1日10名を超えていたら、最初の10名分を転記するということでいいですよね? それとも、「10名を超えています」というメッセージを出したほうがいいのでしょうか?
「10名を超えています」というメッセージが出るならそうして頂けるとありがたいです。
>この情報はどこから得るのでしょうか?横カレンダーにはないですよね?
送迎と弁の情報は横カレンダーに入れます。
>1日の10名の順番ですが、もしかして、開始時刻(?)の早い順、同じ開始時刻であれば、終了時刻(?)の早い順、ショートの場合は、最後、つまり
@くん9:00〜16:30 Bくん9:00〜16:30 26さん9:00〜ショート Cくん11:00〜16:00
という順番にしないといけないということでしょうか?
できればそのような順番になると嬉しいです。
急いではいませんので、お時間のある時に教えていただけたらありがたいです。 よろしくお願いします。
(ぷーこ)
こんにちは。かみちゃん です。
> 送迎と弁の情報は横カレンダーに入れます。
横カレンダーのどこのセルに入れるのですか?
現在以下のようなサンプルシートを作ってあります。 一見ずれて見難いですが、これをコピーして、Excelシートに「形式を選択して貼り付け」の「テキスト」をしていただくと、 セル位置が反映されます。
[A] [B] [C] [1] [2] 日にち 2009/8/1 2009/8/2 [3] 曜日 土 日 [4] 佐藤 9:00〜16:30 9:00〜16:30 [5] 鈴木 9:00〜16:30 [6] 高橋 9:00〜16:30 [7] 田中 11:00〜16:00 9:00〜ショート [8] 渡辺 13:00〜16:00
たとえば、2009/8/1 の 佐藤 の 9:00〜16:30 に 送迎や弁の情報 は、どのセルに入れるのか教えてください。 9:00〜16:30 と入力してあるB4セルに "9:00〜16:30送迎" という感じなのでしょうか?
(かみちゃん) 2009/09/01 7:03
かみちゃん様
>たとえば、2009/8/1 の 佐藤 の 9:00〜16:30 に 送迎や弁の情報 は、どのセルに入れるのか教えてください。 9:00〜16:30 と入力してあるB4セルに "9:00〜16:30送迎" という感じなのでしょうか?
そうです。時間の後ろに送迎や弁の情報をいれます。"9:00〜16:30 送迎 弁"のようにです。
(ぷーこ)
こんにちは。かみちゃん です。
>> 開始時刻(?)の早い順、同じ開始時刻であれば、終了時刻(?)の早い順、ショートの場合は、最後
という順番でなければいけないのであれば、
> 時間の後ろに送迎や弁の情報をいれます。"9:00〜16:30 送迎 弁"
というように 終了時刻(?)16:30 の後は、半角スペースを入れていただいて、必要な情報を続けるということができますか?
(かみちゃん) 2009/09/02 10:37
こんにちは。かみちゃん です。
大変遅くなりましたが、
>> 開始時刻(?)の早い順、同じ開始時刻であれば、終了時刻(?)の早い順、ショートの場合は、最後
の順番の並べ替えはできていないのですが、転記部分は、できましたので、一旦提案させていただきます。
[A] [B] [C] [1] [2] 日にち 2009/8/1 2009/8/2 [3] 曜日 土 日 [4] 佐藤 9:00〜16:30 9:00〜16:30 [5] 鈴木 9:00〜16:30 [6] 高橋 9:00〜16:30 [7] 田中 11:00〜16:00 9:00〜ショート [8] 渡辺 13:00〜16:00
というシートレイアウトでB2セルには、開始日を 2009/8/1 のように日付型で入力します。 C2セルには、=B2+1 D2セル〜AC2セルは、C2セルをコピー AD2セルには、=IF(AC2="","",IF(MONTH(AC2+1)=MONTH($B2),AC2+1,"")) AE2セル〜AF2セルは、AD2セルをコピー
B3セルは、=B2 C3セル〜AF3セルは、B3セルをコピー
B3セル〜AF3セルの「セルの書式設定」の「表示形式」は、「aaa」とします。
次に七曜カレンダーですが、まず以下を参考にしています。 http://www.h3.dion.ne.jp/~sakatsu/CalendarTopic.htm
具体的には、 AH2セル "日" AI2セル "月" AJ2セル "火" AK2セル "水" AL2セル "木" AM2セル "金" AN2セル "土" と入力し、 AH3セル =IF($B$2-WEEKDAY($B$2)+1<$B$2,"",$B$2-WEEKDAY($B$2)+1) AI3セル =IF($B$2-WEEKDAY($B$2)+2<$B$2,"",$B$2-WEEKDAY($B$2)+2) AJ3セル =IF($B$2-WEEKDAY($B$2)+3<$B$2,"",$B$2-WEEKDAY($B$2)+3) AK3セル =IF($B$2-WEEKDAY($B$2)+4<$B$2,"",$B$2-WEEKDAY($B$2)+4) AL3セル =IF($B$2-WEEKDAY($B$2)+5<$B$2,"",$B$2-WEEKDAY($B$2)+5) AM3セル =IF($B$2-WEEKDAY($B$2)+6<$B$2,"",$B$2-WEEKDAY($B$2)+6) AN3セル =$B$2-WEEKDAY($B$2)+7 AH15セル =AN3+1 AI15セル =AH15+1 AJ15セル〜AN15セルは、AI15セルをコピー AH27セル〜AN27セルは、AH15セル〜AN15セルをコピー AH39セル〜AN39セルは、AH15セル〜AN15セルをコピー AH51セル =IF($B$2-WEEKDAY($B$2)+29>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+29) AI51セル =IF($B$2-WEEKDAY($B$2)+30>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+30) AJ51セル =IF($B$2-WEEKDAY($B$2)+31>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+31) AK51セル =IF($B$2-WEEKDAY($B$2)+32>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+32) AL51セル =IF($B$2-WEEKDAY($B$2)+33>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+33) AM51セル =IF($B$2-WEEKDAY($B$2)+34>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+34) AN51セル =IF($B$2-WEEKDAY($B$2)+35>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+35) AH63セル =IF($B$2-WEEKDAY($B$2)+36>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+36) AI63セル =IF($B$2-WEEKDAY($B$2)+37>DATE(YEAR($B$2),MONTH($B$2)+1,DAY($B$2))-1,"",$B$2-WEEKDAY($B$2)+37) 以上のような設定をしたうえで、以下のコードを実行すれば、できると思います。
Sub Sample() Dim WS1 As Worksheet Dim vntData As Variant Dim vntResult As Variant Dim lngRow As Long Dim lngColumn As Long Dim lngRowResult As Long Dim c As Range
Set WS1 = ActiveSheet With WS1.Range("A2") vntData = .Resize(.Offset(.Parent.Rows.Count - .Row).End(xlUp).Row - .Row + 1, 32) End With ReDim vntResult(1 To 10, 1 To 32) For lngColumn = 2 To UBound(vntData, 2) lngRowResult = 0 For lngRow = 3 To UBound(vntData, 1) If vntData(lngRow, lngColumn) <> "" Then lngRowResult = lngRowResult + 1 If lngRowResult > 10 Then MsgBox vntData(1, lngColumn) & " は、10名を超えています" Exit For End If vntResult(lngRowResult, lngColumn) = vntData(lngRow, 1) & " " & vntData(lngRow, lngColumn) End If Next Next
With WS1.Range("AH3").Resize(12 * 6, 7) On Error Resume Next .SpecialCells(xlCellTypeConstants, xlTextValues).ClearContents On Error GoTo 0 For Each c In .SpecialCells(xlCellTypeFormulas, xlNumbers) If IsDate(c.Value) Then c.Offset(1).Resize(10).Value = Application.WorksheetFunction.Index(vntResult, 0, Day(c.Value) + 1) End If Next End With
MsgBox "転記を終了しました" End Sub
なお、こちらで作成したサンプルファイルを以下にアップロードしましたので、よろしかったら、参考にどうぞ。 http://kamicha1.web.fc2.com/Excel/Calendar20090831.html
(かみちゃん) 2009/09/02 16:40
こんにちは。かみちゃん です。
>>> 開始時刻(?)の早い順、同じ開始時刻であれば、終了時刻(?)の早い順、ショートの場合は、最後 > > の順番の並べ替えはできていない
これに対応してみました。以下のようなコードでできると思います。
なお、コード内で使用しているVSortM は、 二次元配列で使用できるクイックソートを過去のスレッドより検索して、以下から拝借させていただきました。 [[20080521002252]]『セル内で使われた数字の整理』(さっぱりダメ)
Sub Sample() Dim WS1 As Worksheet Dim vntData As Variant Dim vntResult As Variant Dim lngRow As Long Dim lngColumn As Long Dim lngRowResult As Long Dim c As Range Dim v As Variant Dim vv As Variant Dim vvv As Variant Dim lngIndex() As Long
Set WS1 = ActiveSheet With WS1.Range("A2") vntData = .Resize(.Offset(.Parent.Rows.Count - .Row).End(xlUp).Row - .Row + 1, 32) End With ReDim vntResult(1 To 10, 1 To 32) For lngColumn = 2 To UBound(vntData, 2) lngRowResult = 0 For lngRow = 3 To UBound(vntData, 1) If vntData(lngRow, lngColumn) <> "" Then lngRowResult = lngRowResult + 1 If lngRowResult > 10 Then MsgBox vntData(1, lngColumn) & " は、10名を超えています" Exit For End If vntResult(lngRowResult, lngColumn) = vntData(lngRow, 1) & " " & vntData(lngRow, lngColumn) End If Next Next
With WS1.Range("AH3").Resize(12 * 6, 7) On Error Resume Next .SpecialCells(xlCellTypeConstants, xlTextValues).ClearContents On Error GoTo 0 ReDim v(1 To 10, 1 To 2) ReDim lngIndex(1 To 10) For Each c In .SpecialCells(xlCellTypeFormulas, xlNumbers) If IsDate(c.Value) Then lngColumn = Day(c.Value) For lngRow = 1 To 10 v(lngRow, 1) = vntResult(lngRow, lngColumn + 1) vv = Split(v(lngRow, 1), " ") If UBound(vv) > 0 Then vvv = Split(vv(1), "〜") If UBound(vvv) > 0 Then v(lngRow, 2) = Format(vvv(0), "hhmm") & Format(vvv(1), "hhmm") End If Erase vvv End If Erase vv lngIndex(lngRow) = lngRow Next
'二次元配列の1番目から10番目を2列目をキーに昇順にソート VSortM v, 1, 10, 2, 1
lngRowResult = 0 For lngRow = 1 To 10 vntResult(lngRow, lngColumn + 1) = Empty If v(lngIndex(lngRow), 1) <> "" Then lngRowResult = lngRowResult + 1 vntResult(lngRowResult, lngColumn + 1) = v(lngIndex(lngRow), 1) End If Next
c.Offset(1).Resize(10).Value = Application.WorksheetFunction.Index(vntResult, 0, lngColumn + 1)
End If Next End With
MsgBox "転記を終了しました" End Sub
Sub VSortM(ary, LB, UB, ref, myOrd As Long) Dim i As Long, ii As Long, iii As Long, M, temp i = UB: ii = LB M = ary(Int((LB + UB) / 2), ref) Do While ii <= i If myOrd <> 0 Then Do While ary(ii, ref) < M: ii = ii + 1: Loop Do While ary(i, ref) > M: i = i - 1: Loop Else Do While ary(ii, ref) > M: ii = ii + 1: Loop Do While ary(i, ref) < M: i = i - 1: Loop End If If ii <= i Then For iii = LBound(ary, 2) To UBound(ary, 2) temp = ary(ii, iii): ary(ii, iii) = ary(i, iii): ary(i, iii) = temp Next i = i - 1: ii = ii + 1 End If Loop If LB < i Then VSortM ary, LB, i, ref, myOrd If ii < UB Then VSortM ary, ii, UB, ref, myOrd End Sub
なお、こちらで作成したサンプルファイルを以下にアップロードしましたので、よろしかったら、参考にどうぞ。 http://kamicha1.web.fc2.com/Excel/Calendar20090831.html Calendar20090902.zipのほうが、並べ替え対応版になります。
(かみちゃん) 2009/09/02 19:23
かみちゃん様
貴重なお時間を使って作成して頂きありがとうございました。 上手く使えそうです。
本当にありがとうございました。
(ぷーこ)
[ 一覧(最新更新順) ]
YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki.
Modified by kazu.