『元旦の日付表示』(田吾作) あけましておめでとうございます。 今年もよろしくお願いいたします。 セルの書式のユーザー定義書式で "d"として日付のみを表示しています。 「2014/1/4」ですと、「4」と表示されます。 ただ、元旦(1月1日)だけは「2014/1/1」で「元」と表示したいのです。 日付は1月以外はありません。全て元旦〜1月31日の日付です。 この場合は、ユーザー定義書式でどのように書式設定 すればいいでしょうか? ご教示お願いいたします。 < 使用 Excel:Excel2002、使用 OS:WindowsXP > ---- 今年限定ですが、ユーザ書式で下記を設定で可能でしょうか。 [=41640]"元";d (Mook) 2014/01/04(土) 18:59 ---- Mookさん、ご回答ありがとうございます。 毎年行う作業ですが、年一回特定のセル範囲に書式設定するだけですので ご教示いただいた式を元旦のシリアル値を変えながら使わせていただきます。 ありがとうございました。 (田吾作) 2014/01/04(土) 20:02 ---- これって、どんなカレンダーなんでしょう? 日付部分はシリアル値でないといけないんでしょうか。。。? ・対応する曜日部分があるならそちらをシリアル値として使う ・「年」を別の所で与えて、セル位置からシリアル値を求める 等出来そうにも思えますが。   (HANA) 2014/01/07(火) 11:01 ---- >これって、どんなカレンダーなんでしょう? >日付部分はシリアル値でないといけないんでしょうか。。。? >・対応する曜日部分があるならそちらをシリアル値として使う >・「年」を別の所で与えて、セル位置からシリアル値を求める >等出来そうにも思えますが。 HANAさん、ご回答ありがとうございます。 ユーザーにCtrl+;で当日の日付を入力してもらっていますので 別のセルに年を入力して日付を合成するというような方法は取 れないのです。 「元旦」〜仕事始めまではCtrl+;で日付入力後日にちの部分を 手作業で修正してもらってます。 「元旦」を「元」と表示するのは上司の「我が儘?」です。 集計が面倒になるといったのですが、「何とかせい」の一言で した。 一応解決はしているのですが、ユーザー定義書式で [=41640]"元";d とした場合は、セルにCtrl+;で日付を入力しても、マクロで IsDate(ActiveCell.Value) で日付か判定させたら False が帰ってきました。 質問時にはマクロで集計することは想定してなかったので後出し になってしまいましたが。 IsDate(CDate(ActiveCell.Value)) で判定したら True が帰ってきます。 数式バーには 2014/1/7 と日付形式で表示されています。 MsgBox ActiveCell.Value でセルの書式が日付形式のセルは 2014/1/7 と返ってきますが、 書式が [=41640]"元";d  のセルは 41646 と返ってきます。 そこで、 セルがブランクの場合は無視 セルの書式が [=41640]"元";dの場合は日付セルと判定する セルの書式が日付形式の場合は日付セルと判定する セルの値が単なる数値や数値以外は無視する という線で選択セル範囲の日付ごとの数をカウントするという コードを組んでみました。 これは単なるご報告でして新たな質問とかではありません。 コードには突っ込みどころが満載だとは思いますが・・・。 Sub test() Dim mydic As Object Dim kys As Variant Dim ky As Variant Dim r As Range Dim c As Range Dim cnt As Integer Dim mydate As Date Set mydic = CreateObject("Scripting.Dictionary") If TypeName(Selection) <> "Range" Then Exit Sub Set r = Selection For Each c In r 'セルがブランクではなく、かつ、数値の場合 If IsNumeric(c.Value) = True And c.Value <> "" Then 'セルの書式が[=41640]"元";dの場合 If c.NumberFormatLocal = "[=41640]" & """" & "元" & """" & ";d" Then '日付の取得 mydate = CDate(c.Value) '日付がDictionaryに格納されていたら If mydic.exists(mydate) Then 'カウントアップ cnt = mydic(mydate) cnt = cnt + 1 'Dictionaryのアイテムのカウントを置換え mydic(mydate) = cnt Else 'Dictionaryに追加 mydic.Add mydate, 1 End If End If '日付形式の場合 ElseIf IsDate(c.Value) = True Then mydate = c.Value If mydic.exists(mydate) Then cnt = mydic(mydate) cnt = cnt + 1 mydic(mydate) = cnt Else mydic.Add mydate, 1 End If End If Next c Set r = Nothing 'キー kys = mydic.keys 'アイテム ky = mydic.items 'キーの転記 Worksheets(2).Cells(1, 1).Resize(UBound(kys) + 1).Value = WorksheetFunction.Transpose(kys) 'アイテムの転記 Worksheets(2).Cells(1, 2).Resize(UBound(ky) + 1).Value = WorksheetFunction.Transpose(ky) Erase kys Erase ky mydic.RemoveAll Set mydic = Nothing End Sub (田吾作) 2014/01/07(火) 22:44 ---- カレンダーの様なものではなく 実績(?)入力の様なものなんですね。 で、1月の日付が入る可能性があるセル全体に その月の一月一日の日付を指定して「元」と表示させるような書式を設定するのですか? つまり、1月のシート(?)の場合 ご呈示のコードでは必ず >If c.NumberFormatLocal = "[=41640]" & """" & "元" & """" & ";d" Then で、Trueの方に分岐する? それとも、入力が終わった後 1日のセルだけ見つけて そのセルにだけ書式を設定するのですか? >セルの値が単なる数値や数値以外は無視する という事ですが、実際は 日付が入力される範囲には 日付しか入力されないのでは? ・・・という印象なんですが、どうなんでしょう? 入力前に書式設定をするのであれば [=41640]"元";d を設定してあるセルは、日付が入力される(あるいは入力されたものは日付である) というセルなんですよね?   (HANA) 2014/01/09(木) 23:30 ---- 最初の質問のセルに書式を設定する部分は上司の指示による物です。 下記のような表がありまして、日付の部分にCtrl+;で当日の日付を入力します。 B C D E F G H I 2 名前 日付 名前 日付 名前 日付 3 AA 2012/1/3 AA 2013/1/1 BB 2014/1/2 4 BB 2012/1/9 CC 2013/1/5 CC 2014/1/1 5 CC 2012/1/5 DD EE 2014/1/10 6 DD GG 2013/1/3 GG 7 EE 2012/1/1 HH 2013/1/4 JJ 2014/1/3 この日付の部分を表示上は日にちだけにし、かつ、元旦は「元」と表示するように、との指示でした。 これは、2014/01/04(土) 18:59のMookさんのご回答で解決しております。 その後のマクロの部分は、私が私的にいつも使っている 「セル範囲を選択してその中に日付ごとのセルの数をカウントするマクロ」(このマクロは上記の表 以外でも使用する汎用的なものです) で試しに上記の表全体を選択した状態で実行したらカウントがおかしくなったので調べてみたら新し い書式「[=41640]"元";d」を設定した部分が日付とし認識されていないというのがわかってコード を修正した物です。 ですので、当初の質問とは全く無関係です。 検索等でこのスレッドを見た方にこの書式を設定したセルはIsDateではFalseが返ってくるので工夫が 必要になる、という注意喚起のつもりでコードをアップさせていただきました。 また、私の環境では、当面は日付は通常の日付形式と今回ご教示いただいた「[=41640]"元";d」形式 のみです。 また、マクロの結果によって元の表を変えたりすることは有りません。というか、変える事は認めら れておりません。 あくまでも私が使っている日付カウントのマクロは今回の表とは無関係に存在しております。 (田吾作) 2014/01/10(金) 11:14 ---- 当初の問題が解決していて、田吾作さんにとって この話を続けることに意味がないのは分かっているので つきあわせてしまって申し訳ないです。 最初に書いてある >日付は1月以外はありません。全て元旦〜1月31日の日付です。 と言うご説明から、フォルダやブック名、シート名 等から セルに入力された日付が、何年何月のものであるのかは 分かるようになっているのではないかと推測しました。 また、入力に連動して曜日の表示が必要であるなら 年月情報がシート上に無く 日付の入力がシリアル値でない場合 曜日を表示させる事が困難になると思い 状況をお伺いしましたが そういった事も無い様です。 同様に、計算式等が作成してあり 計算基準が入力される日付(シリアル値)になっているなら これを変えてしまうのは その他の仕組みを変える事になるので難しいかと思いました。 が、集計はマクロで行っておられる様です。  マクロであれば、パス等から年月を抜き出し、セルの値と合わせて  年月日を特定するのは、そう難しくなく出来るのではないかと思いました。 マクロのコードを見させてもらうと、1月に関しては 単純に入力されている値をシリアル値とみなして集計に使っている様です。 となると、当初から思っていた 「別にシリアル値で入力しなくても良いんじゃない?」 と、強く感じます。 日付のみを入力してもらう事にすれば、セルの書式は [=1]"元";0 で良くなるので 年がかわっても、書式を変更する必要は無くなります。 >毎年行う作業ですが、年一回特定のセル範囲に書式設定するだけ ですが、だからこそもし自分がやるとするなら「避けたい仕組み」に分類されます。 もちろん、他との兼ね合いや周知等 色々な事情を検討した上で 「年一回書式を設定する」を、選んでおられるのかもしれません。 より詳しく状況をしれば私自身も「書式を設定するのがベストだ」 と言う結論に達するかもしれません。 大いなる推測から書いている事ですので、ご参考まで。 長々とおつきあい頂き、ありがとうございました。   (HANA) 2014/01/10(金) 13:50 ---- >マクロのコードを見させてもらうと、1月に関しては >単純に入力されている値をシリアル値とみなして集計に使っている様です。 >となると、当初から思っていた >「別にシリアル値で入力しなくても良いんじゃない?」 >と、強く感じます。 この表は集計は不要なものです。集計してみたのは、私のいつも使っている集計 マクロで集計できるかを試しに行ったまでのことです。 それでうまく集計できなかったのでコードをこの表に合わせて変えてみた、という だけのことです。 先にも書きましたが、この日付入力表と私のマクロは全く無関係に存在しております。 また、この日付入力表はエクセルに(というかパソコン自体に)詳しくない人にも使え るように、また、入力間違いが起こらないようにいつも同じ操作で当日の日付を入力 出来るように、という上司の指示でCtrl+;で当日の日付を入力するようにしてあります。 日にちを数字キーで入力、というのは信じられないかもしれませんが、当方の従業員の パソコンのレベルからいうと非現実的です。 マクロでコマンドボタンをクリックしたら日にちが入る、というのも具申しましたが、 この表にマクロを組み込むのはダメ、とのことでした。別ブックのユーザーフォーム からの入力用ブックを制御、も却下されました。 私は昨年まではこの表にタッチしてませんでしたが、今年から日付入力の前準備だけを するように指示されました。日付入力自体にはタッチしていません。 前準備、というのは、今年の部分の名前の入力と日付入力セルの書式設定です。 なお、この表はこちらから年賀状を差し出した相手先からこちらがいつ先方の年賀状 を受け取ったかという日付を管理しているようです。 数年続けて返信がなかった差出先の次年度からの差出をやめる判断にも使っているとの ことでした。(条件付き書式を使用して差し出したけど返信がなかった相手先にはセルの 背景に色が着くようになっています) それなら別に「元」という表示じゃなくてもいいじゃないかと思われるかもしれませ んが、それは単なる上司の拘りのようです。特に理由はないと思います。 今日も一件年賀状を受け取りました。例年、15日前後までは受取りがあるようです。 (田吾作) 2014/01/10(金) 23:28 ---- こんにちは。 面白い現象ですね。 たぶんエクセル君としては、書式のなかで数値と比較して云々している以上 このセルの値は数値! という感覚なのでしょう。 数式バーに出ているあたいを拾えるといいのですが。ちょっと思いつかないです。 かわりに一点だけアドバイスします。 > If c.NumberFormatLocal = "[=41640]" & """" & "元" & """" & ";d" Then このコードだと 41640 の部分を毎年書き換えないといけないので If c.NumberFormatLocal Like "*]" & """" & "元" & """" & ";d" Then ( 佳 ) 2014/01/11(土) 09:23 ---- 厳密な判定ではなくなりますが、 If c.Text = "元" Then 程度でも良いかも。 (Mook) 2014/01/11(土) 19:14 ---- >> If c.NumberFormatLocal = "[=41640]" & """" & "元" & """" & ";d" Then >このコードだと 41640 の部分を毎年書き換えないといけないので > If c.NumberFormatLocal Like "*]" & """" & "元" & """" & ";d" Then そうでした。今年分から担当しはじめたので来年以降のことが頭にありませんでした。 ありがとうございます。 >If c.Text = "元" Then >程度でも良いかも。 今回の表ではないですが、文字列で「元」と入力している場合も考えられますので、 FormulaやValue、Textを組み合わせて考えてみます。 他にはDate関数やDateValue関数を使用して日付にしている場合にも対応するものに 作り上げていく予定です。これは今後の課題として自分で考えて見ます。 ご回答いただきましたMookさん、HANAさん、佳さん、ありがとうございました。 (田吾作) 2014/01/15(水) 22:51