私はあなたの助けが必要です! Excel/VBA環境でRegExを使用したいと思います。私のアプローチを持っていますが、私は私の限界に達するの一種だ...RegExを使用してExcel/VBAで5文字を一致させ、最初の文字はセルの値に依存します
私は、文字列が私のExcelシートの列Bにある(文字列の非常に多くの行の中に5つの文字を一致させる必要があり、Aは後に来ます)。 5文字は5桁または "K"に続く4桁(例:12345
、98765
、K2345
)です。これは(\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がここにファイルをアップロードしました:提案
ステファン
感謝を! regex101では '(?x)(?<!\ d)(\ d {5} | K \ d {4})(?!\ d)'はかなりうまく機能しますが、何とか私のVBAの一部ではありませんコード。 (?<!\ d)(\ d {5} | K \ d {4})(?!\ d) "は単にエラーを出力します。あなたはそれのための解決策を持っていますか? – Stphn
私が先読みアサート '.Pattern ="(\ d {5} | K \ d {4})(?!\ d) "'を単に含んでいれば、何とかエラーはありません。 lookbehindアサーション '(?x)(?<!\ d)(\ d {5} | K \ d {4})(?!\ d)を含めるとエラーが発生します。 – Stphn
よくわかりました。私は、RegExのVBA適合がlookbehindアサーションをサポートしていないことを知りました。 – Stphn