[[20150527131720]] 『指定した文字(単位)と数字を抜き出したい』(たけさん) ページの最後に飛ぶ

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

 

『指定した文字(単位)と数字を抜き出したい』(たけさん)

以前の担当の方が辞めてしまい、アクセスで組まれたマクロが動きません。
新たにエクセルVBAで何とかならないかと考えています。

L列に下記の品名があります

オムニパーク300チュウ 100MLX5V→100MLX5V
ガスコンドロップナイヨウエキ2%300ML→300ML
グリセノン チウ 200MLX30フクロ→200MLX30フクロ
KN3ゴウユエキ 200MLX20SB→200MLX20SB
カロナールジョウ 300 100T→100T
クラリスロマイシンDS10%ショウニ B100G→B100G
Aベンジン(ポリ) 500CC →500CC
C.DIFF QUIK CHEKコンプリ25S→25S
BINAXNOW ハイエンキュウキン 12テスト→12テスト

検索窓に『ML』と単位を入れると
→の右側のように単位を含む数字をVBAで抜出たいのです

ML(ミリリットル)
T(タブレット)
G(グラム)
などなど書ききれないほどあります
また数字と単位の間にスペースがあるかというと
必ずしもそういうことではありません

お力をかして頂けると助かります

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


 動いている実績があるのであれば、ACCESSのマクロを提示できないでしょうか。
 アプリケーション固有機能でなければ、ほとんどそのまま移植できると思いますが。

(Mook) 2015/05/27(水) 14:04


Mookさん
ありがとうござます
担当の方にお話してみます お時間下さい!!!
_(_^_)_

(たけさん) 2015/05/27(水) 14:11


 結果和M列に表示

 Sub test()
    Dim r As Range
    With CreateObject("VBScript.RegExp")
        .Pattern = "[A-Z]?(\d+[A-Z\u30A0-\u30F0\uFF76-\uFF9F]+)+$"
        For Each r In Range("L1", Range("L" & Rows.Count).End(xlUp))
            If .test(Trim(r.Value)) Then
                r(, 2).Value = .Execute(Trim$(r.Value))(0)
            End If
        Next
    End With
End Sub
(seiya) 2015/05/27(水) 23:04

seiyaさん

ありがとうございます!!!!!!!
_(_^_)_
思っていた通りの動きで感激です
が、4行目のコードの意味がまったくわからず。。。

また。。。
ベギンクリーム10% 20GX10→20GX10
アネトカインゼリー2% 50MLX3→50MLX3
ヘパリンNAロック10E/ML 5LX10S→5LX10S

などが抜き出せず、空白になります
お時間ある時に、ご指導ください
(たけさん) 2015/05/28(木) 11:58


         .Pattern = "[A-Z]?(\d+[A-Z\u30A0-\u30F0\uFF76-\uFF9F]+)+$"
                                                              ^
         .Pattern = "[A-Z]?(\d+[A-Z\u30A0-\u30F0\uFF76-\uFF9F]*)+$"
                                                              ^

 に変更してみてください
(seiya) 2015/05/28(木) 12:05

seiyaさん

早々のお返事ありがとうございます

ほぼ抜出できました!!!!!!
感謝、感謝です
おかげさまで、270件あるデータが処理できました

アロンアルファA 0.5GX5→0.5GX5A(5GX5になってしまう)
バイアグラジョウ50MG 10TX2シート→10TX2シート
ツロブテロールテープ2MG 70マイ→70マイ
リボテストマイコプラズマ 10カイヨウ→10カイヨウ
ロシュ PTテストストリップ 24マイ→24マイ
ロールシ CL5840 5マキイリ→5マキイリ
ジクロフェナクNAザザイ25 CH100コ→CH100コ(H100コになってしまう)

残りはコレです。。。
(たけさん) 2015/05/28(木) 13:23


 .Pattern = "[A-Z]*(\d+(\.\d+)?[A-Z\uFF65-\uFF9F]*)+$
 で良さそうかな?
(seiya) 2015/05/28(木) 13:58

seiyaさん
ありがとうございました!!!!

一部抜けてしまう部分があります
品名の入力が複数人による手入力のため、半角24文字という文字数制限がある(帳票のレイアウトの関係上??)のですが空白に対してなど決まりはなく、個々に入力しているのが現状です
何度もすいません

オムニパーク300チウシリンジ50ML 5S→50ML(5Sになってしまう)
オムニパーク300チウシリンジ100ML5S→100ML5S(300チウシリンジ100ML5Sになってしまう)

前任が急にいなくなり、途方にくれています。。。
ホントにすいません
(たけさん) 2015/05/28(木) 14:29


 .Pattern = "[A-Z]*\d+(\.\d+)?([A-Z]+\d*)*(\d*[\uFF65-\uFF9F]+)?$"
 でもう一度...
 やはり、
 オムニパーク300チウシリンジ50ML 5S 
 このパターンは他とは矛盾するので 5S が抽出される。
 (seiya)  2015/05/28(木) 15:14
 修正 15:55

seiyaさん
ありがとうございます

オムニパーク300チウシリンジ50ML 5S
オムニパーク300チウシリンジ100ML5S

上記はそれぞれ
5S
100ML5S
と表示されます

空白の問題??かなと思い空白を全て置き換えて実行しても変わりませんでした
(-"-)
(たけさん) 2015/05/28(木) 16:10


 >オムニパーク300チウシリンジ100ML5S→100ML5S(300チウシリンジ100ML5Sになってしまう) 
 100ML5S が抽出されますよね?

 問題は
 オムニパーク300チウシリンジ50ML 5S
 で最後の5Sの前にスペースがあるので 5S になってしまいます。
(seiya) 2015/05/28(木) 16:20

 苦肉の策でPatternを2段階にすると...

 Sub test2()
    Dim r As Range
    Columns("m").ClearContents
    With CreateObject("VBScript.RegExp")
        For Each r In Range("L1", Range("L" & Rows.Count).End(xlUp))
            .Pattern = "(\d+(\.\d+)?[A-Z]+) \d+(\.\d+)?[A-Z]+$"
            If .test(Trim(r.Value)) Then
                r(, 2).Value = .Execute(Trim$(r.Value))(0).submatches(0)
            Else
                 .Pattern = "[A-Z]*\d+(\.\d+)?([A-Z]+\d*)*(\d*[\uFF65-\uFF9F]+)?$"
                If .test(Trim$(r.Value)) Then r(, 2).Value = .Execute(Trim$(r.Value))(0)
            End If
        Next
    End With
End Su
(seiya) 2015/05/28(木) 16:37

seiyaさん

ありがとうございます

早速、確認してみます(うれし泣き)
_(_^_)_
(たけさん) 2015/05/28(木) 17:11


コメント返信:

[ 一覧(最新更新順) ]


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