[[20160222094719]] 『和暦を西暦になおす方法』(のりとり) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『和暦を西暦になおす方法』(のりとり)

はじめまして

vba初心者の私が問題に直面しましたので、ご質問させていただきます。

  A| B| C| D| E・・・・・
1平|1 | 1| 1|○・・・
2平|2 | 2| 2|○・・・
3平|3 | 3| 3|○・・・
4昭|50| 4| 4|○・・・
5平|4 | 5| 5|○・・・

以上のように4行にわかれて和暦で生年月日が表示されておりその後ろにもデータが存在しています。(大正生まれの方はいないと思いますが対応しておいたほうがいい?)

これを

   A     | B・・・
1 1989/1/1|○・・・
2 1990/2/2|○・・・
3 1991/3/3|○・・・
4・・・・・・・・・・|○・・・
5・・・・・・・・・・|○・・・

このように一行に西暦表示をさせて、行を詰めたいのです。

質問する上で、まず自分なりに考えてみたのですがさっぱりでした。

なにとぞ、ご教授のほどよろしくお願い申し上げます。

< 使用 Excel:Excel2007、使用 OS:Windows7 >


 行じゃなくて列ですよね?

 どこか空いてる列に
 =CONCATENATE(CHOOSE(MATCH(A1,{"平","昭","大"},0),"平成","昭和","大正"),B1,"年",C1,"月",D1,"日")*1
 として値で保存し、置き換えたあと、A〜D列を消すではだめなの?

 VBAの必要性を感じないのだけど・・・
(稲葉) 2016/02/22(月) 10:20

 =(SUMPRODUCT(({"大","昭","平"}=A1)*{1911,1925,1988})+B1&"/"&C1&"/"&D1)*1
 や
 =(INDEX({1911,1925,1988},FIND(A1,"大昭平"))+B1&"/"&C1&"/"&D1)*1
 でも。
(ねむねむ) 2016/02/22(月) 10:32

回答ありがとうございます

データの量が少ないとお二方の言うような関数でも対応可能だとは思いますが、
何百行とデータがある場合VBAでやるべきと判断したのですが・・・

あと、今のままだと西暦表示にはなっておりませんが、その変換方法もお教えいただきたいです。
申し訳ありませんがお願いいたします
(のりとり) 2016/02/22(月) 10:55


 私のやるとした場合はまずE列に空列を挿入、E1セルに式を入力、E1セルを選択した状態でマウスカーソルをE1セルの右下に持っていき
 黒十字状態になったらダブルクリック。
 これで最終行まで式が入力されるのでE列を選択してコピー、値の貼り付け、最後にA列からD列を削除。

 なので件数による手間の違いはなし。

 >あと、今のままだと西暦表示にはなっておりませんが、その変換方法もお教えいただきたいです。 
 これはセルの書式設定で日付に設定。
(ねむねむ) 2016/02/22(月) 11:07

 これ以上、数式案を出すのも気が引ける、
 と言いつつ・・・

 =(MID("TSH",FIND(A1,"大昭平"),1)&B1&-C1&-D1)*1

 平成の次の元号の頭文字がどうなるかなんてわからないので
 とりあえず大正〜平成までならってことで。

 ついでに

 =DATE(B1+CHOOSE(FIND(A1,"大昭平"),1911,1925,1988),C1,D1)

 でも。
(笑) 2016/02/22(月) 12:13

 VBAでやる必要性はありませんが、
 関数だと、(平■1■1■7)は存在しませんが、【=1989/1/7】と表示されちゃいますね(汗)
 「のりとり」さんの例にある(平■1■1■1)も存在しないけど、表示されちゃう。

 >笑 さん
  =DATE(B1+CHOOSE(FIND(A1,"大昭平"),1911,1925,1988),C1,D1)
  (平■1■1■32)で、【E1=1989/2/1】に
  気づいたので(^^♪

(マリオ) 2016/02/22(月) 13:52


 勉強になりました。
 Date(1989,1,32) = 1989/2/1
 "平成1年1月32日"*1 = #Value!

 昭和65年も計算されるし、内部機能を使っている以上、入力されているデータが正しいと見るしかないかと。

 > VBAでやる必要性はありませんが、
 ちなみにVBAだと回避する方法あるんですか?

(稲葉) 2016/02/22(月) 16:03


Sub main()
    Dim sht As Worksheet, r As Range, d As Date, e As String
    ActiveSheet.Copy Before:=ActiveSheet
    Set sht = ActiveSheet
        With sht
            For Each c In .UsedRange.Columns(1).Cells
            If Not c.Value = Empty Then
                d = DateSerial(Evaluate("LOOKUP(A" & c.Row & ",{""昭"",""大"",""平""},{1925,1911,1988})") + .Range("B" & c.Row).Value, .Range("C" & c.Row).Value, .Range("D" & c.Row).Value)
                Set r = .Range("B" & c.Row & ":D" & c.Row)
                e = .Range("A" & c.Row).Value & Join(Application.Index(r.Rows(1).Value, 0), "/")
                If Format(d, "gge/m/d") <> e Then
                    c.Value = "日付存在しない " & e
                Else
                    c.Value = d
                End If
            End If
            Next c
        .Columns("B:D").Delete Shift:=xlToLeft
        .Columns("A:A").ColumnWidth = .Columns("B:B").ColumnWidth * 3
        End With
End Sub
(mm) 2016/02/22(月) 17:29

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.