0

例

この質問は、私が以前に投稿した質問の続きです: Excel - Return value, after cell has been matching, between headers

前と同じように (さらに):

• 数値が負の場合:

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

• MATCH がある場合は、一致した F の ID (1 列目) の値を出力し、一致した負の値の ID を出力します。

• そうでない場合は、何もしません。

問題は次のとおりです。

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

• 検索はヘッダー間に含まれる必要があり、かつ idx が同じである必要があります。アップロードした画像は鮮明だと思います。

loli_m からの以前の回答を変更して、新しい変数と条件を追加しようとしましたが、すべてうまくいきませんでした:

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

私はすべての助けに非常に感謝しています.

4

1 に答える 1

1

このための VBA コードを次に示します。40,000 行で約 0.4 秒かかります。

Public Sub MatchVals()

    Dim Arr As Variant, dic As Object, v As Variant, Match() As String
    Dim i As Long, j As Long, k As Long, n As Long

    Arr = ActiveSheet.UsedRange.Value2
    Set dic = CreateObject("scripting.dictionary")
    n = UBound(Arr)

    ReDim Match(1 To n, 1 To 1) As String
    k = n
    For i = n To 1 Step -1
        If Arr(i, 3) <> Arr(1, 3) Then
            dic.Add Arr(i, 3) & "|" & Arr(i, 2), i
        Else
            For j = i + 1 To k
                If Arr(j, 3) < 0 Then
                    v = dic(-Arr(j, 3) & "|" & Arr(j, 2))
                    If Not IsEmpty(v) Then
                        Match(v, 1) = Arr(v, 1) & " AND " & Arr(j, 1)
                    End If
                End If
                k = i - 1
            Next j
            dic.RemoveAll
        End If
    Next i

    With ActiveSheet.UsedRange
        .Offset(0, .Columns.Count).Resize(, 1).Value2 = Match
    End With
End Sub
于 2012-08-14T19:02:10.427 に答える