[[20140722161256]] 『ナンバープレートの下桁の数字を抽出したい』(ららら) ページの最後に飛ぶ

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

 

『ナンバープレートの下桁の数字を抽出したい』(ららら)

過去ログを検索してみたのですが、わからなかったので質問させていただきます。
いろいろな車のナンバーが入っているセルがD列にあります。
そこから下の数字だけ(右端からひらがなまで)をE列に取り出したいです。

たとえば

     D列       E列
 大宮100せ1        1
 所沢100は22        22 
 宇都宮100と333     333
 川越100に4444     4444

という感じです。

自分でできたのは下記までです

   Dim Myrange As Range
   Dim Mystr As String

       For Each Myrange In Range("D2", Range("D65536").End(xlUp))
            Mystr = Right(Myrange.Value, 4)
            Myrange.Offset(0, 1).Value = Mystr
       Next

これでは当然ですが単純に右から4桁だけの抽出になってしまいます。
目的の数字を抽出するにはどうすればよいのでしょうか。
(ナンバーセルには空白やハイフンは入っていません。)

< 使用 Excel:Excel2013、使用 OS:Windows8 >


 数式でこのあたりを参考にできないでしょうか。
http://www.geocities.jp/chiquilin_site/data/050223_numerical_extraction.html

 マクロであれば、正規表現を利用するとよいかと思います。
(Mook) 2014/07/22(火) 16:43

mook様

いつもありがとうございます。
教えたもらったサイトとみて検討してみます。
ぱっと見た感じでは難しそうでしたので、わからなければまた質問させてください。
(ららら) 2014/07/22(火) 16:56


 昔作ってみたのが参考になれば・・・
Function Nplate(sMoji As String, iPic As Integer, Optional iRat As Integer = 0) As String
'//ナンバープレートからデータを抽出する
'//使い方
'=Nplate(対象文字,抜出箇所,[属性表記])
'A1 =川越501さ12-34
'=Nplate(A1,1) → 川越
'=Nplate(A1,4) → 12-34
'=Nplate(A1,2,1) → 小型普通
'=Nplate(A1,3,1) → 自家用
'=Nplate(A1,0,1) → 埼玉 小型普通 自家用
'
    Dim Tmp(1 To 4) As Variant
    Dim sCase As String
    With CreateObject("VBScript.RegExp")
        .Pattern = "^(\D{1,4})(\d{1,3})([あ-えか-さす-ふほ-をEHKMTYEHKMTY])(.{1,5}$)"
        .Global = True
        If Not .test(sMoji) Then Nplate = "NOMATCH": Exit Function
        For i = 1 To 4
            Tmp(i) = .Execute(sMoji)(0).SubMatches(i - 1)
        Next i
        Select Case iRat
            Case 0
                Nplate = Tmp(iPic)
            Case 1
                '//ナンバーから都道府県を検索
                sCase = "札幌_北海道,函館_北海道,室蘭_北海道,帯広_北海道,釧路_北海道,北見_北海道,旭川_北海道," & _
                        "宮城_宮城,仙台_宮城,福島_福島,会津_福島,いわき_福島,岩手_岩手,青森_青森,八戸_青森," & _
                        "新潟_新潟,長岡_新潟,山形_山形,庄内_山形,秋田_秋田,品川_東京都,足立_東京都,練馬_東京都," & _
                        "多摩_東京都,八王子_東京都,横浜_神奈川県,川崎_神奈川県,相模_神奈川県,湘南_神奈川県," & _
                        "千葉_千葉県,成田_千葉県,習志野_千葉県,袖ヶ浦_千葉県,野田_千葉県,柏_千葉県,大宮_埼玉県," & _
                        "熊谷_埼玉県,春日部_埼玉県,所沢_埼玉県,川越_埼玉県,長野_長野,松本_長野,諏訪_長野,水戸_茨城県," & _
                        "土浦_茨城県,つくば_茨城県,宇都宮_栃木県,那須_栃木県,とちぎ_栃木県,群馬_群馬県,高崎_群馬県," & _
                        "山梨_山梨県,名古屋_愛知県,尾張小牧_愛知県,一宮_愛知県,三河_愛知県,岡崎_愛知県,豊田_愛知県," & _
                        "豊橋_愛知県,三重_三重県,鈴鹿_三重県,静岡_静岡県,沼津_静岡県,伊豆_静岡県,浜松_静岡県," & _
                        "岐阜_岐阜県,飛騨_岐阜県,福井_福井県,石川_石川県,金沢_石川県,富山_富山県,大阪_大阪府," & _
                        "なにわ_大阪府,和泉_大阪府,堺_大阪府,京都_京都府,奈良_奈良県,滋賀_滋賀県,和歌山_和歌山県," & _
                        "神戸_兵庫県,姫路_兵庫県,広島_広島県,福山_広島県,鳥取_鳥取県,島根_島根県,岡山_岡山県,倉敷_岡山県," & _
                        "山口_山口県,下関_山口県,香川_香川県,徳島_徳島県,愛媛_愛媛県,高知_高知県,福岡_福岡県," & _
                        "北九州_福岡県,筑豊_福岡県,久留米_福岡県,長崎_長崎県,佐世保_長崎県,大分_大分県,佐賀_佐賀県," & _
                        "熊本_熊本県,宮崎_宮崎県,鹿児島_鹿児島県,沖縄_沖縄県,"
                .Pattern = "(" & Tmp(1) & "_)(\D{1,4})(,)"
                If Not .test(sCase) Then Nplate = "NOPREF": Exit Function
                Tmp(1) = .Execute(sCase)(0).SubMatches(1)
                '
                '//ナンバーから自動車種別を検索
                sCase = "1_貨物,2_乗合,3_普通,4_小型貨物,5_小型普通,6_小型貨物,7_小型普通,8_特殊,9_大型特殊,0_建設,"
                .Pattern = "(" & Left(Tmp(2), 1) & "_)(\D{1,4})(,)"
                If Not .test(sCase) Then Nplate = "NOAUTO": Exit Function
                Tmp(2) = .Execute(sCase)(0).SubMatches(1)
                '
                '//ナンバーから事業種別を検索
                Dim JIGYO As String
                JIGYO = "NOJIGYO"
                .Pattern = "[あ-えか-こを]":         If .test(Tmp(3)) Then JIGYO = "事業用"
                .Pattern = "[われ]":                 If .test(Tmp(3)) Then JIGYO = "レンタル"
                .Pattern = "[さす-ふ-ゆら-るろ]":    If .test(Tmp(3)) Then JIGYO = "自家用"
                .Pattern = "[EHKMTYよEHKMTY]": If .test(Tmp(3)) Then JIGYO = "駐留軍人軍属私有車両等"
                .Pattern = "[おしへん]":             If .test(Tmp(3)) Then JIGYO = "未使用"
                Tmp(3) = JIGYO
                '
                Select Case iPic
                    Case 0
                        Nplate = Tmp(1) & " " & Tmp(2) & " " & Tmp(3)
                    Case Else
                        Nplate = Tmp(iPic)
                End Select
        End Select
    End With
End Function
(稲葉) 2014/07/22(火) 17:29

 [稲葉]さんのは本格的ですね。

 数式で下4桁でいいのなら、IF を連ねて

 =IF(ISNUMBER(RIGHT($D1,4)*1),RIGHT($D1,4)*1,IF(ISNUMBER(RIGHT($D1,3)*1),RIGHT($D1,3)*1,IF(ISNUMBER(RIGHT($D1,2)*1),RIGHT($D1,2)*1,RIGHT($D1,1)*1)))

(jun53) 2014/07/22(火) 17:48


[稲葉様]

せっかくアドバイス頂いたのですが、私にはかなり難しく、一生懸命Functionから調べていました・・・
知識不足でアドバイスが生かせず申し訳ありません。
ちょっとずづ理解できるよう頑張ってみます。ありがとうございます。

[jin53様]

数式の内容は今から解読しますが、早速試したところできました!!
助けて頂きありがとうございました。
(ららら) 2014/07/22(火) 18:05


 標準モジュールにコピーして貼り付け
 ワークシート上で、
 E1=Nplate(D1,4)
 これでナンバーだけ抜き出せるよ!

 Functionは広義で関数という意味です。
 VLOOKUPとか、MID関数と同じように使用できます。

(稲葉) 2014/07/22(火) 18:08


 E1 =LOOKUP(10000,RIGHT(D1,{1,2,3,4})*1)
 または
 E1 =-LOOKUP(1,-RIGHT(D1,{1,2,3,4}))

 こんな感じかな?
(笑) 2014/07/22(火) 18:26

[稲葉様]

昨日Functionについて調べていました。
まだ自分で使いこなせるようになるには時間がかかりそうですが、こんなこともできるのか!と
大変勉強になりました。

[笑様]
配列定数というものがあるのは知っていましたが、こういう風に使うのですね。
こちらも昨日調べてみました。
一般的な関数からすると難易度が一気にあがったきがしますが、なんとな〜く理解できました。

今回、皆さんにアドバイスをいただいて勉強になりました。

(ららら) 2014/07/23(水) 09:44


コメント返信:

[ 一覧(最新更新順) ]


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