Verificando se a soma da quantidade arbitrária de células em uma coluna corresponde a uma célula em outra

0

O resultado que gostaria de alcançar é a coluna 'C':

Para facilitar o processo de copiar / colar essa planilha, aqui estão os dados que podem ser copiados:

ID
1
2
3
4
5
6
7
8
9

Number
1000
300


800
300


200

ID
1
1
1
2
2
5
5
6
9
9
9
9

Number
100
300
700
200
100
600
300
300
900
100
100
300

Eu quero fazer com que ele possa verificar se alguma combinação dos números de cada conjunto de IDs exclusivos é igual ao número do ID exclusivo na Coluna 'A'. Assim, por exemplo, para ID 1, isso é verdade porque o '700' e '300' da coluna 'E' ID 1 é um conjunto possível de números que somam os 1000 na ID da coluna B 1. Mas, por exemplo para o ID 5, não há como somar os números '600' e '300' para obter '800'.

Eu sei que posso usar a função COUNT para contar quantos de cada IDs existem na coluna 'D', mas como esse pode ser qualquer número natural, incluindo 0, não consigo descobrir uma maneira de fazer uma IF / SUM loop que termina quando a contagem atinge o mínimo ou máximo de COUNT , como você faria na programação. Eu tenho que de alguma forma criar uma sub-matriz dos IDs com seus respectivos números e iniciar o loop de alguma forma?

Não sei se expliquei meus pensamentos com clareza. Por favor, peça qualquer esclarecimento necessário. Obrigado.

    
por user152294 22.03.2018 / 03:22

2 respostas

1

Como você pode ter até 10 números de ID e como a soma pode ser composta de qualquer dos valores correspondentes na coluna E (incluindo valores não contíguos), Dan está certo: você precisa uma solução VBA.

Esta função definida pelo usuário (UDF) deve muito a essa resposta de @ Gary's Student :

Function CheckSums(ID, TargetSum)
    Dim NumBits As Long, NumSums As Long, RngStart As Integer
    Dim Mask As String, i As Integer, j As Integer
    Dim MaskArray() As Integer
    Dim SumArray() As Integer
    Dim TestSum As Long

    NumBits = Application.WorksheetFunction.CountIf(Range("D:D"), ID)
    NumSums = 2 ^ NumBits - 1
    RngStart = Application.WorksheetFunction.Match(ID, Range("D:D"), 0)

    ReDim MaskArray(NumSums - 1)
    ReDim SumArray(NumSums - 1)

    For i = 1 To NumSums
        Mask = Application.WorksheetFunction.Dec2Bin(i, NumBits)
        For j = 0 To NumBits - 1
            MaskArray(j) = Mid(Mask, j + 1, 1)
            If MaskArray(j) = 0 Then
                SumArray(j) = 0
            Else
                SumArray(j) = Range("E" & RngStart + j)
            End If
        Next j
        TestSum = Application.WorksheetFunction.Sum(SumArray())
        If TestSum = TargetSum Then
            CheckSums = True
            Exit Function
        End If
     Next i

    CheckSums = False
End Function

Para usar essa função, cole-a em um novo módulo VBA como descrito aqui .

Então esta fórmula, preenchida a partir de C2:

=IF(B2<>"",IF(CheckSums(A2,B2),"Yes",""),"")

apresenta os resultados mostrados na captura de tela abaixo.

    
por 25.03.2018 / 00:23
-1

EDITADO:

Pode ser possível resolver esse problema com uma Soma Cumulativa. Então eu tentei SUMIF() como mostrado abaixo. Além disso, observe que usei dados diferentes da pergunta do OP.

EstafórmulaemC2forneceosresultadosmostrados.

=IF(B2<>"",IF(SUMIF($E$2:E2,E2,$B$2:B2)=B2,"Yes",""),"")

Mas observe que os parâmetros para SUMIF() estão especificados como SUMIF(range,criteria,sum_range) .

Como você pode ver, a fórmula acima soma os valores da Coluna B, não os da Coluna E, conforme especificado na pergunta. Esta fórmula encontra e "soma" o valor alvo na Coluna B e apresenta-o como se tivesse calculado uma resposta legítima.

É claro que, se você quiser uma resposta inteligente e válida para sua pergunta, precisará procurar em outro lugar.

    
por 22.03.2018 / 10:42