Я работал с макросом ниже, опубликованным ранее, но не могу представить другой столбец? У меня есть четыре столбца данных, и я хотел бы знать, сколько раз три числа появляются в любом порядке в наборе данных. Я все еще учусь, поэтому любая помощь будет оценена.

Например:

  1  16  13  43
  1  19  45  58
  1  69  58   3
 13  16  63   1
  6  34  33  59
  6  45  19  58
  6  43  48  50

ответы

 13, 16,  1 = 2
 45, 58, 19 = 2

так далее...

Option Explicit

Sub GetCombinations()
    Dim sheet1, sheet2 As Worksheet
    Set sheet1 = Worksheets(1)
    Set sheet2 = Worksheets(2)

    Dim sStartColumn As String
    Dim iTopRow As Long
    Dim sEndColumn As String
    Dim iBottomRow As Long

    sStartColumn = "A"
    iTopRow = 1
    sEndColumn = "E"
    iBottomRow = sheet1.UsedRange.Rows.Count

    Dim Rng As Range
    Dim sRange1 As String
    sRange1 = sStartColumn & CStr(iTopRow) & ":" & sEndColumn & CStr(iBottomRow)

    Set Rng = sheet1.Range(sRange1)
    Rng.Sort Key1:=Range("A2"), Order1:=xlAscending, _
         Key2:=Range("B2"), Order2:=xlAscending, _
         Orientation:=xlSortColumns, Header:=xlYes

    Dim i, j As Integer
    j = 2
    For i = 2 To iBottomRow
        If sheet1.Cells(i, 4) Then
            sheet2.Cells(j, 1) = sheet1.Cells(i, 1)
            sheet2.Cells(j, 2) = sheet1.Cells(i, 2)
            sheet2.Cells(j, 3) = sheet1.Cells(i, 5)
            j = j + 1
        End If
    Next i
End Sub

1 ответ1

0

Я делаю два предположения здесь:

  1. Каждый номер строки уникален (т.е. вы не дублируете номер в той же строке)
  2. Числа находятся в определенном диапазоне (например, от 1 до MaxNum), и что MaxNum является разумным размером (например, <96)

Для каждой строки вы можете хранить числа как значения истинности в битовой строке (например, для вашей первой строки (1,16,13,43) биты 1, 16, 13 и 43 будут установлены в "1", а остальные элементы в битовой строке будут установлены в "0". Для каждой строки битовая строка будет иметь одинаковую длину (отсюда и предположение об известном MaxNum). Если предположение (1) будет опровергнуто, решение, которое я здесь опишу, не будет работать (по крайней мере, без какой-либо серьезной модификации).

Затем вы можете перебирать каждую строку для сравнения и сохранять это сравнение каким-либо образом.

For I = 1 to numString - 1
  for J = I+1 to numString
    ' Do something
  Next J
Next I

Часть 'do something использует побитовые операторы (просто, and вы хотите посчитать количество true результатов, чтобы увидеть, если вы получите три или более). Если бы ваши числа были маленькими (то есть <32), вы могли бы использовать встроенные функции, но числа в ваших примерах намного больше. Это открывает два варианта - разбить всю битовую строку на несколько меньших (например, 32-битных) значений и выполнить итерации по ним, или создать собственную простую функцию для результата and результата (так как это единственная логическая функция, которая вам требуется.

На мой взгляд, самый простой способ получить результаты - создать коллекцию допустимых битовых строк (т. Е. Для каждой строки вы получите набор строк (*), которые содержат три true/'1' бита, или одну строку, которая является все '0'), расположите эти строки так, чтобы вы могли группировать одинаковые строки, а затем подсчитывать количество строк в каждой группе вместе с декодированным заголовком для трех чисел в каждой строке.

(*) если у вас есть (например) 4 числа, которые совпадают в ряду, есть несколько способов получить три числа из этих четырех чисел. Это означает, что для некоторых строк у вас будет несколько результатов.

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

Я не предоставил никаких примеров реального кодирования здесь. Хотя существует целый ряд интересных концепций (манипулирование строками, если вы фактически используете строку для хранения «битов», логические операции, сортировку и группировку), каждое из них представлено в Интернете соответствующими учебниками. Кроме того, я уверен, что эти концепции были индивидуально рассмотрены в Stack Exchange.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .