EXCEL jak wybrać z zakresu wartości, te których suma równa się określoną wartość

Witam Wszystkich,

 Szukam funkcji lub makra które znajdą w zakresie liczb te których suma będzie równa lub najbardziej zbliżona do zdefiniowanej wartości 

Przykład

zakres wartości 1, 5, 3, 8, 11, 12, 10, 15

wymagana suma np 8  rozwiązania 8, 5 i 3, 1 i 5 i 3, itp

funkcja musi sprawdzić wszystkie konfiguracje liczb w celu znalezienia optymalnego rozwiązania  

zakres wartości nie powinien przekroczyć 50 liczb

do pełni szczęscia brakuje jeszcze warunku który mogłby określić liczbę składników sumy

Przykład

wymagana suma np 8 dodatkowy warunek 3 składniki sumy - zakres wartości 1,5,2,8,11,12,10,15 rozwiązania 1 i 5 i 2, 8 i 2 i 1 itp

Z góry dziękuję za pomoc

Greg

Odpowiedzi: 1

Witam.
Swojego czasu napisałem podobną funkcję na własne potrzeby (inspiracją było jakieś forum :) ).

Funkcja zwraca tablicę wyników, więc należy ją wprowadzić do arkusza jako tablicową.

Przykład:
Wybierane liczby do sumy są w zakresie A1:A30
W B2 wpisujemy liczbę - porzebną sumę.
Zaznaczmy zakres C2:E2 i wprowadzamy formułę:
=LiczbyDoSumy(A1:A30;B2;1)
którą zatwierdzamy klawiszem Enter poczas trzymania wciśniętych klawiszy Ctrl i Shift.
Otrzymamy 3 liczby wybrane do sumy.
Jeśli wynik składa się tylko z jednej liczby, to dwie pozostałe będą równe zero. Dla wyniku w postaci pary liczb, trzecia liczba =0.

lub/oraz
zaznaczmy zakres C6:C8 i wprowadzamy formułę
=LiczbyDoSumy(A1:A50;B2;2)
otrzymamy 3 elementową listę 'pozycji' w przeszukiwanym zakresie liczb wziętych do sumy.
Może to być przydatne w celu np. wybrania numeru faktury gdy przeszukujemy kolumnę wartości faktur.

Nie jest problemem rozszerzenie wyników do czterech czy więcej liczb, lecz VBA jest jezykiem interpretowanym, przez co wolnym i obliczenia trwają potwornie długo zwlaszcza, gdy zakres przeszukiwany jest duży.

Function LiczbyDoSumy(zakres As Range, _
                      suma As Range, _
                      Optional rodzaj_wyniku = 2) As Variant

' (c)14.04.2006 Ryszard Gardziejewski
'
' Parametry:
'    zakres - zakres liczb wybieranych do sumy
'    suma   - oczekiwana (wymagana) suma liczb
'    rodzaj_wyniku (opcjonalnie)
'         =1 dla wyniku w postaci wyszukanych liczb
'         =2 dla wyniku w postaci położenia (indeksu) w zakresie (domyślnie)
'
' Z wskazanego zakresu, funkcja zwraca maksymalnie 3 liczby (lub ich położenie
' w zakresie), których suma jest najbardziej zbliżona do sumy wymaganej.
'
' Jeżeli jest kilka rozwiązań dokładnych, funkcja zwaca pierwszy ten, który wymaga
' najmniej liczb.
'
' Funkcja zawsze zwraca tablicę 3 wyników; należy ją stosować wyłącznie jako tablicową.
'
'
  Dim Z, L As Double
  Dim il As Integer, i As Integer, j As Integer, k As Integer
  Dim min As Double, a As Double
  Dim Tw(1 To 3) As Double
 
  Z = zakres.Value
  L = suma.Value
  min = 1E+308
 
  'sprawdzenie dla jednej liczby wyniku
  For i = 1 To UBound(Z)
      a = Abs(L - Z(i, 1))
      If a < min Then
        min = a
        Tw(1) = i
      End If
  Next i
 
  'dla 2 liczb wyniku
  For i = 1 To UBound(Z) - 1
    For j = i + 1 To UBound(Z)
      a = Abs(L - Z(i, 1) - Z(j, 1))
      If a < min Then
        min = a
        Tw(1) = i
        Tw(2) = j
      End If
    Next j
  Next i
 
  'dla 3 liczb wyniku
  For i = 1 To UBound(Z) - 2
    For j = i + 1 To UBound(Z) - 1
      For k = j + 1 To UBound(Z)
        a = Abs(L - Z(i, 1) - Z(j, 1) - Z(k, 1))
        If a < min Then
          min = a
          Tw(1) = i
          Tw(2) = j
          Tw(3) = k
        End If
      Next k
    Next j
  Next i
 
  If rodzaj_wyniku = 1 Then
    Tw(1) = Z(Tw(1), 1)
    If Tw(2) > 0 Then Tw(2) = Z(Tw(2), 1)
    If Tw(3) > 0 Then Tw(3) = Z(Tw(3), 1)
  End If
 
  'czy funkcja jest wprowadzona do pionowego zakresu
  If Application.Caller.Columns.Count = 1 Then
    LiczbyDoSumy = WorksheetFunction.Transpose(Tw)
  Else
    LiczbyDoSumy = Tw
  End If

End Function

ohcyR
Dodano
17.09.2006 03:23:17
  • gza 18.09.2006 00:11:33

    <p>Super Super</p><p>Funkcja działa</p><p>Serdeczne dzięki</p><p>Greg</p><p>&nbsp;</p><p>&nbsp;</p>

gza
Dodano:
16.09.2006 14:27:38
Komentarzy:
1
Strona 1 / 1