Selection.Find(What:="aa", After:=ActiveCell, LookIn:=xlFormulas, LookAt _ :=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase _ :=False, MatchByte:=False, SearchFormat:=False).Activate 만약 선택 품목의 오른쪽 2번째 셀인 입고수량이 20개보다 크다면, 예를 들면 30개면 재고수량에 20을 넣고 프로그램 종료시킵니다. 선입선출이라고 하셨으니까.. 가장 최근에 입고되니 수량이 기말 재고 보다 작으면 가장 최근에 입고된것 중 일부가 남은거라고 볼 수 있겠죠..
그리고 만약.. 20개보다 작다면 예를 들면 15개면 오른쪽 3번째 셀의 재고 수량에는 15을 넣은 다음, 기준 정보인 20은 20-15인 5로 변경하고.. 다시 aa품목을 거슬러 올라가면서 찾습니다. 그 라인의 입고 수량이 새로운 기준인 5보다 작은지 큰지 보고.. 작으면 해당 입고분만큼 재고수량에 넣고 다시 위로.. 처음으로 갈때까지!
Sub checkProduct() Dim cntClosing As Integer Dim endPosition As Range cntClosing = Application.InputBox("aa 품목의 기말 재고 수량을 입력하세요", Title:="기말재고 수량 입력창", Type:=2)
Do If ActiveCell.Offset(0, 2).Value >= cntClosing Then ActiveCell.Offset(0, 3).Value = cntClosing End ElseIf ActiveCell.Offset(0, 2).Value < cntClosing Then ActiveCell.Offset(0, 3).Value = ActiveCell.Offset(0, 2).Value cntClosing = cntClosing - ActiveCell.Offset(0, 2).Value End If Selection.FindPrevious(After:=ActiveCell).Activate If ActiveCell.Address = endPosition.Address Then End End If Loop End Sub
기본 컨셉은 이렇습니다.
▲기본전제..
데이터는 입고 날짜 순으로 정렬되어 있다. 선입선출이다.
▲해결 방법..
입고현황 시트의 A열(품목)을 선택하고, 맨 아래쪽 레코드를 activate하지요..
Columns("A:A").Select
Range("A65536").Activate
선택영역에서 aa품목을 거꾸로 거슬로 올라가면서 찾습니다.
Selection.Find(What:="aa", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase _
:=False, MatchByte:=False, SearchFormat:=False).Activate
만약 선택 품목의 오른쪽 2번째 셀인 입고수량이 20개보다 크다면, 예를 들면 30개면 재고수량에 20을 넣고 프로그램 종료시킵니다. 선입선출이라고 하셨으니까.. 가장 최근에 입고되니 수량이 기말 재고 보다 작으면 가장 최근에 입고된것 중 일부가 남은거라고 볼 수 있겠죠..
그리고 만약.. 20개보다 작다면 예를 들면 15개면 오른쪽 3번째 셀의 재고 수량에는 15을 넣은 다음, 기준 정보인 20은 20-15인 5로 변경하고.. 다시 aa품목을 거슬러 올라가면서 찾습니다. 그 라인의 입고 수량이 새로운 기준인 5보다 작은지 큰지 보고.. 작으면 해당 입고분만큼 재고수량에 넣고 다시 위로.. 처음으로 갈때까지!
Selection.FindPrevious(After:=ActiveCell).Activate
머.. 기본 컨셉이 그렇습니다. 잡다한 에러처리도 필요하겠지요..
이정도로 만족하실지 모르겠네요.. 제가 주말에 어딜 가봐야해서.. 일단 이정도로 팁을 드립니다.
현재까지 만든 파일을 참조하세요.. abyul_20090725_vba.xls
Option Explicit
Sub checkProduct()
Dim cntClosing As Integer
Dim endPosition As Range
cntClosing = Application.InputBox("aa 품목의 기말 재고 수량을 입력하세요", Title:="기말재고 수량 입력창", Type:=2)
Columns("A:A").Select
Range("A65536").Activate
Selection.Find(What:="aa", After:=ActiveCell, LookIn:=xlFormulas, LookAt _
:=xlPart, SearchOrder:=xlByRows, SearchDirection:=xlPrevious, MatchCase _
:=False, MatchByte:=False, SearchFormat:=False).Activate
Set endPosition = ActiveCell
Do
If ActiveCell.Offset(0, 2).Value >= cntClosing Then
ActiveCell.Offset(0, 3).Value = cntClosing
End
ElseIf ActiveCell.Offset(0, 2).Value < cntClosing Then
ActiveCell.Offset(0, 3).Value = ActiveCell.Offset(0, 2).Value
cntClosing = cntClosing - ActiveCell.Offset(0, 2).Value
End If
Selection.FindPrevious(After:=ActiveCell).Activate
If ActiveCell.Address = endPosition.Address Then
End
End If
Loop
End Sub
좋은 결과 있으시길 바래요.. ^^)/