AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / coding / Perguntas / 78792464
Accepted
ROCA
ROCA
Asked: 2024-07-25 17:16:43 +0800 CST2024-07-25 17:16:43 +0800 CST 2024-07-25 17:16:43 +0800 CST

Compare uma matriz numérica com registros existentes no Excel ou VBA

  • 772

Eu tenho uma planilha com mais de 3k linhas e 15 colunas. Cada coluna é preenchida com um número aleatório de 1 a 25. Muito parecido com os resultados da loteria, onde cada coluna é um número sorteado na loteria. (de 1 a 25)

Preciso comparar se a sequência na linha 1 (para todas as 3k+ linhas) é encontrada em qualquer outra linha. Ou seja, se os resultados da loteria apareceram duas vezes. O problema é que a bola 1 pode aparecer em qualquer uma das 15 colunas diferentes.

insira a descrição da imagem aqui

A fórmula do Excel é uma fórmula que posso colocar na coluna a seguir? Ou um código VBA (idealmente) para comparar?

excel
  • 4 4 respostas
  • 82 Views

4 respostas

  • Voted
  1. Tom Sharpe
    2024-07-25T17:48:02+08:002024-07-25T17:48:02+08:00

    Apenas um exemplo de brinquedo, mas você poderia tentar algo assim, assumindo que cada linha esteja em ordem crescente:

    =SUM(--(MMULT(ABS(A2:C2-A$2:C$5),TRANSPOSE(COLUMN(A$2:C$5))^0)=0))
    

    Exemplo sem correspondências

    insira a descrição da imagem aqui

    Se a resposta for maior que 1, há uma duplicata.

    No Excel 2016, pode ser necessário inseri-lo na matriz ou usar Sumproduct.

    Aqui está um exemplo com uma correspondência

    insira a descrição da imagem aqui

    • 4
  2. Best Answer
    FaneDuru
    2024-07-25T18:35:42+08:002024-07-25T18:35:42+08:00

    Por favor, tente o próximo código. Deve fazer o trabalho em alguns segundos, de acordo com a probabilidade de não haver correspondência nas primeiras colunas:

    Sub MatchFirstRowNumber()
     Dim ws As Worksheet, lastR As Long, rng As Range, arr
     Dim i As Long, j As Long, mtch, boolNo As Boolean
     
     Set ws = ActiveSheet
     lastR = ws.Range("A" & ws.rows.count).End(xlUp).row
     Set rng = ws.Range("A2:O" & lastR)
     arr = rng.rows(1).Value2 'place the first row in an array
    
     For i = 2 To rng.rows.count
        boolNo = True
        For j = 1 To UBound(arr, 2)
          mtch = Application.match(arr(1, j), rng.rows(i), 0)
          If IsError(mtch) Then boolNo = False: Exit For
        Next j
        If boolNo Then MsgBox "Row """ & i + 1 & """ contains the same nubmers as the first one!", vbInformation, "A match has been found"
     Next
    End Sub
    

    Como retorno envia uma mensagem mencionando a linha correspondente ...

    O código pode ser adaptado para (também) retornar as linhas com um número específico de correspondências (14, por exemplo...).

    Ou pode registrar as linhas correspondentes e enviar uma mensagem no final, mencionando-as.

    Por favor, envie algum feedback depois de testá-lo.

    Editado :

    A próxima versão envia uma única mensagem enumerando todas as correspondências:

    Sub MatchFirstRowNumbers()
     Dim ws As Worksheet, lastR As Long, rng As Range, arr, arrRow
     Dim i As Long, j As Long, mtch, boolNo As Boolean, strMatches As String
     
     Set ws = ActiveSheet
     lastR = ws.Range("A" & ws.rows.count).End(xlUp).row
     Set rng = ws.Range("A2:O" & lastR)
     arr = rng.rows(1).Value2 'place the first row in an array
     
     strMatches = "The next matching rows have been found:" & vbCrLf
     For i = 2 To rng.rows.count
        boolNo = True
        For j = 1 To UBound(arr, 2)
          mtch = Application.match(arr(1, j), rng.rows(i), 0)
          If IsError(mtch) Then boolNo = False: Exit For
        Next j
        If boolNo Then strMatches = strMatches & "Row " & i + 1 & vbCrLf
     Next
     If strMatches <> "The next matching rows have been found:" & vbCrLf & vbCrLf Then MsgBox strMatches, vbInformation, "All matches"
    End Sub
    

    Segunda edição :

    A próxima versão é ainda mais rápida. Ele aproveita o fato de que duas matrizes podem ser combinadas diretamente, portanto, não há iteração entre os elementos da matriz de referência:

    Sub MatchFirstRowNumbers()
     Dim ws As Worksheet, lastR As Long, rng As Range, arr, arrRow
     Dim i As Long, j As Long, arrMtch, boolNo As Boolean, strMatches As String
     
     Set ws = ActiveSheet
     lastR = ws.Range("A" & ws.rows.count).End(xlUp).row
     Set rng = ws.Range("A2:O" & lastR)
     arr = rng.rows(1).Value2 'place the first row in an array
     
     strMatches = "The next matching rows have been found:" & vbCrLf
     For i = 2 To rng.rows.count
        boolNo = True
        For j = 1 To UBound(arr, 2)
          arrMtch = Application.IfError(Application.match(arr, rng.rows(i).Value, 0), "X")  'it places "|" for not matching elements
          If Not IsError(Application.match("X", arrMtch, 0)) Then boolNo = False: Exit For 'if "X" exists change boolNo value and exist For
        Next j
        If boolNo Then strMatches = strMatches & "Row " & i + 1 & vbCrLf
     Next
     If strMatches <> "The next matching rows have been found:" & vbCrLf & vbCrLf Then MsgBox strMatches, vbInformation, "All matches"
    End Sub
    
    • 4
  3. nkalvi
    2024-07-25T20:51:46+08:002024-07-25T20:51:46+08:00

    Obrigado pelo desafio divertido! Embora você tenha aceitado uma resposta, gostaria de ver uma maneira de fazer isso sem o VBA e com o Excel 2016:

    • Adicione uma coluna auxiliar com texto classificado e unido, infelizmente precisa ser preenchido para todas as linhas
      =CONCAT(TEXT(SMALL(C2:Q2, COLUMN(C2:Q2) - COLUMN($C$2) + 1), "00"))
    • Outra coluna para encontrar duplicatas, preencha novamente
      =COUNTIF($S$2:$S$11, S2) > 1
    • Use formatação condicional para destacar as linhas duplicadas (não tenho certeza se isso funciona no Excel 2016 - não tenho para testar); com a primeira célula da primeira linha selecionada, insira a primeira célula da etapa acima com referência de coluna fixa e referência de linha relativa.
      =$T2

    Fórmula e texto

    • 3
  4. VBasic2008
    2024-07-25T22:05:41+08:002024-07-25T22:05:41+08:00

    Designar linha contendo os mesmos números inteiros

    • Para cada linha, isso preencherá a Rcoluna com uma lista separada por vírgulas (pelo menos dois números) de cada índice de linha (linha do intervalo) contendo os mesmos 15 números. A célula resultante fica vazia quando nenhuma linha 'correspondente' é encontrada,

    • Infelizmente, o Count/Matchcombo tem um desempenho muito lento em um número tão grande de comparações. Demorou quase 4 minutos para concluir a tarefa de 3 mil linhas para encontrar o único conjunto de duas linhas 'correspondentes'.

    • Os dados de amostra foram gerados usando a fórmula MS365 lenta, mas relativamente fácil de criar:

      =DROP(REDUCE("",SEQUENCE(3000),LAMBDA(rr,r,
          VSTACK(rr,TAKE(SORTBY(SEQUENCE(,25),RANDARRAY(,25)),,15)))),1)
      

      copiado e colado como valores. Ele pode ser replicado com uma macro VBA rápida (por exemplo, procure por shuffle array ).

    insira a descrição da imagem aqui

    Sub TestMatch()
        
        Dim t As Double: t = Timer
        
        Const COLS_COUNT As Long = 15
        Const FIRST_ROW As Long = 2
        Const FIRST_COLUMN As Long = 3
        Const COLUMN_OFFSET As Long = 1
        Const DELIMITER As String = ", "
        
        Dim ws As Worksheet: Set ws = ActiveSheet
        Dim rg As Range: Set rg = ws.Range("A1").CurrentRegion
        
        Dim rCount As Long: rCount = rg.Rows.Count - 1
        
        Dim srg As Range:
        Set srg = rg.Resize(rCount, COLS_COUNT).Offset(FIRST_ROW - 1, FIRST_COLUMN - 1)
        
        Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
        
        Dim i As Long
        
        For i = 1 To rCount
            dict(i) = Empty
        Next i
        
        Dim srrg As Range, drrg As Range, Count As Long, j As Long
        
        With Application
            For i = 1 To rCount - 1
                If dict.Exists(i) Then
                    For j = i + 1 To rCount
                        If dict.Exists(j) Then
                            Count = .Count(.Match(srg.Rows(i), srg.Rows(j), 0))
                            If Count = COLS_COUNT Then
                                If IsEmpty(dict(i)) Then
                                    Set dict(i) = CreateObject("Scripting.Dictionary")
                                End If
                                dict(i)(j) = Empty
                                dict.Remove j
                            End If
                        End If
                    Next j
                End If
            Next i
        End With
                        
        If dict.Count = rCount Then Exit Sub ' no duplicate rows found
        
        Debug.Print Timer - t
        
        Dim Data() As String: ReDim Data(1 To rCount, 1 To 1)
        
        Dim oKey As Variant, iKey As Variant, rStr As String
        
        For Each oKey In dict.Keys
            If Not IsEmpty(dict(oKey)) Then
                rStr = oKey
                rStr = rStr & DELIMITER & Join(dict(oKey).Keys, DELIMITER)
                Data(oKey, 1) = rStr
                For Each iKey In dict(oKey).Keys
                    Data(iKey, 1) = rStr
                Next iKey
            End If
        Next oKey
            
        Dim drg As Range:
        Set drg = srg.Columns(COLS_COUNT).Offset(, COLUMN_OFFSET)
        drg.Value = Data
            
        Debug.Print Timer - t
            
    End Sub
    
    • 1

relate perguntas

  • Como posso retornar linhas específicas onde EXISTE uma taxa no contrato listado, mas NÃO há taxa no sistema?

  • adicionar automaticamente um campo de referência em uma tabela quando alguns valores são repetidos?

  • percorrer a coluna com a alteração do endereço da célula

  • Pesquise uma string e os valores de saída correspondentes a essa string

  • Existe uma maneira no Excel de contar as ocorrências de um texto específico em uma string, mas também incluir o caractere anterior?

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Vue 3: Erro na criação "Identificador esperado, mas encontrado 'import'" [duplicado]

    • 1 respostas
  • Marko Smith

    Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle?

    • 1 respostas
  • Marko Smith

    Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores?

    • 1 respostas
  • Marko Smith

    Como faço para corrigir um erro MODULE_NOT_FOUND para um módulo que não importei manualmente?

    • 6 respostas
  • Marko Smith

    `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso?

    • 3 respostas
  • Marko Smith

    Quando devo usar um std::inplace_vector em vez de um std::vector?

    • 3 respostas
  • Marko Smith

    Um programa vazio que não faz nada em C++ precisa de um heap de 204 KB, mas não em C

    • 1 respostas
  • Marko Smith

    PowerBI atualmente quebrado com BigQuery: problema de driver Simba com atualização do Windows

    • 2 respostas
  • Marko Smith

    AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos

    • 1 respostas
  • Marko Smith

    Estou tentando fazer o jogo pacman usando apenas o módulo Turtle Random e Math

    • 1 respostas
  • Martin Hope
    Aleksandr Dubinsky Por que a correspondência de padrões com o switch no InetAddress falha com 'não cobre todos os valores de entrada possíveis'? 2024-12-23 06:56:21 +0800 CST
  • Martin Hope
    Phillip Borge Por que esse código Java simples e pequeno roda 30x mais rápido em todas as JVMs Graal, mas não em nenhuma JVM Oracle? 2024-12-12 20:46:46 +0800 CST
  • Martin Hope
    Oodini Qual é o propósito de `enum class` com um tipo subjacente especificado, mas sem enumeradores? 2024-12-12 06:27:11 +0800 CST
  • Martin Hope
    sleeptightAnsiC `(expression, lvalue) = rvalue` é uma atribuição válida em C ou C++? Por que alguns compiladores aceitam/rejeitam isso? 2024-11-09 07:18:53 +0800 CST
  • Martin Hope
    The Mad Gamer Quando devo usar um std::inplace_vector em vez de um std::vector? 2024-10-29 23:01:00 +0800 CST
  • Martin Hope
    Chad Feller O ponto e vírgula agora é opcional em condicionais bash com [[ .. ]] na versão 5.2? 2024-10-21 05:50:33 +0800 CST
  • Martin Hope
    Wrench Por que um traço duplo (--) faz com que esta cláusula MariaDB seja avaliada como verdadeira? 2024-05-05 13:37:20 +0800 CST
  • Martin Hope
    Waket Zheng Por que `dict(id=1, **{'id': 2})` às vezes gera `KeyError: 'id'` em vez de um TypeError? 2024-05-04 14:19:19 +0800 CST
  • Martin Hope
    user924 AdMob: MobileAds.initialize() - "java.lang.Integer não pode ser convertido em java.lang.String" para alguns dispositivos 2024-03-20 03:12:31 +0800 CST
  • Martin Hope
    MarkB Por que o GCC gera código que executa condicionalmente uma implementação SIMD? 2024-02-17 06:17:14 +0800 CST

Hot tag

python javascript c++ c# java typescript sql reactjs html

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve