2016-09-15 9 views
1

Excel 2010でマクロを使用すると、名前の付いた範囲で定義されたすべての「無効な」文字をスペースで置き換えようとしています。Excel 2010 vbaマクロの代替ワイルドカード文字(?および*)

Dim sanitisedString As String 
    sanitisedString = Application.WorksheetFunction.Clean(uncleanString) 
    Dim validCharacters As Range 
    Set validCharacters = ActiveWorkbook.Names("ValidCharacters").RefersToRange 
    Dim pos As Integer 
    For pos = 1 To Len(sanitisedString) 
     If WorksheetFunction.CountIf(validCharacters, Mid(sanitisedString, pos, 1)) = 0 Then 
      sanitisedString = WorksheetFunction.Replace(sanitisedString, pos, 1, " ") 
     End If 
    Next 

CountIfはこれらをワイルドカード文字として解釈しているため、*と?を除くすべての文字に適用されます。

私が使用して、COUNTIFのすべての文字をエスケープしようとしている:

If WorksheetFunction.CountIf(validCharacters, "~" & Mid(sanitisedString, pos, 1)) = 0 

をが、これは関係なく、リスト内にあるか否かの、すべての文字が交換されるに至りました。

使用してforループ "〜*" と "?〜" の後に置かれ、私は2つの別々の代替コマンドをやってみました

、:

sanitisedString = WorksheetFunction.Substitute(sanitisedString, "~*", " ") 
sanitisedString = WorksheetFunction.Substitute(sanitisedString, "~?", " ") 

が、*と?まだそれを作る。

私は間違っていますか?

答えて

2

を心配するには、2つのワイルドカードがonlylがあるので、あなたはそれらの明示のためにテストすることができます。

Dim character As String 
For pos = 1 To Len(sanitisedString) 
    character = Mid(sanitisedString, pos, 1) 
    If character = "*" Or character = "?" Then character = "~" & character 
    If WorksheetFunction.CountIf(validCharacters, character) = 0 Then 
     Mid$(sanitisedString, pos, 1) = " " 
    End If 
Next 
+0

は素晴らしい、ありがとう:)なぜ私はそのことを考えていませんでした... – simonalexander2005