2016-08-27 19 views
0

セルをいくつかの部分文字列で検索するUDFがあります。式の出力が発見された部分文字列に依存します。繰り返し文字列検索を高速化する方法

Function StringSearch(Rge As Range) As String 
Dim Str As String, Output As String 
Str = Rge.Value 

If InStr(Str, "words") > 0 Then Output = "Output 1" 
If InStr(Str, "other words") > 0 Then Output = "Output 2" 
If InStr(Str, "different words") > 0 Then Output = "Output 3" 

StringSearch = Output 

End Function 

私はここで機能の低下したフォームを用意しました - 実際にInStr関数は、異なる文字列を検索するのに約20回呼び出されます。

問題は、機能が非常に遅いことです。数百のセルに適用する必要があります。だから私はそれをどのようにスピードアップできるかについていくつかのアドバイスを期待していました。前もって感謝します。

+1

よりもはるかに高速になります試みることができるあなたが探しする必要がありますか範囲内でテストされたすべての単語に対して 'Instr'のすべての可能なシナリオ?セルがその範囲内にあるかどうかテストしていますか? –

+1

「If ... Then ... ElseIf ....」のようにチェックするのはどうですか? –

+0

@ Wiktor Stribzew私は通常の 'If .... Then ... ElseIf ....'アプローチを考えましたが、コードを高速化することはできません。その理由は、この関数はしばしば 'InStr'ステートメントのどれも正の値を返しません(彼らのどれもが探している文字列を見つけられないので)ので、速度の向上はわずかです。 @シャイラドーはい。文字列に "単語"、 "他の単語"、 "別の単語"のいずれかが含まれているかどうかを確認する必要があります。私が確認する必要があるものは約20種類あります。 – Mas

答えて

0

ない、それは大きな違いを行います場合は必ず、あなたはLikeオペレータ

Function StringSearch(s As String) As String 
    If s Like "*words*" Then StringSearch = "Output 1": Exit Function 
    If s Like "*other words*" Then StringSearch = "Output 2": Exit Function 
    If s Like "*different words*" Then StringSearch = "Output 3": Exit Function 
End Function 

が、Excelの関数がUDF

= If(CountIf(A1, "*words*"   ), "Output 1", 
    If(CountIf(A1, "*other words*" ), "Output 2", 
    If(CountIf(A1, "*different words*"), "Output 3", "") 
+0

私は、Excel関数がUDFと比較してどれほど速く実現しているのか分かりませんでした(なぜExcel関数がUDFより速いのかわかりません)。私は巨大な機能をExcelで書いてしまったので、今は非常に高速です。ありがとう – Mas

+0

@私の推測は[Excelでのマルチスレッド再計算](https://msdn.microsoft.com/en-us/library/office/bb687899.aspx)であり、高速に最適化されているためです。私はVBAでそれらを使って自分のコードをスピードアップしています。 – Slai

+0

ランタイム@SlaiコンパイルでもUDFがかなり遅くなる – arcadeprecinct

関連する問題