Підраховуйте кількість комбінацій в Excel


0

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

Наприклад:

  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

Відповіді:


0

Тут я роблю два припущення:

  1. Кожен номер рядка є унікальним (тобто ви не дублюєте номер в одному рядку)
  2. Цифри знаходяться в межах визначеного діапазону (наприклад, від 1 до MaxNum) і що MaxNum є розумним розміром (наприклад, & lt; 96)

Для кожного рядка можна зберігати числа як значення істинності в бітовій рядку (наприклад, для вашого першого рядка (1,16,13,43), біти 1, 16, 13 і 43 будуть встановлені в "1", а решта Для кожного рядка бітова рядок має бути точно однаковою довжиною (отже, припущення про відомий MaxNum) .Якщо припущення (1) фальсифікується, то рішення, яке я тут описую, не буде робота (принаймні, без деяких значних змін).

Потім можна повторити кожен рядок, щоб зробити порівняння і зберегти це порівняння

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

The 'do something частина використовує побітові оператори (просто and і потрібно підрахувати кількість true результатів, щоб побачити, якщо ви отримаєте три або більше). Якщо ваші числа були малими (тобто <32), ви могли б використовувати вбудовані функції, але числа у ваших прикладах набагато більші. Це відкриває два варіанти - розділити загальну бітну рядок на кілька менших (наприклад, 32-бітних) значень і переглядати їх, або створити свою власну просту функцію для and результат (оскільки це єдина логічна функція, яку вам потрібно.

На мій погляд, найпростіший спосіб отримати результати - створити колекцію дійсних рядків бітів (тобто для кожного рядка ви отримаєте набір рядків (*), які містять три true/'1' біти або єдиний рядок '0' ), замовляйте ці рядки, щоб можна було групувати подібні рядки, а потім підраховувати кількість рядків у кожній групі разом з розшифрованим заголовком для трьох номерів у кожному рядку.

(*) Якщо у вас є (наприклад) 4 числа, які відповідають ряду, існує кілька способів отримати три числа з цих чотирьох чисел. Це означає, що для деяких рядків ви матимете кілька результатів.

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

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.