2017-01-20 5 views
0

これは先週VBAを学んできたので、データベースクリーニングツールをコーディングしました。しかし、私は繰り返し文字の兆候を除去するクリーンを実装しようとしています。具体的にはxxx、TTTTT、6666などです。しかし、オンラインで検索していくつかの調査を行ったところ、解決策を見つけることができませんでした。Regexを使用して1文字を繰り返すVBAを検索

私は正規表現は、このようなもののようになり考え出し:「$^[(\ W)+]」

を しかし、それはただの単語の文字を見つけて、私は、検索を設定する必要がそれらを交換します何度も何度も何度も何度も何度も繰り返す

私は誰かが "^(。)\ 1 + $"というトリックをしているのを見ましたが、私は検索したくなかったデータの端を切り落としました。

私はこのことに関する話題がないことにショックを受けています。正規表現は、ハードコードを行うのではなく、それを見つける最も簡単な方法であると考えました。セル値をルーピングして各文字をチェックします。

ありがとうございました。

+2

「ショックを受ける」のではなく、よく理解していないものを見つけようとしてください。 –

+0

ようこそ!サイトの運営方法の詳細については、[ツアー](https://stackoverflow.com/tour)をご覧ください。 '* xxx'のような*出力*を追加するには、[あなたの質問を編集してください](https://stackoverflow.com/posts/41771756/edit)してください。これまでのコードの主要部分を追加して、質問の文脈をより簡単に理解できるようにしてください。ありがとう! – cxw

+1

'RegExp'の後方参照の構文は、[ここ](https://msdn.microsoft.com/en-us/library/fzhdcs5c(VS.85).aspx)です。 – Comintern

答えて

1

このようなことを試すことができます。あなたの正規表現を(.)\1+に変更したので、どこでも繰り返し文字を削除できます。ツール>リファレンス> Microsoft VBScript正規表現5.5でRegexpを追加することを忘れないでください。

 
Public Function cleanRange(cells As range) 
    Dim pattern As String: pattern = "(.)\1+" 
    Dim subst As String: subst = "$1" 
    Dim regex As New RegExp 

    Dim cell As range 
    For Each cell In cells 
     With regex 
      .Global = True 
      .pattern = pattern 
      If .Test(cell.Value) Then 
       cell.Value = .Replace(cell.Value, subst) 
      End If 
     End With 
    Next cell 
End Function 
+1

あなたのパターンは "(。)$ 1+"でなく "(。)\ 1+"でなければなりません –

+2

'.global'と' .pattern'プロパティをループ外に設定することをお勧めします。セルごとにリセットする必要はありません。 –

+0

@NicolasMaltaisありがとう、それはあまりにも私がそれを必要とする方法ではうまくいかなかった。それはプレート番号をチェックして、誰かがそれを埋めるためにxxxxxと入力した場合にセルをきれいにすることでした。プレートには複数の繰り返し文字があります。牛。正規表現は、2つのttをただ1つにクリーンアップします。私はそれを掃除するためにループを行った。 – popespacious

0

私はそれをこのようにコード化し、それが必要な方法で機能しました。

For pp = 1 To Len(Sheets(1).Cells(x, "I").Value) 
        char1 = Mid(Sheets(1).Cells(x, "I").Value, pp, 1) 
        If pp < Len(Sheets(1).Cells(x, "I").Value) Then 
         char2 = Mid(Sheets(1).Cells(x, "I").Value, pp + 1, 1) 
         If char1 <> char2 Then 
          Exit For 
         End If 
        Else 
         Rows(x).EntireRow.Delete 
         delFlag = 1 
         Exit For 
        End If 
       Next 
関連する問題