- ベストアンサー
Excel VBAで曜日から西暦を割り出す方法
- エクセルの日付データには西暦を除いた日付情報が文字列として入っていますが、VBAで曜日から西暦を割り出す方法はありますか?今年以外の日付が2013年になってしまう問題も起きます。
- VBAのサンプルコードで日付型に変換する際、去年も2013年になってしまう問題が発生しています。手掛かりになるのは曜日ですが、曜日から西暦を割り出す方法はありますか?
- Excelのデータには西暦を除いた日付情報が文字列として入っており、VBAでこれを日付型に変換しようとしています。しかし、今年以外の日付も2013年になってしまう問題があります。曜日から西暦を割り出す方法をご教授いただけませんか?
- みんなの回答 (6)
- 専門家の回答
質問者が選んだベストアンサー
例えばA列にお示しのようなデータが文字列として入力されているとしたら、その日付をB列に2013/5/24のように表示させるためには次のようなマクロにしたら良いでしょう。 Sub Sample() Dim str As String Dim m, n, x, y, d, Mo, i As Integer Dim Da, Tye As Date Dim w As String m = Range("A65536").End(xlUp).Row For n = 1 To m If InStr(1, Range("A" & n), "月") > 0 Then str = Range("A" & n) x = InStr(1, str, "月") y = InStr(1, str, "(") d = InStr(1, str, "日") w = Mid(str, y + 1, 1) Mo = Left(str, x - 1) Da = Mid(str, x + 1, d - x - 1) For i = 2005 To 2013 Ye = DateSerial(i, Mo, Da) We = WeekdayName(Weekday(Ye), True) If We = w Then Tye = DateSerial(i, Mo, Da) Range("B" & n) = Tye Exit For End If Next End If Next End Sub
その他の回答 (5)
- Nouble
- ベストアンサー率18% (330/1783)
迂闊なことを云います、済みません 365日を1週間で割ると1日余ります。 加えて閏年では366日あります。 つまり4年で凡そ5日ずれる訳です 1年に直すと約365.242199日ずれる訳ですね。 (※注:ウィキペディア「閏年」の項より抜粋) 直近の閏年を探し出す。 その年の指定日の曜日を調べる (※注:去年が閏年ですよね、なので去年の5/24日は木曜日ですね) 期日の曜日とのずれが 曜日にして何日分ずれているかを調べる (※注:まあ… 6日以内でしょうね) ずれ日数が、Mod(1.242199n,7) + 1と一致するnを求めれば良い気がします。 気がするだけですが… 滝汗 お騒がせしました。 m(_ _)m
お礼
どうもありがとうございました。
- MarcoRossiItaly
- ベストアンサー率40% (454/1128)
対象の期間を 100 年以内などに限定しない場合、グレゴリオ暦は 400 年の周期です。うるう年の複雑なルールのせいで、「全体の周期は」400 年です。 しかし、「ある年のある 1 日と」同じ月日で同じ曜日というだけなら、400 年も待たなくても、その間に繰り返し登場してくるのですね。No.2 さん、No.3 のおっしゃるとおりです。 うるう年が問題にならない 1900 年~ 2100 年のうち Excel が日付と曜日を正しく計算できる「1900 年 3 月 1 日~ 2100 年 2 月 28 日」という範囲で計算する限りは、5 年、6 年、または 11 年の間隔で同じ月日・曜日となります。400 年という全体の周期は、この 3 種類の小さな間隔が周期的に組み合わさってできています。 つまりご質問の課題は、このままでは条件不足により、不可能です。 しかし例えば「同じ月日・曜日である日のうち最も新しい日」という条件であれば、No.1 さんのコードで求められますね。step -1 と exit for という記述があるので、最新の日のみとなります。1 年が 365 日くらい、同じ月日・曜日の日が現れる頻度が 11 年以内ならば、データ処理量的にも 4,000 行くらいですから、大したことではありませんね。
お礼
どうもありがとうございました。
- matyu1003
- ベストアンサー率42% (257/598)
今日5月25日は土曜日ですが、2002年や2019年も同様でした。万年カレンダー、で検索していただければわかるかと思いますが、曜日からだけでは年を確定することはできません。 なので、日付が順に並んでいることを前提に、日付から年を推定するとかいうのが現実的かと。 Sub Sample() Dim str As String str = "5月24日(木)" '2012年 str = Left(str, Len(str) - 3) str = CDate("2012年" & str) MsgBox (str) End Sub でやってみると、2012/05/24 になりますので、これを参考に、表を年ごとに分割してVBAを走らせてはどうでしょうか?あるいは、セルを1行増やして、そこに年を入れちゃうというのでもいいですが。
お礼
どうもありがとうございました。
- soixante
- ベストアンサー率32% (401/1245)
>曜日から西暦を割り出す方法 例えば、 5月24日が金曜日の年は? として、2013年、と返ってこればいいのでしょうが、 さかのぼっていけば、2002年も1996年も該当しますので一意に決めることはできないでしょう。 そもそも、そのデータは「西暦を除いた日付情報が文字列」として入っている、ということですが、 では、それを使う人は、どのようにして西暦を判別しているのですか? もしシートごとに年が違うのならば、別の方法になるでしょうし、 時系列に並んでいるだけならば、これまた別の方法になるでしょうし、 全くランダムに入っているというのは考えにくいかと思うのですが。
お礼
どうもありがとうございました。
- keithin
- ベストアンサー率66% (5278/7941)
チカラワザでやっつけてもさほどの事ではないです。 A1以下に文字列が記入されているとして sub macro1() dim h as range dim y as integer dim md as string dim w as string for each h in range("A1:A" & range("A65536").end(xlup).row) if h <> "" then w = strconv(right(h.value, 3), vbnarrow) md = left(h.value, len(h.value) - 3) for y = 2013 to 2003 step -1 if format(cdate(y & "年" & md), "(aaa)") = w then h.offset(0, 1) = cdate(y & "年" & md) exit for end if next y end if next end sub
お礼
どうもありがとうございました。
お礼
どうもありがとうございました。