• ベストアンサー

エクセルマクロで日付から曜日を取得する方法

エクセルマクロで日付から曜日を取得する方法ですが、 例えば、2008/8/19 の様な書式ですと、 Dim a As Date a = Date Range("$A$1") = a Range("$A$2") = Weekday(a) Range("$A$3") = WeekdayName(Weekday(a)) このように記述すると簡単に取得できたのですが、 08.19.2008の様な書式ですと、 エラーが出て変換ができません。 何か良い方法はありませんでしょうか? 当方、完全に初心者です。 よろしければ、素人でもわかりやすいように 御教示いただけましたら幸いです。

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

  • ベストアンサー
  • redfox63
  • ベストアンサー率71% (1325/1856)
回答No.3

『.』を『/』に変換してやれば 日付として認識できるでしょう ただし 年月日をすべて2桁で入力した場合年月日の要素を誤認する場合があるので気をつけましょう たとえば 2008/8/9を 08.09.2008と入力した場合は正しいのですが 08.09.08と入力してしまうと2008/9/8と認識してしまいます これは コントロールパネルの設定の国の設定に依存するためです Sub Macro1   dim ss as string, oDat as date   ss = Range( "A1" ).Value   ss = Replace( ss, ".", "/" )   oDat = DateValue( ss )   Range( "A2" ).Value = Weekday( oDat )   Range( "A3" ).Value = WeekdayName( WeekDay( oDat ) ) End Sub

qchan2007
質問者

お礼

御回答、ありがとう御座います。 この方法でうまく変換することが出来ました!! #1の方の方法かどちらかでやらせていただきたいと思います。 少し不思議に思ったのは、08/19/2008でも、2008/08/19でも 同じシリアル値になるのですね。

その他の回答 (4)

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.5

#4です。データが確実に08.19.2008のような月、日、年の順なら またピリオドで区切られているなら A1セルにデータがあるとして Sub test01() d = Split(Cells(1, "A"), ".") dt = DateSerial(d(2), d(0), d(1)) MsgBox Weekday(dt) MsgBox WeekdayName(Weekday(dt)) End Sub というやり方もある。

qchan2007
質問者

お礼

御回答、ありがとう御座いました。 又、今後、参考にさせていただきたいと思います。

  • imogasi
  • ベストアンサー率27% (4737/17069)
回答No.4

これはVBAコードなど以前の問題でしょう。 エクセルは一般的に年、月、日の区切りをスラシュ、ハイフン。ピリオドで区切って入れられますが、(多分、国別日付設定のせいと思うが)年、月、日の順を任意に並べて入力した場合、エクセルで日付と 認識されない場合がある(これは仕様でどうしようもない)。 >書式の問題ではなく、入力データそのものの問題です。書式は、セルに正しく日付シリアル値に設定されて後の段階の問題です。 だから質問のように入力されると予想設定は危険や処理の難しさがあるということです。こういうのは出来るだけ避けるべきです。 入力者に絶対守られる保証はあるのでしょうか。 日付を受け付ける場合は、年、月、日を入力者に認識させて(従って受付テキストボックスなどを分けて、行うべきと最近思う。 内容的に入力者との齟齬がなければ VBの関数Datesirial関数やDatevalue、Day、Month、Year関数でなんとでもなると思う。

qchan2007
質問者

お礼

御回答、ありがとう御座います。 入力データはだれかが入力するのではなく、取得先のデータが このような書式になっているので、それを変換するしか方法が ありません。

  • KenKen_SP
  • ベストアンサー率62% (785/1258)
回答No.2

こんにちは。 #1 ご回答のとおりですが、08.19.2008 のピリオドをハイフン(-)に 置換しても、CDate でシリアル値に変換できそうですよ。 シリアル値に変換できれば、Format でも日本語の曜日は取り出せます。 Sub sample()   Dim d As Date   d = CDate(Replace$("08.19.2008", ".", "-"))   MsgBox Format$(d, "aaaa") End Sub

qchan2007
質問者

お礼

御回答、ありがとう御座います。 やってみましたが、この方法でもうまく変換することが出来ますね。 ただ、"08.19.2008"の部分を変数にすると実行時エラーが出てしまい ましたので、#1か#3の方の方法に落ち着きそうです。

  • n-jun
  • ベストアンサー率33% (959/2873)
回答No.1

セルに08.19.2008と打ち込んで、セルの書式設定>日付で書式を変更しても 何も変化が起きないと思います。 Excelがそのデータを日付と認識できないからでしょう。 認識できる方法で行なうか、認識させる方法をとるかですけど。 文字列”08.19.2008”から年・月・日をそれぞれ取り出して、 DateSerial 関数でシリアル値を取得してあげればいいのでは? Sub test() Dim a As Date Dim st As String st = "08.20.2008" a = DateSerial(Val(Mid(st, 7, 4)), Val(Mid(st, 1, 2)), Val(Mid(st, 4, 2))) MsgBox WeekdayName(Weekday(a)) End Sub

qchan2007
質問者

お礼

御回答、ありがとう御座います。 この方法でうまく変換することが出来ました!! #3の方の方法かどちらかでやらせていただきたいと思います。 ただ、7,4 1,2 4,2 の数字の意味は全くわかりませんでした。

関連するQ&A