0

多くのブログを検索しましたが、効果的な解決策を見つけることができませんでした。私を助けてください。

このようなワークシートデータがあります

Recipie Ingredient      No of Grams     Ingredient Cost  
A10     OREGANO          0.25 gr        10  
A10     OSTUR           60.00 gr        11  
A10     SÓSA            65.50 gr        14  
Á10     HAKK            38.00 gr        18  

すでに材料が存在する場合、レシピの材料費を更新したい。そうでなければ、新しいレコードを挿入する必要があります。

これを行うには、単純な for ループを使用して、一致するレシピをチェックし、そのレシピ内の材料を検索して更新します。私はこれを試しましたが、これはうまくいきます。私の問題は、行数が 10K に増加すると、10K 行すべてに対して検索が 1 つずつ実行されることです。

検索で複数の列を指定してレコードを検索し、すべての行をスキャンする代わりにその単一のレコードを直接見つけることができるソリューションを探しています。

オートフィルターでは、フィルターはバックグラウンドで発生しており、マクロが実行されると、フィルターが発生していることを確認できます。ワークシートにすべてのレコードを表示したい。

私を助けてください 。

データ構造は以下のとおりです。

4

4 に答える 4

0

いくつかの推奨事項を作成したいと思います: 1. モジュール レベルで dCompare を Dictionary として宣言します。 2. 辞書を入力する手順で dCompare の新しいインスタンスを作成します。

Set dCompare = New Dictionary

3.キーを構成するすべての値を文字列として変換します CStr(Value1)...

  1. 役に立たなくなったすべてのオブジェクトを破棄します (引用符は機能しませんか???):

    dCompare が Nothing でない場合は、dCompare = Nothing を設定します。

5.引数を正しい方法で宣言します。

findCorrelate(ByVal value1 As String, ByVal value2 As String) As Long

ではない:

私もこの非常に強力なオブジェクトを使用するのが好きです

于 2013-12-09T23:45:49.990 に答える
0

vlookup のような単純なものを使用して、別のワークシート (または同じワークシートの別の範囲) の成分の価格 (単位あたり) を見つけてみませんか?

価格の更新または成分の追加の場合、1 つの場所のみで何かを変更または追加する必要があることを意味します。これは、VBA を使用する代わりに手動で行うこともできます。

于 2014-09-09T14:49:38.287 に答える
0

Findループの代わりにこのメソッドを使用することで運が良くなるかもしれませんが、最近ではDictionary、特にこのようなタスクのために、オブジェクトをますます使用していることに気付きました。[ツール] メニューから参照として「Microsoft Scripting Runtime」を有効にする必要があります。次のように簡単です。

Dim dCompare As New Dictionary 
....
For i = 2 To bottomRow
    dCompare.Add (Worksheets("...").Range("L" & i).value & Worksheets("...").Range("I" & i).value), i
Next i

基本的には好きなように入力できますが、必要なワークシートの値をキーとして連結し、行番号を値として配置するだけです。次に、取得のために:

Function findCorrelate(ByVal value1, value2 As String) As Long
Dim oppositeRow As Long
    oppositeRow = dCompare.Item(value1 & value2)
findCorrelate = oppositeRow
End Function

検索する必要がある値 (これがキーになります) を入力すると、行番号が存在する場合は値として吐き出されます。それ以外の場合は 0 を返します (ただし、-1 の方がよい場合もあります)。この方法では、ループを 1 回だけ行う必要があります。少なくとも、この方法で実行時間を大幅に短縮できます。

于 2013-04-08T18:48:52.947 に答える
0

上記のコメントで述べたように、これはアクセスする必要がある典型的な機能です (Excel をフロントとして使用したい場合でも)。上に表示されているのはテーブル構造で、スプレッドシートにフィードされる前にクエリを要求された食品です。

MS Access を使用すると、インデックスに基づいてインデックスと検索を作成できます。これにより、多くのレコードがある場合にパフォーマンスが大幅に向上します。(システムは、すべてのレコードを実行するのではなく、索引付けされたレコードに基づいて検索します)。10,000 レコードのテーブルについて話しているのであれば、間違いなく Access の方が適していると思います。

お勧めしませんが、ファイルにライブラリ参照を追加することで、ADODB または DAO (Access はネイティブ DAO を使用) を使用して、Excel シートをデータベース テーブルとして扱うことができます。このようにして、SQL を使用して、データシートですべての CRUD 操作を実行できます。
お勧めしない理由は、Excel が RDBMS に置き換えられることを意図していないためです (たとえば、リレーショナル db 構造をサポートしていないため、サポートが難しくなり、参照/データの整合性を管理する必要があります)。 VBA または手動.
Access でいくつかの基本的なことを行う方法を学ぶには 1 日かかる場合がありますが、すべてをプログラミングしてこのシステムを維持する (チェックや別のシート テーブルからのデータの取得などを含む...) には、永遠にかかる場合があります。

さらに:
コードが遅くなる理由は、Excel シートからすべてのレコードを行ごとに明示的に読み取ってチェックしていると思われるためです。
ループを使用してこのコードをさらに高速に実行したい場合は、範囲全体を配列に読み取り、配列をループしてメモリ内でチェックを実行する必要があります。
コードの実行は許容できると思いますが、タイマーを設定してパフォーマンスを確認し、カウンターを表示するステータスバー (application.statusbar) に進行状況を追加で通知できます。

于 2012-10-01T09:44:17.940 に答える