3

以下のコード スニペットを使用して、「データ サマリー」シートから値を取得し、「QG サマリー」シートでそのデータを見つけます。一致するものがあれば、「QG サマリー」シートの最初の列に格納されているデータを取得します。 aCell 変数によって識別される行。

Dim str1 As String
Dim aCell As Range

str1 = Worksheets("Data Summary").Cells(aCell.Row, 3).Value

If (str1 <> "") Then

    Set aCell = Worksheets("QG Summary").Columns(3).Find(What:=str1 _
            , LookIn:=xlValues, LookAt:=xlWhole, SearchOrder:=xlByRows, _
            SearchDirection:=xlNext, MatchCase:=False)

    If Not aCell Is Nothing Then
        str1 = Worksheets("QG Summary").Cells(aCell.Row, 1).Value
    End If

End If

このコードは、変数 str1 の値が大きい (326 文字) 場合を除いて、すべてのケースで正常に機能します。str1 変数が大きな値に遭遇すると、このコードは実行時エラー '13': タイプの不一致で中断します。なんで?

4

1 に答える 1

1

Siddharth Rout が言うように、 の "What" パラメーターの文字数制限に関連している可能性がありますFind。あなたの質問は「なぜこれがうまくいかないのですか」と尋ねるように言われていることは承知していますが、その問題を回避する必要を避けるために、同じ機能を実装する別の方法に興味があるかもしれないと思いました.

ダン... Excelの数式を次のように使用するオプションを提案するつもりでしたが、=INDEX(Sheet2!$A$2:$C$8, MATCH(Sheet1!A3,Sheet2!$C$2:$C$8,0), 1)テストしたところ、MATCH関数は同じ文字制限の問題に苦しんでいるようです。

この場合に機能する別の方法は、範囲内の各セル値をチェックして、自分で列を検索することです。この方法での文字列の比較は、組み込みの Excel 関数と同じ制約を受けません。列全体を検索しているため、元のコードと同じようにその列のヘッダーも検索されるため、注意してください。の値を使用する前に、 の値をチェックしfoundMatchて一致が見つかったかどうかを確認できますstrResult。サンプル ルックアップの行の値 2 をハードコーディングしましたWorksheets("Data Summary")。コードにはまだ定義されていない aCell.Row があるため、スニペットにないコードの一部によって設定されていると想定します。

Dim strLookup As String
Dim strResult As String
Dim aCell As Range
Dim foundMatch As Boolean

strLookup = Worksheets("Data Summary").Cells(2, 1).Value

foundMatch = False

If (strLookup <> "") Then
    For Each aCell In Worksheets("QG Summary").Columns(3).Cells
        If aCell.Value = strLookup Then
            strResult = Worksheets("QG Summary").Cells(aCell.Row, 1).Value
            foundMatch = True
            Exit For
        End If
    Next
End If
于 2013-10-24T22:32:14.690 に答える