먼저 만든 조합(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
'Skills > Excel VBA' 카테고리의 다른 글
VBA 문자열 변동 또는 합계에 따라 행 삽입/일련 번호 (0) | 2008.11.13 |
---|---|
다른 값이 나올때마다 행과 일련번호를 삽입 (0) | 2008.11.13 |
화일명 자동 참조하여 데이터 가져오기 (0) | 2008.11.13 |
카운터 로직 (0) | 2008.11.13 |
조합(combination) 출력 (0) | 2008.11.13 |