• ベストアンサー

VBA 日付リテラル表記について

いつもお世話になっております。 VBA初心者です。 VBAを勉強中なのですが、私の使っている参考書に日付のコードに関して#3/19/2014#と日付リテラルで表記するようにとの記載がありました。 試に慣れ親しんでいる”2014/3/19”とコードを記載しても同様に動作しました。 参考書には何故?日付リテラル表記にするか記載がありませんでしたので、この場を借りて質問させていただきます。 日付リテラル表記にする理由とは何でしょうか? 初歩的な質問で申し訳ありませんが、よろしくお願いいたします。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.6

#3の回答者です。 あくまでも、日付リテラル値「#3/19/2014#」は、VBEditor上にしか代入されません。従って、実際のプログラミングでは、日付リテラル値は使いません。 実際の入力に関して、「年,月,日」と明示的に分かるようにして入力させるのが正しいプログラミングの書き方です。VBAではそうした書法は言いませんが、VB6やVB.Netでは、使わないという約束事になっています。 アジア圏の場合は、概ね、"2014/3/19"(または、"2014/03/19")と書けばよいわけです。アメリカン・スタイルやヨーロッピアン・スタイルでは、また、これが変わります。これは、コントロールパネルの「地域と言語」のスタイルに合わせて入力をさせるのが書法です。 実際の場で、日付値を扱う時は、丁寧に書けば、以下のような対話型スタイルになりますが、対話型を省いたとしても、いくつかのチェック機能を備えるのが、実践のプログラミングの基本です。これは、常識的な話だと思いますが、ここの掲示板では、素に近いコードで済ませることも多いので、人によっては、避けるられるヒューマンエラーも、結果任せというかもしれません。それは、それで仕方がありません。 '// Sub DateTest()  Dim myDate As Variant  Dim rtn As VbMsgBoxResult  myDate = Application.InputBox(Prompt:="日付をyyyy/mm/ddのスタイルで入力してください.", Type:=2)  If IsDate(myDate) = False Then '第1関門   MsgBox "それは日付として認められません." & _   vbCrLf & "やり直してください.", vbExclamation   Exit Sub  Else   myDate = CDate(myDate)   rtn = MsgBox("あなたが入力したのは、" & Format(myDate, "yyyy年M月d日") & "ですか?", vbOKCancel + vbQuestion) '第2関門   If rtn = vbCancel Then    MsgBox "もう一度入力し直してください."    Exit Sub   Else   'continued....   End If  End If End Sub

genta1019boston
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (5)

回答No.5

Excel2010での簡単なテスト(標準モジュールです) Sub test1() Dim t As Date t = "2000/2/29" MsgBox t + 1 End Sub Sub test2() Dim t As Date t = #2/29/2000# ’入力直後に 2000/2/29 → 2/29/2000 になります MsgBox t + 1 End Sub Sub test3() Dim t As Date t = "2001/2/29" MsgBox t + 1 End Sub Sub test4() Dim t As Date t = #2/29/2001# MsgBox t + 1 End Sub 2000/2/29 はうるう年です。 test1・2 ともにエラーにはなりません。 ちゃんと、2000/3/1 を返してくれます。 では、test3・4のように、2001/2/29 とした場合。(うるう年ではありません) test3 ではコンパイルエラーにもなりません。 『実行した場合に初めて』、『型が一致しません』のエラーになります。 test4 では入力直後に、赤く表示されます。 また、コンパイルエラー(構文エラー)になります。 もちろん、うるう年だけではなく大の月小の月でもチェックされます。 実行されて初めてエラーが露見するのと予め教えてくれるのとどちらを選びますか? ExcelやAccessのVBAが気を利かしてやってくれていますが、 (Date 型で宣言しているのに文字列の"2000/2/29"を渡しても 「ああ、多分日付じゃないかな、日付にしてしまおう」とVBAが行います。) この『暗黙の型変換』に頼っていると思わぬ時にしっぺ返しを喰らいますよ。

genta1019boston
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
回答No.4

こんにちは。 >私の使っている参考書に日付のコードに関して#3/19/2014#と日付リテラルで表記するようにとの記載がありました。 参考書の記載が、正確にはどう書かれてあったかは知りませんが、「日付リテラル値」で書けというのは、ありえません。そうだとしたら、基本的なことを知らない人だと思います。VB系のプロ用の書法では、リテラル値の禁止事項がありますが、一般ユーザーに対しても、それを使えという教えはないと思います。 そのまま入力すれば、日付値は、チェック機能が必要なことが多いのです。 最低限度、年数は適正か(入力された年数は、例えば、5年以内か)ということです。このように、二点の確認コードが必要になってしまいます。ただ、一般の人は、どうでもよいかもしれませんが、セミプロレベルになれば、そうは言えません。 もちろん、#14/3/19# というのは正しいリテラル値の表記ではありませんが、リテラル値で入力するれば自動的に変わるはずです。VBAは、基本的に米国方式になっていますから、#月/日/年# という順番になっていることが多いのですが、それが、アジア圏では正しいというわけではありません。期待した日付値になっているか、確認しなければならないという手間が生じてしまいます。 >試に慣れ親しんでいる”2014/3/19”とコードを記載しても同様に動作しました。 これが正しい入力方法だと思います。理由は、使用者や作成者が、入力した時点で視認できるからです。言い換えれば、可読性が高いのです。 VBAの場合は、(ユーザー)フォームやセルから、日付値を取りますが、セルの場合は、すぐさま確認できます。フォームの場合は、テキスト入力で、私達が慣れ親しんだ、「年/月/日」を入力するはずです。入力した値を、Date型変数に入れるか、CDateにして変換するかという方法を取れば良いわけです。 再度申しますが、VBEditor上で直接書く場合は別として、実務上、日付リテラル値をそのまま扱うということはありません。

genta1019boston
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8560/19455)
回答No.3

もう一つありました。 それは「実行環境のロケールを気にしなくて良い」と言う点です。 日付リテラルで書かくと、プログラムの内部コードには「日付シリアル値」で記録されます。 そのプログラムを「年/月/日で表記する環境」に持って行っても、「月/日/年で表記する環境」に持って行っても、表記が違って見える事はあっても、日付シリアル値になっているので誤解は生じません。 しかし「文字列で書いてしまう」と、環境によって「その文字列が正常に日付シリアル値に変換されるとは限らない」のです。 例えば、OSの「日付表現の設定」が変更されてて「月/日/年の表記しか許さない状態」になった環境に、文字列で"2014/3/19"と書かれたプログラムを持ってきて実行したら「実行時エラー」が出てしまう可能性があります。 文字列で書くと「環境に依存してしまい、他のパソコンで動かないかも知れない」ですが、日付リテラルで書けば「環境に依存しないので、他のパソコンで正常に動く可能性が高くなる」のです。 もちろん「書いたプログラムを自分のパソコンででしか使わない」と言うなら、環境依存性は気にしなくても良いですが、仕事で使うなら、そうも言っていられません。

genta1019boston
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8560/19455)
回答No.2

因みに、年月日に「誤解される余地のない値」を指定する場合、例えば #2014/3/19# のような場合「年/月/日」の順で書く事が可能です。 標準では「月/日/年」ですが、上記のように「最初の数字が年なのが明らかで、最後の数字が日なのが明らか」な場合に限り「年/月/日」と解釈されます。 但し #12/1/2# のように「月/日/年」と「年/月/日」のどっちにも解釈できてしまう場合は、予期しない値になるので注意が必要です。

genta1019boston
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。
  • chie65535
  • ベストアンサー率43% (8560/19455)
回答No.1

>日付リテラル表記にする理由とは何でしょうか? 実行時に文字列を日付シリアル値に変換する必要が無いからです。 文字列で指定した場合、実行時に、文字列を解釈して、日付シリアル値を生成してから、生成された値が使われます。 日付リテラルで書けば、この「文字列を解釈して、日付シリアル値を生成して」と言う処理は行われません。 1箇所くらいなら実行速度に影響は出ませんが、ループで10万回くらい実行される部分にあったら、実行速度に大きな差が出ます。

genta1019boston
質問者

お礼

ありがとうございます。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • EXCEL VBAの日付関数について

    EXCEL VBAの日付関数のことでお聞きしたいことがあります。 エクセルの関数でワークデイ関数がありますが、例えば C1セル: =WORKDAY(A1,10,B1:B10) これをVBAのコードで書くと、どういうコードになるのでしょうか。 VBAの関数については詳細に書かれたテキストを持っておらず、WorksheetFunctionを使ってチャレンジしてみましたが どうも上手くいきませんでした。 初歩的な質問かも知れませんが、どうぞよろしくお願いいたします。

  • ただ、今日の日付を求めたいときはどちらのVBAコー

    VBA初心者のため教えてほしいのですが ただ、今日の日付を求めたいときはどちらのVBAコードを使えばいいですか? Sub test1() MsgBox DateValue(Date) End Sub Sub test2() MsgBox Date End Sub です。 ご教授よろしくお願いします。

  • VBAの学習について(VBAエキスパート)

    いつもお世話になっております。 VBAの勉強を始めて半年程度の初心者に毛が生えた程度のものです。 仕事での作業を楽にしたい!!と思い半年程前にVBAの学習を始めました。 私の周りにはVBAの習熟者が皆無のため、ネットや書籍『・・・すぐわかる』『・・・ツボとコツがゼッタイわかる・・・』などの本を参考にある程度、当初の要望に応えられるコードを書けるようになったと思っています。(もっとも、習熟者から見れば汚いコードかもしれませんが・・・) 具体的には ・各シートのデータを配列変数に格納して、総括表に転記して、日付順に並び替え ・ユーザーフォームを使っての制御 ・簡単なデバッグ 程度だと思います。 折角学習したので今後も継続してスキルアップを目指し、綺麗なコードが書けるようになりたいと考えています。 そこで2点ほど質問があります (1)継続学習の良い参考書やサイト(練習問題があるような) 実用的な例題や解説が多数掲載されているような書籍やサイトはありますでしょうか? 本屋に見に行くのですが、初歩的な本と、辞書的な重厚な本は見かけるのですが、その中間的な書籍は見当たりません。 (2)VBAエキスパートの資格取得を考えています。 公式テキストがあるようですが・・・これっていかがでしょうか?? 2009年以降改定されていないようで、近所の書店には置いてないため、現物を見る事が出来ません。資格取得を考えるなら購入するべきでしょうか? 纏まりのない文章で申し訳ありませんが、よろしくお願いします。

  • VBA での日付の計算

    お世話になってます。 Access VBA 初心者です。 string型変数に日付(YYYYMMDD)がセットされています。 その日付に1日プラスした日付を算出したいのですが、 どうすればよいのかよく分かりません。 たとえば Dim w_Date As String w_Date = "20070726" としたならば、 w_Dateは"20070727"となるようにしたいのですが。。。 よろしくお願いいたします。

  • VBAのコードについて

    いつもお世話になっております。 VBAを勉強中の初心者です。 以下の動作をするVBAコードを御教授ください。 添付ファイルのように シート記事数のB列に新聞名 C列に記事数が記載されているシートがあります。 例えば、下野新聞の記事数が3の場合は、下野新聞の行が3行作成されるようにしたいのですが。 どなたかご指導よろしくお願いたします。

  • VBAとVBはどう違うの?

    大変初歩的な質問で申し訳ありません。 最近エクセルでVBAを使って簡単なマクロを組む勉強を始めましたが、参考書などを呼んでいると出てくるVBとVBAはどう違うのでしょうか? また、VBを使ってプログラミングするにはVBのソフト(?)をインストールする必要があるのでしょうか?宜しくお願い致します。

  • セルの書式設定(日付型)をエクセルVBAでするには

    非常に初歩的な質問で申し訳ないのですが、通常エクセルで右クリック→セルの書式設定→日付とするのをVBAでやる方法を教えて下さい。 できれば列全体を一度に行いたいのですが・・。 すみませんが、分かる方お願いします。

  • エクセルの数字表記について

    いつもお世話になっております。 基本的なことなのですが、、、とあるシステムからデータからエクセルにデータをダウンロードしました。 その中で、4桁のコード(数字)があるのですが、頭が0だとそれが表記されなくなってしまいます。 例えば、0020というコードだと、20としか表記されずに頭の00が消えてしまいます。 頭が0の部分を表示させて常に4桁で表示させるためには どのようにしたらよろしいのでしょうか? 初歩的な質問で申し訳ありませんが、ご教示頂きたくよろしくお願いします。

  • Access VBA について

    お世話になっております。 Access VBAを勉強しております。 テキストボックスに漢字とひらがなしか入力できないようにするにはどうすれば良いでしょうか。 Select Case等を使ってできないでしょうか。 初心者のため初歩的な質問で恐縮ですが、ご教授お願いします。

  • 日付が動的なプルダウンを作りたいのですが。。。

    いつもお世話になっております。 プログラミング超初心者で、ただいま勉強中です。 jspで、日付(年と月)が、動作させている当日の日付に動的に作動するようなプルダウンを作りたいのですが、 ”動的に”という部分がうまくいきません。 普通のプルダウンは作れるのですが。。。どなたか、作り方を教えていただけますでしょうか? よろしくお願いします。

このQ&Aのポイント
  • 衆議院選挙で比例代表投票用紙に「民主党」を書いたら、どうなるのでしょうか?
  • 投票所での投票では、小選挙区、比例代表、国民審査の3回の投票が行われます。
  • しかし、比例代表の投票用紙に「民主党」と書いた場合、具体的にはどうなるのでしょうか?
回答を見る

専門家に質問してみよう