[[20031013101121]] 『スペースを入れて表示』(ななえ) ページの最後に飛ぶ

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

 

『スペースを入れて表示』(ななえ)

生年月日が「昭12.5.19」などと入力されていて、
1ケタの数字のところは1マス空けて、「昭12.□5.19」
(□はスペース)というふうに表示できないでしょうか。
「明9.12.7」なら「明□9.12.□7」としたいのですが。
よろしくお願いします。


 いま入力されている値は、
  昭12.5.19
 とのことですが、数値が全角で、最初のピリオドが半角、次が全角なのですか?
 またセルの書式設定の「表示形式」は、何でしょうか?(文字列かな?)

  (INA)


書式設定は文字列です。
ピリオドは確認したところ、セルによってバラバラでした(T_T)。
多分他住所録からもってきたせいではないかと・・。
一旦、全角に直してからの処理にしたいと思います。
すみませんが宜しくお願いします。


 きっとマクロだとすっきりと処理できるのでしょうが、、関数編です。
 数式がごちゃごちゃしてしまうので、4列使います。

 生年月日がA列にあるとして
 B1  =JIS(A1)    ・・・全角に変換
 C1  =IF(MID(B1,3,1)=".",REPLACE(B1,1,1,MID(B1,1,1)&" "),B1) ・・・元号の桁をあわせる
 D1  =IF(MID(C1,6,1)=".",REPLACE(C1,4,1,". "),C1)     ・・・月の桁をあわせる
 E1  =IF(LEN(D1)<9,REPLACE(D1,7,1,". "),D1)         ・・・日付の桁をあわせる
 としてみました。E列だけをコピーし、形式を選択>値で貼り付けて使ってください。
 う”〜、、それにしても美しくない式だわ・・・。先輩方の更なる書き込みに期待(kuro)


 見事に長いですが、同じくA列に入力があるとして

 B1に
 =LEFT(A1,1)&JIS(SUBSTITUTE(SUBSTITUTE(TEXT(MID(SUBSTITUTE(ASC(A1),".","/"),2,20),"yy/mm/dd"),"0"," "),"/","."))

 下にフィルします。コピペはkuroさんと同じく行います。

 (ramrun)


 あれ〜?
 この質問と似たようなのが以前あったような気がします。
 kazuさんのライブラリーにあったような。
 ゴシック系フォントを使うんだということのみ脳裏に焼きついています。
 仕事では明朝系フォントしか使えないので、どこにあったか覚えていません。
 (EUREKA)


 それならばゴシック系、明朝系の違いではなく、
 Pが付くか付かないかです。
 プロポーショナルフォントってやつですね。

 ちなみにPが付かないほうが等幅フォントです。

[[20030911094158]] 『年月日表示を揃えたい』(みど)

 (ramrun)


 お〜!
 これでした。
 少し興味が薄かったので、しっかり把握が出来ていませんでした。
 桁揃えとなれば、Pじゃだめですね。
 失礼をいたしました。
 (EUREKA)


 私の10、20、30に対応してないですね(汗)。
 アフォだな。

 とりあえず無視しておいてください。
 (ramrun)


皆様どうもありがとうございました。
とても勉強になりました!


 残念。どうあがいてもネストが...
 あと一つなのにダメぽ。

 B1に
 =LEFT(A1,1)&SUBSTITUTE(RIGHT(SUBSTITUTE(SUBSTITUTE("/"&TEXT(MID(SUBSTITUTE(ASC(A1),".","/"),2,8),"yy/mm/dd"),"/0","/ "),"/","."),8)," .","0.")

 C1に
 =JIS(B1)

 (ramrun)とりあえず形にしときました(汗)。



 Function Date2(myDate As Range, Kugiri As Integer)

   Dim Bunkathu() As String, s As String
   Dim KugiriMoji As String, Str As String, Moji As Integer
   Dim i As Integer

   If myDate <> "" Then

     Str = StrConv(myDate.Text, vbNarrow)

     For i = 1 To Len(Str)
       If IsNumeric(Mid(Str, i, 1)) Then
         Moji = i - 1
         Exit For
       End If
     Next i

     s = Left(Str, Moji)

     Select Case Kugiri
       Case 1
         KugiriMoji = "/"
         Bunkathu = Split(Mid(Str, Moji + 1), "/", , vbTextCompare)
       Case 2
         KugiriMoji = "."
         Bunkathu = Split(Mid(Str, Moji + 1), ".", , vbTextCompare)
       Case 3
         ReDim Bunkathu(2)
         Bunkathu(0) = Val(Mid(Str, Moji + 1))
         Bunkathu(1) = Val(Mid(Str, InStr(1, Str, "年") + 1))
         Bunkathu(2) = Val(Mid(Str, InStr(1, Str, "月") + 1))
     End Select

     For i = LBound(Bunkathu) To UBound(Bunkathu)
       If Len(Bunkathu(i)) = 1 Then
         Bunkathu(i) = " " & Bunkathu(i)
       End If
     Next i

     Select Case Kugiri
       Case 1 To 2
         Date2 = s & Join(Bunkathu, KugiriMoji)
       Case 3
         Date2 = s & Bunkathu(0) & "年" & Bunkathu(1) & "月" & Bunkathu(2) & "日"
     End Select

   End If

 End Function

 kazuさんのマクロを参考に作りました
 使い方はワークシート関数と同じように使います

 Date2(対象セル,区切り文字) となっています
 区切り文字は 1〜3 の数字で指定してください
 "/"なら 1 、 "." なら 2 、"平成9年10月2日" のように入力されていれば 3 を指定してください

 たとえば、セルA1に 
 明9.12.7 と入力されていれば、Date2(A1,2) 、2000/10/4 なら  Date2(A1,1)
 2001年12月2日 や 昭和44年2月2日 なら Date2(A1,3) と入力してください  (りな)


 面白そうなので無理矢理B1だけで処理する数式を作ってみました。
長すぎて自分でも合ってるのか良く分からなくなっちゃいましたけど。(Yosh!)

=IF(FIND(".",JIS(A1),1)<4,JIS(LEFT(A1,1)&" "&MID(A1,2,1)),JIS(LEFT(A1,3)))&"."&IF(FIND(".",JIS(A1),IF(FIND(".",JIS(A1),1)<4,4,5))-FIND(".",JIS(A1),1)=3,""," ")&SUBSTITUTE(SUBSTITUTE(JIS(A1),LEFT(JIS(A1),FIND(".",JIS(A1))),""),RIGHT(JIS(A1),IF(FIND(".",RIGHT(JIS(A1),3))=1,3,2)),"")&"."&IF(FIND(".",RIGHT(JIS(A1),3))=1,JIS(RIGHT(A1,2)),JIS(" "&RIGHT(A1,1)))


 チャレンジャー発見(笑)。

 通りすがりの者さんの方法ってネストの壁を越えられる〜 って
 やつですね。
 そんなのがあるって知ってはいたけど、初めてやってみました。
 なかなか使えそう。

 こんなときはりなさんのVBAが一歩秀でてますね。
 なんといっても汎用性がある。

 それにしてもYosh!さんのは、すごいですね。
 おみそれしました。

 結局最後に思いついたのは、区切り位置で年号を区切ってからなら
 1レベルかせげるな〜 なんて程度です。
 作業用に2列使うことになるんだけど(汗)。

 (ramrun)

 Function Date2(myDate As Range) As String
                                    '↓全角は vbWide 半角はvbNarrow
   Const HANKAKU_ZENKAKU As Long = vbNarrow

   Dim Bunkatsu() As String, s As String
   Dim KugiriMoji As String, Str As String, Moji As Integer
   Dim i As Integer

   If myDate <> "" Then

     Str = StrConv(myDate.Text, vbNarrow)

     For i = 1 To Len(Str)
       If IsNumeric(Mid(Str, i, 1)) Then
         Moji = i - 1
         Exit For
       End If
     Next i

     s = Left(Str, i - 1)

     For i = Moji + 1 To Len(Str)
       If Not IsNumeric(Mid(Str, i, 1)) Then
         KugiriMoji = Mid(Str, i, 1)
         Exit For
       End If
     Next i

     Select Case KugiriMoji
       Case "/", "."
         Bunkatsu = Split(Mid(Str, Moji + 1), KugiriMoji, , vbTextCompare)
       Case "年", "月"
         ReDim Bunkatsu(2)
         Bunkatsu(0) = Val(Mid(Str, Moji + 1))
         Bunkatsu(1) = Val(Mid(Str, InStr(1, Str, "年") + 1))
         Bunkatsu(2) = Val(Mid(Str, InStr(1, Str, "月") + 1))
     End Select

     For i = LBound(Bunkatsu) To UBound(Bunkatsu)
       If Len(Bunkatsu(i)) = 1 Then
         Bunkatsu(i) = " " & Bunkatsu(i)
       End If
     Next i

     Select Case KugiriMoji
       Case "/", "."
         Date2 = StrConv(s & Join(Bunkatsu, KugiriMoji), HANKAKU_ZENKAKU)
       Case "年"
         If Bunkatsu(2) = 0 Then
           Date2 = StrConv(s & Bunkatsu(0) & "年" & Bunkatsu(1) & "月", HANKAKU_ZENKAKU)
         Else
           Date2 = StrConv(s & Bunkatsu(0) & "年" & Bunkatsu(1) & "月" & Bunkatsu(2) & "日", HANKAKU_ZENKAKU)
         End If
       Case "月"
          Date2 = StrConv(s & Bunkatsu(1) & "月" & Bunkatsu(2) & "日", HANKAKU_ZENKAKU)
     End Select

   End If

 End Function

 少し変更しました。区切りを指定せずに =Date2(A1) などと入力してください
 全角にする場合は Const HANKAKU_ZENKAKU As Long = vbNarrow
                           ↑を vbWide に変更
 ついでに 2000年2月 や 3月10日 にも対応  (りな)

 このようなことでは、どうでしょう?
 =IF(A1="","",
JIS(LEFT(A1)&IF(MID(A1,3,1)="."," "&MID(A1,2,2),MID(A1,2,3))
&TEXT(MONTH(REPLACE(A1,1,1,VLOOKUP(LEFT(A1),{"明","M";"大","T";"昭","S";"平","H"},2,))),"??.")
&TEXT(DAY(REPLACE(A1,1,1,VLOOKUP(LEFT(A1),{"明","M";"大","T";"昭","S";"平","H"},2,))),"??")))
(LOOKUP)

 とぉりゃ〜 みなさん頑張っているようなので Ver.3 投下。
 閏年の2/29以外は大丈夫です(爆)。その物件だけは手直しということで(汗)。
 Ver.1よりはましかな。

 (ramrun)お昼〜

 B1に
 =LEFT(A1,1)&JIS(RIGHT(SUBSTITUTE("."&TEXT(SUBSTITUTE(MID(ASC(A1),2,20),".","/"),"y.mm.dd"),".0",". "),8))

 LOOKUPさんもramrunさんも式が短くて良いですね^^;
TEXTの使い方が鍵になるんですかね。TEXTは数値に表示形式の設定をする物だと
思いこんでいたので、今回の場合、シリアル値への変換等の必要性があるなら
TEXTは使いにくいかなぁと勝手に思考から除外してしまっていました。勉強になりました。

 りなさんのVBAは素晴らしいですね。敬服します。(Yosh!)


 LOOKUPさんのを参考に同じよう和暦処理にしてみました。
 私的にもこれで満足いく数式になったと思うので、ここで終了します。
 続けすぎか(汗)。

 しかし、残念なのは和暦に置き換えたことで明治33年1月1日以前は扱えないという
 ことになります。
 したがって、質問者の明治9年には対応しません。

 私が最初に組んでいたのは西暦として扱っていたため、閏年が合わないかわりに
 何年でも大丈夫でした。
 あと、先に上げたTEXTの"/"と"."区切りは単に私の勘違いのようで消します(汗)。

 Ver.1は西暦処理。失敗作。
 Ver.2は西暦処理。閏年の2/29に未対応。数式が2つに分かれてしまった。
 Ver.3は西暦処理。閏年の2/29に未対応。数式的には満足。
 Ver.4は和暦処理で閏年に対応。明治33年以降が処理対象。だけど私的に満足。

 (ramrun)完結〜

 B1に
 =LEFT(A1,1)&JIS(RIGHT(SUBSTITUTE("."&TEXT(HLOOKUP(LEFT(A1,1),{"明","大","昭","平";"M","T","S","H"},2,0)&MID(ASC(A1),2,20),"ee.mm.dd"),".0",". "),8))

 ご質問をよく読まず、勘違いしまして、昭和9.9.9→昭和 9. 9. 9
なのかと思いまして、回答差し上げましが、掲載後、誤りに気がつきまして、
行きがかり上、訂正はさせていただきましたが、VLOOKUP()などで長くなって
しまいました。無用な投稿をしまして申し訳ありませんでした。(LOOKUP)

 そんなことないと思いますよ。
 そもそも10レス目で終了しているわけですから(笑)。

 LOOKUP系の使い方のいい見本になったと思います。
 (ramrun)

コメント返信:

[ 一覧(最新更新順) ]


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