Как создать список Excel с данными, исключающими определенные типы комбинаций - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть два списка с одним и тем же набором данных (например, A, B, C, D), и я хочу иметь возможность создать список комбинаций, которые исключают одни и те же данные дважды (например, A / A, B / B, et c) и обратные наборы (то есть A / B означает, что я не хочу B / A)

Я использую Excel для Ma c 2011, если это имеет значение.

Редактировать:

В идеале я хотел бы использовать таблицы вместо ввода отдельных частей данных, потому что фактический список очень длинный

Названы следующие таблицы T_TESTA и T_TESTB: table set

Редактировать 2:

Оба решения, представленные мне ниже, работают отлично, но мне разрешено только выбрать один. Поэтому я выбираю тот, который основан на рационализации проблемы, которая возникла у меня и которая совершенно не связана с самим кодом. Другое решение немного более элегантно для представления данных в виде списка.

Ответы [ 2 ]

1 голос
/ 26 апреля 2020

Попробуйте этот короткий макрос:

Sub Kombo()
    arr = Array("A", "B", "C", "D")

    k = 1
    For i = 0 To 2
        For j = i + 1 To 3
            Cells(k, 1) = arr(i) & arr(j)
            k = k + 1
        Next j
    Next i

End Sub

enter image description here

Циклы настроены на создание комбинаций вместо перестановки .

EDIT # 1:

В этой версии кода мы получаем значения из ячеек, а не из внутреннего массива. Я предполагаю, что значения находятся в E1 до E4 :

Sub Kombo2()
    Dim arr(0 To 3) As Variant

    For i = 0 To 3
        arr(i) = Range("E" & i + 1).Value
    Next i

    k = 1
    For i = 0 To 2
        For j = i + 1 To 3
            Cells(k, 1) = arr(i) & arr(j)
            k = k + 1
        Next j
    Next i

End Sub

Результаты по-прежнему отображаются в столбце A

0 голосов
/ 27 апреля 2020

Вот несколько формул, которые я разработал для Google Sheets здесь и перевел обратно в Excel:

=IFERROR(INDEX(A:A,CEILING((2*COUNTA(A:A)-1-SQRT((2*COUNTA(A:A)-1)^2-8*ROW()))/2,1)),"")

и

=IFERROR(INDEX(A:A,COUNTA(A:A)+ROW()-((2*COUNTA(A:A)-1)*CEILING(((2*COUNTA(A:A)-1)-SQRT((2*COUNTA(A:A)-1)^2-8*ROW()))/2,1)-CEILING(((2*COUNTA(A:A)-1)-SQRT((2*COUNTA(A:A)-1)^2-8*ROW()))/2,1)^2)/2),"")

enter image description here

...