0

スナップショット

ここで私は再び、この素晴らしいコミュニティで助けを求めています. いつかあなたのように恩返しができればと思っています。

図の 4 列目 (D) は、期待される出力です。

これは私が問題を置く方法です:

  • 数値が負の場合、または A がある場合 (A 行の数値は常に負です)。

    • MATCH を使用して、範囲内 (ヘッダー間) に対応する (正の) 番号があるかどうかを確認します。

    • MATCHがあれば、一致したFのID(1列目)の値を出力し、一致したAのIDを出力する

  • そうでない場合は、何もしないか、0 を配置します。

問題は次のとおりです。

  • 負の値が正の値の後に来る可能性があるため、ループする必要があります。

  • 検索はヘッダーの間に含まれている必要があります。

私が配置した他の質問のヒントとコードから独自のソリューションを変更して作成しようとしましたが、成功しませんでした..

どうもありがとう!

4

2 に答える 2

2

これを VBE のイミディエイト ウィンドウに貼り付けて、Enter キーを押してみてください。

Names.Add "i", "=$A$1:$A$12": _
Names.Add "v", "=$B$1:$B$12": _
Names.Add "m", "=$D$1:$D$12": _
Names.Add "h", [IF({1},LOOKUP(ROW(i),ROW(i)/(v=INDEX(v,1))))]: _
Names.Add "l", [IF({1},LOOKUP(ROW(i),ROW(i)/(v=INDEX(v,1)),FREQUENCY(-ROW(i),IF(v=INDEX(v,1),-ROW(i),0))-1))]: _
[m]=[IF(COUNTIF(OFFSET(v,h,,l),"=-"&v),CONCATENATE("=",ADDRESS(ROW(i),COLUMN(i),4),"&"" AND ""&INDEX(",ADDRESS(h+1,COLUMN(i)),":",ADDRESS(h+l,COLUMN(i)),",MATCH(-",ADDRESS(ROW(v),COLUMN(v),4),",",ADDRESS(h+1,COLUMN(v)),":",ADDRESS(h+l,COLUMN(v)),",0))"),"")]: _
Names("h").Delete: _
Names("l").Delete

質問のサンプルデータの出力は次のとおりです。

D5  =A5&" AND "&INDEX($A$2:$A$6,MATCH(-B5,$B$2:$B$6,0))
D11 =A11&" AND "&INDEX($A$11:$A$12,MATCH(-B11,$B$11:$B$12,0))

h: このメソッドは名前付き配列を使用して、ヘッダー位置とセクション長の中間結果を格納します。範囲名(id)、(値)、および(一致) が 40,000 行に拡張されるとl、約 3 ~ 4 秒かかります。これにはもっと簡単な式が考えられますが、大規模なデータ セットを埋めるのは非常に非効率的です。ivm

于 2012-08-10T10:46:16.180 に答える
1

これは私が使用する式です。ヘッダーの範囲を明示的に参照する必要があることに注意してください。タイプミスを避け、読みやすくするために、名前付き範囲を定義することができます。この式は に入れられますD2( にフィル-ドラッグD6)。

=IFERROR(IF(B2<0,INDEX($A$2:$A$6,MATCH(B2*-1,$B$2:$B$6,0),1) & " AND " & A2,""),"")

仕組み:は、一致がない場合にIFERRORをキャッチするだけです。#NAB2が負 (0 未満) の場合、一致する正の値を持つ行の最初の列の値を返します。数式が他のセルにドラッグされるときに 、 などを調べたくないので、INDEXとに絶対参照を使用します。行ごとに変更する必要があるため、比較する値とそれに対応する ID のみを相対 ( / ) にする必要があります。MATCHA3:A7A4:A8A2B2

これがどのように見えるかです。私の値はA1:B6私の数式からのものであるため、次のように変更されることに注意してくださいINDEX($A$1:$A$6...MATCH(B1*-1,$B$1:$B:$6,0)...

XL

于 2012-08-09T14:11:17.593 に答える