найдите, какие элементы массива ana составляют сумму [vba]

#arrays #excel #vba

#массивы #excel #vba

Вопрос:

что я хочу сделать: у меня есть список данных, и я хочу знать, какие из значений складываются в определенную сумму [т. е. 1.61], я хотел бы знать все комбинации [т.Е. мне неважно, сколько чисел я должен сложить], ответчики должны быть каким-то образом указаны

что я сделал: я умножил данные, поместил их в три массива и прошелся по каждому элементу; затем проверил, появилось ли значение раньше, если комбинация не указана в ячейке

 Sub po_mojemu()
Dim macierz1(1 To 30)
Dim macierz2(1 To 30)
Dim macierz3(1 To 30)
Dim ostatnia_dane As Long
Dim ostatnia As Long

ostatnia_dane = Range("b" amp; Rows.Count).End(xlUp).Row

For i = 1 To ostatnia_dane
        macierz1(i) = Cells(i, 2).Value
        macierz2(i) = Cells(i, 2).Value
        macierz3(i) = Cells(i, 2).Value
Next i

For Each element1 In macierz1
  For Each element2 In macierz2
    For Each element3 In macierz3
        If element1   element2   element3 = 1.61 Then
            Set c = Range("f:f").Find(What:=element1 amp; " : " amp; element2 amp; " : " amp; element3)
                If c Is Nothing Then
                    ostatnia = Range("f" amp; Rows.Count).End(xlUp).Row   1
                    Cells(ostatnia, 6) = element1 amp; " : " amp; element2 amp; " : " amp; element3
                End If
        End If
    Next element3
Next element2
Next element1

End Sub
  

в чем проблема: это неэффективно и рассматривает только определенный случай [т.е.. я знаю, что будет 30 строк данных, и мне нужно 3 числа, которые составляют сумму]

я был бы признателен за любую помощь, которая сделала бы этот код более гибким

Комментарии:

1. и еще одна проблема: он не должен видеть разницу между elemen1amp; element2amp; element3 и elemen3 amp; element2 amp; element1 [и так далее], но это так

Ответ №1:

итак, я отвечу на свой собственный вопрос, ну, не полностью, но все же это лучше, чем ничего [может быть, кто-то найдет это полезным]

 Sub ostateczna(suma As Double)
Dim macierz()
Dim ostatnia_dane As Double
Dim ostatnia As Double

ostatnia_dane = Range("b" amp; Rows.Count).End(xlUp).Row

ReDim macierz(1 To ostatnia_dane)

For i = 1 To ostatnia_dane
    macierz(i) = Cells(i, 2).Value
Next i

i = 0

For i = 1 To ostatnia_dane
For j = 1 To ostatnia_dane
    For k = 1 To ostatnia_dane
        If (i   j   k) <= ostatnia_dane Then
            If macierz(i)   macierz(i   k)   macierz(i   k   j) = suma Then
                ostatnia = Range("f" amp; Rows.Count).End(xlUp).Row   1
                Cells(ostatnia, 6) = macierz(i) amp; " : " amp; macierz(i   k) amp; " : " amp;  macierz(i   k   j)
            End If
        End If
    Next k
Next j
Next i
  

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