Skills/Excel VBA

합산 조합 구하기

섬그늘 2008. 11. 13. 14:31

먼저 만든 조합(combination)을 원용하여 합산 조합을 구하는 프로그램임. 더 효율적으로 작성할 날이 언젠간 오겠거니...(2008.09.04)

 

CTRL+Break (Pause)로 중단됩니다.
진행
상품 금액 데이터 개수 15 5
0 MBS 312,000 허용 오차 0 3
1 ABS 107,000 조합 합계    682,821 4
2 가스공사채권 249,000 6
3 도로공사 124,500 10
4 고속철도공단채 242,500 11
5 공항채 25,421 14
6 국고채권 101,450
7 미국채 101,440
8 유로채 201,880
9 사랑채 100,950
10 나라채 403,800
11 국가채 253,575
12 우리채 253,600
13 한빛채 100,950
14 고로채 12,144
이렇게 되어 있을때 682,821(25,421+403,800+253,600)이라는 숫자를 구할수 있는 조합은
공항채     25,421
우리채    253,600
나라채    403,800
소계    682,821

 

Sub 합산조합()
Dim stemp, N(14) As String
Dim tsum, terr, Ltemp, L(14, 14) As Long
Dim rw As Integer
Dim i, j, k, sol, T, tunit, A(14), C(14) As Byte

 

'시트데이타를 배열에 입력
tunit = Cells(3, 6) - 1: terr = Cells(4, 6): tsum = Cells(5, 6)
For i = 0 To tunit
L(i, 0) = Cells(i + 4, 3): N(i) = Cells(i + 4, 2): A(i) = i
Next i

'데이타 출력 연습
'Cells(8, 5) = N(6)
'Cells(9, 5) = L(6, 0)

 

'데이타 오름차순 정렬
For i = 0 To tunit
For j = i + 1 To tunit
If L(i, 0) > L(j, 0) Then
Ltemp = L(i, 0)
L(i, 0) = L(j, 0)
L(j, 0) = Ltemp
T = A(i)
A(i) = A(j)
A(j) = T
End If
Next j
Next i

 

'정렬된 데이타 출력
'For i = 0 To tunit
'Cells(i + 22, 2) = N(A(i))
'Cells(i + 22, 3) = L(i, 0)
'Next i

 

'조합 탐색
Range("b22:c40").ClearContents: Range("h4:h18").ClearContents
For k = 0 To tunit
Cells(3, 7) = k
For i = 0 To k: C(i) = i: Next i

 

Comparer:
Ltemp = 0
For i = 0 To k: Ltemp = Ltemp + L(C(i), 0): Next i
If Ltemp < tsum - terr Or Ltemp > tsum + terr Then GoTo tprint
sol = sol + 1
For i = 0 To k
Cells(22 + i, sol * 2) = N(A(C(i))): Cells(22 + i, sol * 2 + 1) = L(C(i), 0)
Next i
Cells(22 + i, sol * 2) = "소계": Cells(22 + i, sol * 2 + 1) = Ltemp

 

tprint:
For i = 0 To k: Cells(4 + i, 8) = C(i): Next i

 

texam:
For i = 0 To k
If C(i) <> tunit - k + i Then GoTo tup1
Next i: GoTo tnext

 

tup1:
For i = k To 0 Step -1
If C(i) < tunit - k + i Then j = i: i = 0
Next i
T = C(j) + 1
If j = 0 Then GoTo jump

 

tup2:
For i = 0 To j - 1
If T <= C(i) Then T = C(i) + 1
Next i

 

jump:
'Cells(2, 10) = j: Cells(2, 11) = T
C(j) = T
If j = k Then GoTo Comparer
j = j + 1: T = 1: GoTo tup2

 

tnext:
'MsgBox k.Value
Next k

 

tend:
MsgBox "정상적으로 종료되었습니다!"
End Sub