2017-06-16 5 views
0

私はあなたの助けが必要です! Excel/VBA環境でRegExを使用したいと思います。私のアプローチを持っていますが、私は私の限界に達するの一種だ...RegExを使用してExcel/VBAで5文字を一致させ、最初の文字はセルの値に依存します

私は、文字列が私のExcelシートの列Bにある(文字列の非常に多くの行の中に5つの文字を一致させる必要があり、Aは後に来ます)。 5文字は5桁または "K"に続く4桁(例:1234598765K2345)です。これは(\d{5}|K\d{4})でカバーされます。

彼らは5先行したり、文字や特殊文字ではなく番号で続けることができます。意味は先行ゼロが許されておらず、数字も長い数字の中で一致してはならない。それは私が立ち往生している1つのポイントです。

文字列に一致する可能性が複数ある場合は、すべて一致させる必要があります。すでに同じ行内で同じ番号が一致している場合は、再度一致させないことをお勧めします。 (\d{5}|K\d{4})(?!.*?\1.*$)

はまた、私は特定の単一の数字を持っています(または「K」:これら二つの要件については、私はこの投稿の最後でVBAコードの一部として動作し、既に解決策のようなものを、持っています)を入力してください。この特定の文字から始めるには、5文字が必要です。そうでなければ、一致しません。

文字列の例(番号付き)。 2つの列AとBは「|」で区切られています。読みやすくするための

(1)| 1 | 2018/ID 00000PersoNR:889899ブリヂストンBNPN
(2)| 3 | Kompo EP ### Baukasten ### 3789936690 ID PFK Carbon0
(3)| 2 | ,、Mietop Antragsnummer C300Coup IVS 33221 ABF
(4)| 2 | Q 中国lokal produzierte誘導体のF/Radverbund 991222 VV
(5)| 6 | ID:61953 F-ペースEnfantillages(マシンarriere)VvSKPMG Lyon09
(6)| 2 | 2017/ Einzelkostenprob。 チューリッヒMP KOS
(7)| K | ID:K1245 Panamera Nitsche Radlager Derivativ Bayreumion PwC
(8)| 7 | LaunchSupport QBremsen BBG BFG BBD 、 KK 70142

私はここを探していた結果は以下のとおりです。

(1)| 11298 | ........................... [[12345と一致しない、前の番号がないため]
(2)| 32280 | ........................... [3789936690内の37899と一致しません]
(3)| 20613 | 20614 | ................ [2で始まり、3で始まるものと一致しない]
(4)| 21009 | .............................[完全に細かい手紙が前についています。
(5)| 61953 | .............................. [ランダムな例]
(6)| 22222 | 21895 | 28932 | ... [すべて一致しますが、重複はありません]
(7)| K1245 | .............................. "K"付きの特別なケース
(8)| 70142 | 70119 |

Sub RegEx() 

Dim varOut() As Variant 
Dim objRegEx As Object 
Dim lngColumn As Long 
Dim objRegA As Object 
Dim varArr As Variant 
Dim lngUArr As Long 
Dim lngTMP As Long 

On Error GoTo Fin 

With Worksheets("Sheet1") 

varArr = .Range("B2:B50") 

Set objRegEx = CreateObject("VBScript.Regexp") 

With objRegEx 

.Pattern = "(\d{5}|K\d{4})(?!.*?\1.*$)" 'this is where the magic happens 
.Global = True 

For lngUArr = 1 To UBound(varArr) 
Set objRegA = .Execute(varArr(lngUArr, 1)) 

If objRegA.Count >= lngColumn Then 
lngColumn = objRegA.Count 
End If 

Set objRegA = Nothing 
Next lngUArr 

If lngColumn = 0 Then Exit Sub 
ReDim varOut(1 To UBound(varArr), 1 To lngColumn) 
For lngUArr = 1 To UBound(varArr) 
Set objRegA = .Execute(varArr(lngUArr, 1)) 
For lngTMP = 1 To objRegA.Count 
varOut(lngUArr, lngTMP) = objRegA(lngTMP - 1) 
Next lngTMP 
Set objRegA = Nothing 
Next lngUArr 

End With 

.Cells(2, 3).Resize(UBound(varOut), UBound(varOut, 2)) = varOut 

End With 

Fin: 
Set objRegA = Nothing 
Set objRegEx = Nothing 
If Err.Number <> 0 Then MsgBox "Error: " & Err.Number & " " & Err.Description 

End Sub 

:................
私がこれまでに一緒に入れている

正規表現/ VBAコードは[70142秒無視]このコードは、列Bからの文字列をチェックしており、その一致を列C、D、Eなどに渡しています。重複は一致しません。しかし、それは大きな数字の中で一致する数字です。これは問題です。私はまだ12345と一致させたいので、\bは私にとってはうまくいきません。EP12345です。

また、列Aの文字を最初の文字にする方法もわかりません。

私はExcelがここにファイルをアップロードしました:提案
ステファン

答えて

1

が長すぎる数字を整理するためにmollmell.de/RegEx.xlsm

は、あなたが否定後読みを使用していることを先読みすることができ、どうもありがとうございます前後successing数字と一致していません:

(?x) (?<!\d) (\d{5} | K\d{4}) (?!\d) 

https://regex101.com/r/RBnoMo/1

列2のキーと数字を一致させるのは難しいです。たぶん、あなたは、キーまたは数字のいずれかと一致し、その後のロジックを実行します。あなたの助けのための

(?x) 
\|[ ](?<key>.)[ ]\| | 
(?<!\d) (?<number>\d{5} | K\d{4}) (?!\d) 

https://regex101.com/r/60d0yT/2

+0

感謝を! regex101では '(?x)(?<!\ d)(\ d {5} | K \ d {4})(?!\ d)'はかなりうまく機能しますが、何とか私のVBAの一部ではありませんコード。 (?<!\ d)(\ d {5} | K \ d {4})(?!\ d) "は単にエラーを出力します。あなたはそれのための解決策を持っていますか? – Stphn

+0

私が先読みアサート '.Pattern ="(\ d {5} | K \ d {4})(?!\ d) "'を単に含んでいれば、何とかエラーはありません。 lookbehindアサーション '(?x)(?<!\ d)(\ d {5} | K \ d {4})(?!\ d)を含めるとエラーが発生します。 – Stphn

+0

よくわかりました。私は、RegExのVBA適合がlookbehindアサーションをサポートしていないことを知りました。 – Stphn

関連する問題