Conte a quantidade de combinações no Excel

0

Eu tenho trabalhado com a macro abaixo, postada anteriormente, mas não posso apresentar outra coluna? Eu tenho quatro colunas de dados e gostaria de saber quantas vezes três números aparecem em qualquer ordem dentro do conjunto de dados. Eu ainda estou aprendendo, então qualquer ajuda seria apreciada.

Por exemplo:

  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

Respostas

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

etc ...

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
    
por col19 01.01.2018 / 20:18

1 resposta

0

Estou fazendo duas suposições aqui:

  1. Cada número da linha é exclusivo (ou seja, você não duplica um número na mesma linha)
  2. Os números estão dentro de um intervalo definido (por exemplo, 1 a MaxNum) e esse MaxNum é um tamanho razoável (por exemplo, < 96)

Para cada linha, você pode armazenar os números como valores verdadeiros em uma sequência de bits (por exemplo, para sua primeira linha (1,16,13,43), os bits 1, 16, 13 e 43 seriam definidos como "1" e os elementos restantes na cadeia de bits seriam definidos como "0" .Para cada linha, a cadeia de bits teria exatamente o mesmo comprimento (daí a suposição de um MaxNum conhecido) .Se a suposição (1) for falsificada, a solução que descrevo aqui não vai funcionar (pelo menos não sem alguma modificação importante).

Você pode então percorrer cada string para fazer uma comparação e armazenar essa comparação de alguma forma

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

A parte 'do something está usando operadores bit a bit (simplesmente and e você deseja contar o número de true para ver se obtém três ou mais). Se seus números fossem pequenos (ou seja, < 32), você poderia usar funções incorporadas, mas os números em seus exemplos são muito maiores. Isso abre duas opções - dividir a cadeia de bits geral em vários valores menores (por exemplo, 32 bits) e iterar sobre eles, ou criar sua própria função simples para um resultado and (pois essa é a única função booleana que você precisa).

Na minha opinião, a maneira mais simples de obter resultados é criar uma coleção de strings de bits válidas (por exemplo, para cada linha você obteria um conjunto de strings (*) contendo três true/'1' bits ou uma única string que é tudo '0' ), ordene estas cadeias de caracteres para que você possa agrupar como strings e depois contar o número de strings em cada grupo junto com um título decodificado para os três números em cada string.

(*) se você tiver (por exemplo) 4 números que correspondem em uma linha, há várias maneiras de obter três números desses quatro números. Isso significa que, para algumas linhas, você terá vários resultados.

A vantagem do método que descrevi acima é que agora ele é escalável. Você pode ter três colunas, quatro colunas, cinco colunas, etc. Você também pode alterar a regra de validade para selecionar três números correspondentes, quatro números correspondentes etc. facilmente.

Eu não forneci nenhum exemplo de codificação real aqui. Embora existam vários conceitos interessantes envolvidos (manipulação de strings se você realmente usar uma string para armazenar os 'bits', operações booleanas, ordenação e agrupamento), cada um deles é representado por tutoriais adequados na web. Além disso, tenho certeza de que esses conceitos foram abordados individualmente no Stack Exchange.

    
por 01.01.2018 / 22:13