3

企業が一致する程度を示すユーザー定義関数を作成しました。この関数は、thisRange として使用する範囲が行 2800 以下である限り、非常にうまく機能します。4000 社の企業のリストがあり、それらを 2800 を超える行に含めようとすると、機能しません。範囲はそれほど大きくありませんか?この問題を解決する方法はありますか?

コードは次のとおりです。

Function bestMatch(company As String, thisRange As Range) As String

Dim min As Double, nextMin As Double
Dim cell As Range
Dim score As Double
Dim best As String, str As String, nextBest As String
min = 99999
nextMin = 99999

For Each cell In thisRange.Cells
    str = cell.Value
    substr1 = Left(str, 1)
    substr2 = Left(company, 1)
    score = Leven(company, str)
    If score < min And substr1 = substr2 Then
        min = score
        best = str
    ElseIf score = min And substr1 = substr2 Then
        min = score
        best = str + " && " + best
    ElseIf score > min And score <= nextMin And substr1 = substr2 Then
        nextMin = score
        nextBest = str
        min = min
        best = best
    End If
    Next

If min > 15 Then
    bestMatch = "No Match Found"
ElseIf min <= 15 Then
    bestMatch = "1. " + best + "    2. " + nextBest
End If

End Function
4

3 に答える 3

2

Excel の仕様と制限の Web ページを参照してください。

このページのセクションは次のとおりです。 ワークシートとワークブックの仕様と制限 計算の仕様と制限 チャートの仕様と制限 ピボットテーブルとピボットグラフ レポートの仕様と制限 共有ワークブックの仕様と制限

範囲はワークシート全体と同じくらい大きくなる可能性があると思います。ワークシートのサイズ制限は、1,048,576 行 x 16,384 列としてリストされています。

「計算の仕様と制限」セクションでは、選択範囲の制限は 2048 と記載されています。

于 2014-06-30T18:41:03.387 に答える
1

最初に配列内のすべての値をダンプしようとするとどうなりますか

Function bestMatch(company As String, start_cell As Range, int count) As String
    Dim vals() as Variant
    vals = start_cell.Resize(count,1).Value2

    For i=1 to count
        substr1 = Left(vals(i,1), 1)
        ...
    Next i
    ...
End Function

4000 個を超えるセルでこれを試しましたが、問題はありません。

于 2013-07-02T19:50:06.347 に答える
0

Range オブジェクトの部分文字列には制限があり、使用している Excel のバージョンによって異なります。しかし、私が覚えている限りでは、バージョンに関係なく、4000 未満であると確信しています。

これを好転させるには、いくつかのパーツに分割して、Union を使用する必要があります。

于 2013-07-02T16:09:48.913 に答える