1

いつものように、私は最終的に屈服して助けを求める前に、問題に取り組むのに何時間も無駄にしました。

Test1パラメータが一致するシートの特定の行にデータをコピーするために、データのシートでwhileループを実行していますTest2が、現在これを行っている方法は、シート2のすべての行をループすることです-両方のシートデータの長さは 50,000 行を超えているため、私の方法は 10 行のテストでは完全に機能しますが、完全なデータを処理するには数時間かかります。理想的には、各行を比較するのではなく、一致する行を検索できるように、誰かが私のコードを単純化できるかどうか疑問に思っていましたか?

使用してみFindましたが、複数のパラメーターで動作させることができませんでした。

これは私の現在のコードです。スペースを節約するためにパラメーター設定を設定した部分を省略しましたが、ワークシートに存在します。

While row1 <= lastRow1
    Param1 = Sheets("Test1").Cells.Range("A" & row1).Value
    Param2 = Sheets("Test1").Cells.Range("B" & row1).Value
    Param3 = Sheets("Test1").Cells.Range("D" & row1).Value
    Param4 = Sheets("Test1").Cells.Range("E" & row1).Value
    Param5 = Sheets("Test1").Cells.Range("F" & row1).Value
    Cell_to_copy = Sheets("Test1").Cells.Range("G" & row1).Value
*****THIS IS THE BIT I WANT TO OPTIMISE************
        For row2 = 2 To lastRow2
            KParam1 = Sheets("Test2").Cells.Range("A" & row2).Value
            KParam2 = Sheets("Test2").Cells.Range("B" & row2).Value
            KParam3 = Sheets("Test2").Cells.Range("I" & row2).Value
            KParam5 = Sheets("Test2").Cells.Range("G" & row2).Value
                If (InStr(1, KParam1, Param1) > 0) _
                And ((InStr(1, KParam2, Param2) > 0) Or (InStr(1, Param2, KParam2) > 0)) _
                And ((InStr(1, KParam3, Param3) > 0) Or (InStr(1, KParam3, Param4) > 0)) _
                And (InStr(1, KParam5, Param5) > 0) _
                Then
                    Sheets("Test2").Cells.Range("L" & row2).Value = Cell_to_copy
                End If
        Next row2
****************************************************
        row1 = row1 + 1
Wend

代わりに検索機能を実行してクエリに一致する行を見つけ、その行のセル L にIfコピーするように中央のセクションを変更したいと思います。Cell_to_copy

これは可能ですか?絶対に必要な場合は、検索可能な値をTest2単一のセルに連結できますが、誤検出と一致するため、回避できる場合は避けたいと思います。

前もって感謝します、

ジョー

4

1 に答える 1

2

わかりましたので、ルールは次のようです

Test1.column A is found inside Test2.column A
Test1.column B is found inside Test2.column B
Test1.column D is found inside Test2.column I
Test1.column E is found inside Test2.column I
Test1.column F is found inside Test2.column G

次に、Test1.column GTest2.Column Lにコピーします。

そうですか?

Sheet2 の数式を使用してそれを行うことができないのはなぜですか?

多分: Test2.Column L 式 ==IF(FIND(A:A,Sheet1!A:A)>0,Sheet1!G:G)

その式にはOR、他の列をチェックするために他の条件が必要です - 昼食後に試してみます!

そうでない場合は、ADO を使用してワークシートを db テーブルとして扱うことを検討する必要があると思います。

ソース データがどのように見えるか、必要な結果を示していただければ、サンプルを作成して試してみることができますが、以下のリンクを使用して釣り方を学ぶことをお勧めします。

これについては、こちらを参照してください: MSDN KB: Visual Basic または VBA の Excel データで ADO を使用する方法

また、以下もお読みください: Excel ユーザー MVPの Web サイトでExcel をリレーショナル データ ソースとして扱う

また、以下もお読みください:オフィス スペース: ADO を使用して Excel スプレッドシートにクエリを実行する

基本的に、タスクは、必要なフィルタリングされたデータを ADO レコードセットに読み取り、次に CopyFromRecordset メソッドを使用して、結果を一度に Sheet2 にダンプすることです。

読む必要があるので、例やその他のヘルプが必要な場合はお知らせください

フィリップ

于 2013-04-05T11:50:39.517 に答える