|
|
|
|
|
|
|
| | |
| | |
| | |
| | |
| | |
|
|
Dan Ö |
Medlem sedan: 2009-05-29
11 inlägg
|
|
|
Har ett antal belopp varav några stycken av dessa bildar en känd summa. Finns det något sätta att få programmet att visa vilka?
Exempel: 10+14+33+8+50 = 68
Det var i ovanstående 10, 8 och 50 som tillsammans blev 68.
Jag vet alltså summan men inte vilka belopp som ingår.
Någon som vet ifall det finns någon kod som kan lösa detta?
|
|
|
|
| |
|
Henrik Milefors |
Medlem sedan: 2009-01-14
177 inlägg
|
|
|
Vill du veta celladresser eller tal som bygger upp en formel som summerar tal? Kan du klargöra lite?
|
|
|
|
| |
|
|
|
lägg varje värde i A1 till E1 och summan du vill hitta i F1
öppna VBA editorn och klistra in följande
kör diSum så står delarna i var sin rad i direktfönstret
(koden är inte så snygg men den funkar.
Public Sub diSum()
Dim vnt
vnt = Range("A1:E1")
Call nemSum(vnt, 1, 0, Range("F1"), "")
End Sub
Public Sub nemSum(vvnt, i, iSum, Blisum, str)
If UBound(vvnt, 2) = i Then Exit Sub
Dim this
this = vvnt(1, i)
If iSum + this = Blisum Then
Debug.Print str & "," & this
Else
If iSum + this < Blisum Then
Call nemSum(vvnt, i + 1, iSum + this, Blisum, str & "," & this)
End If
If iSum < Blisum Then
Call nemSum(vvnt, i + 1, iSum, Blisum, str)
End If
End If
End Sub
Excelspecialisten
Excelforum drivs av Excelspecialisten som bedriver utveckling av program, utbildning samt support och hjälp i Excel och VBA.
www.excelspecialisten.se
|
|
|
|
| |
|
Dan Ö |
Medlem sedan: 2009-05-29
11 inlägg
|
|
|
Jag vill alltså veta vilka vilka belopp som bildar summan. Om programmet säger vilka celler det är eller belopp spelar ingen roll.
Tror inte jag kan förklara bättre än så om jag förstår din fråga rätt.
|
|
|
|
| |
|
Dan Ö |
Medlem sedan: 2009-05-29
11 inlägg
|
|
|
Excelspecialisten skrev
lägg varje värde i A1 till E1 och summan du vill hitta i F1
öppna VBA editorn och klistra in följande
kör diSum så står delarna i var sin rad i direktfönstret
(koden är inte så snygg men den funkar.
Public Sub diSum()
Dim vnt
vnt = Range("A1:E1")
Call nemSum(vnt, 1, 0, Range("F1"), "")
End Sub
Public Sub nemSum(vvnt, i, iSum, Blisum, str)
If UBound(vvnt, 2) = i Then Exit Sub
Dim this
this = vvnt(1, i)
If iSum + this = Blisum Then
Debug.Print str & "," & this
Else
If iSum + this < Blisum Then
Call nemSum(vvnt, i + 1, iSum + this, Blisum, str & "," & this)
End If
If iSum < Blisum Then
Call nemSum(vvnt, i + 1, iSum, Blisum, str)
End If
End If
End Sub
Tack för svar!
Har tyvärr inte riktigt fått det att funka ännu. Är lite osäker på vad jag gör för fel. Följde dina instruktioner men jag får inte upp något i direktfönstret
|
|
|
|
| |
|
Dan Ö |
Medlem sedan: 2009-05-29
11 inlägg
|
|
|
Hej igen!
Har fått lite hjälp även från en kollega som är lite kunnigare än jag men tyvärr så lyckades inte han heller att få det till att funka. Visas tyvärr inget i direktfönstret.
Något tips till vad vi ev. kan ha missat?
|
|
|
|
| |
|
Niklas Jansson |
Medlem sedan: 2009-01-13
73 inlägg
|
|
|
Jag fick det att fungera, men det verkar som att det var en bugg i den.
skriv till exempel 1,2,3,4,5 i a1-e1 och sen 6 i f1. Kör nu med:
Public Sub diSum()
Dim vnt
vnt = Range("A1:E1")
Call nemSum(vnt, 1, 0, Range("F1"), "")
End Sub
Public Sub nemSum(vvnt, i, iSum, Blisum, str)
If UBound(vvnt, 2) + 1 = i Then Exit Sub 'Här har jag ändrat till +1
Dim this
this = vvnt(1, i)
If iSum + this = Blisum Then
Debug.Print str & "," & this
Else
If iSum + this < Blisum Then
Call nemSum(vvnt, i + 1, iSum + this, Blisum, str & "," & this)
End If
If iSum < Blisum Then
Call nemSum(vvnt, i + 1, iSum, Blisum, str)
End If
End If
End Sub
Då får jag ut 1,2,3 - 1,5 - 2,4 i direktfönstret (CTRL +G) i VBA-editorn. Jag hittar inga andra kombinationer
|
|
|
|
| |
|
Dan Ö |
Medlem sedan: 2009-05-29
11 inlägg
|
|
|
Grymt!
Nu fick jag det till att funka, även med minustal.
Försökte dock att ändra till "fallande led" på talen men då vill det inte funka.
Jag ändrade "A1:E1" till "A1:A5" och "F1" till "A6", men det ville inte.
Är det något annat man ska ändra på?
|
|
|
|
| |
|
Dan Ö |
Medlem sedan: 2009-05-29
11 inlägg
|
|
|
Provade idag att konvertera en kolumn till en rad och använde ovanstående formel, denna gången med mycket fler och större tal. Då hängde sig excel/VBA.
Kan det vara så att den inte orkar med uträkningen? (Det funkade ju tidigare när jag körde med exempeltalen)
|
|
|
|
| |
|
Niklas Jansson |
Medlem sedan: 2009-01-13
73 inlägg
|
|
|
Vad gäller första frågan handlar det ju bara om UBound(vvnt, 2) till UBound(vvnt, 1) och vvnt(1, i) till vvnt(i, 1).
För andra frågan: Detta kallas för en "uttömmande sökning", närmare bestämt en "djupet först"-sökning. Det är det enklaste sättet att lösa problemet. En "Bredden först"-sökning hade förmodligen gett svar tidigare (men fått köra lika länge).
Jag tror att detta är vad som kallas ett NP-komplett problem (om det får finnas med negativa tal är det definitivt det), och att du därför inte kan hoppas på så mycket annat. Du kan förmodligen få lite bättre prestanda genom att sortera listan från störst till minst.
Vågar man fråga vad du ska ha det till?
|
|
|
|
| |
| | |
| | |
| | |
|
|
|
|
|
|
|
|
|
|