2

私が構築したこのマクロは機能しますが、より高速なバージョンまたはより短い時間で同じことを行うフォーミュラを望んでいます。

私が持っているもの:

    For Each cell In Range("Table_Query_1[[#Data],[Reason2]]")
        For Each PossibleValue In Range("F2", Range("F2").End(xlDown))
            If Len(cell) = 0 Then
             If (InStr(UCase(cell.Offset(0, 1)), UCase(PossibleValue)) <> 0) Then
               cell.Value = PossibleValue.Value
             End If
             Else
                Exit For
             End If
         Next
         If Len(cell) = 0 Then
            cell.Value = cell.Offset(0, -1)
        End If
    Next

次の配列式で何かを機能させることができる唯一の他の方法

=IF(ISNA(MATCH($F$3:$F$10,[@Extra Info],0)),[@Reason],$F$3:$F$10)

しかし、これは行 4 と 9 の場合のように部分一致では機能しません。また、この配列数式が vba マクロよりもはるかに高速であることに疑問を持っています。また、テストの維持がさらに必要になるという事実もあります。この場合、値の範囲 (F2:f3) は、その式を常に更新する必要があるか、元の範囲を F2:F100 のように作成する必要があるため、それだけ時間がかかります。

サンプル

したがって、値の範囲内の任意の値 (この場合は F2:F3) が現在の行の Extra Info 列内にある場合、その行の Reason2 (Offset(0, -1) )) 一致した値に等しい。しかし、何も見つからない場合は、その行 (オフセット(0,1)) の理由を使用してください。

そして2番目の問題は、QueryTableが更新された後にマクロを実行する必要があることですが、変更されるクエリ内のセルにセル変更イベントとして設定すると、最終的なクエリテーブルがインポートされる前にマクロが実行されて終了します。並べ替えました。

4

2 に答える 2

0

これは私が遭遇したソリューションであり、配列を入力する必要はなく、Siddharth Rout のソリューションよりも高速に実行されるようです。私は式を使用しています

=IFERROR(LOOKUP(1E+100,SEARCH($F$2:$F$4,C2),$F$2:$F$4),A2)

F2:F4 の範囲にある C2 の単語を探している場所。何も見つからない場合は、がスローさERRORれ、その状況では、何も見つからなかったことを知っており、元の理由を返すだけです。

図には示されていませんが、F2:F4 を名前付き範囲Reasonsに変換し、式も変更します。

    =IFERROR(LOOKUP(1E+100,SEARCH(Reasons,C2),Reasons),A2)

ここに画像の説明を入力

于 2013-04-26T14:16:32.873 に答える
0

解決しました!

これは、私が上に投稿したコメントの投稿で、初期式がありました。

=IF(COUNT(FIND($F$2:$F$3,C1)),"What Will Go Here",A1)

以下は、代わりに何をしなければならないかを示しています"What Will Go Here"

この数式をセル B2 に入力します。これは配列式であることに注意してください。数式を入力したらCTRL+ SHIFT+を押す 必要があります。ENTER

=IF(COUNT(FIND($F$2:$F$4,C2)),INDEX($F$2:$F$4,MATCH(SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1))),FIND($F$2:$F$4,C2,1),0),0),A2)

スクリーンショット

ここに画像の説明を入力

説明:

FIND($F$2:$F$4,C2,1)配列とともに使用すると、配列が返されます。値を確認するには、それを強調表示して押すF9と、一致が見つかった位置が表示されます。このスクリーンショットを参照してください

ここに画像の説明を入力

つまり、4532 の 3 番目の位置で一致が見つかったことがわかります。何が一致したかはまだわかりません。

次のステップは、配列からその数値の位置を取得することです。したがって、上記の例では位置 2 になり、その位置を見つけるためにMATCH()使用し、MATCH を使用するにはそれが必要になります。3

3したがって、配列から取得するには、次の式を使用します

=SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1)))

ここに画像の説明を入力

これで、3それを使用してMatchPossible Value

=MATCH(SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1))),FIND($F$2:$F$4,C2,1),0)

これにより、2

ここに画像の説明を入力

これで、 内の数字の位置がわかりますPossible Value。その数を見つけるために使用しますINDEX

=INDEX($F$2:$F$4,MATCH(SUM(IF(ISNUMBER(--FIND($F$2:$F$4,C2,1)),--FIND($F$2:$F$4,C2,1))),FIND($F$2:$F$4,C2,1),0),0)

ここに画像の説明を入力

サンプル ワークブック

http://wikisend.com/download/280280/Sample.xlsx

于 2013-04-17T19:22:06.290 に答える