Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- VBA Undo
- 엑셀
- VBA 사무자동화
- 엑셀 재고데이터 입력
- 견적서 자동 입력
- 재고 자동 갱신
- 사무자동화
- 엑셀 데이터 자동
- 엑셀 매크로 뒤로가기
- 엑셀 데이터관리
- Excel
- 엑셀 사무자동화
- 엑셀 함수 정리
- 재고관리 자동화
- 재고 자동화
- 재고관리프로그램
- 재고관리 프로그램
- 엑셀 데이터 삭제
- redo
- 고시원개발자
- 입출고 데이터 관리
- 엑셀 매크로
- 데이터 중복확인
- 엑셀 재고관리
- 매크로
- VBA Redo
- VBA
- VBA 데이터삭제
- 엑셀 VBA 뒤로가기
- 엑셀자동화
Archives
- Today
- Total
내일도 화이팅
입출고관리 데이터 코드 단순화 + 코드 캡슐화 - 코드제공, 파일제공 본문
※ 제 코드와 파일은 상업적 이용, 개인적 이용이 모두 가능합니다. 다만, 게시판이나 블로그에 업로드할 목적이라면 꼭 출처를 남겨주시기바랍니다.
안녕하세요.
오늘은 코드를 유지보수하는데 있어 더 수월하도록 캡슐화하고 단순화시킨 코드를 공개하겠습니다.
1. 견적서 추가 & 재고 갱신
Sub add_inventory(kind As String)
Dim count_inven As Integer '재고 품목 개수
Dim count_estimate As Integer '견적서의 품목 개수
Dim data As Integer
Dim cal As Integer
Dim overlap As Boolean
overlap = reduplication_check(kind)
If (Not overlap) Then
Call save_past(kind, "input", Worksheets(kind & "견적서").Cells(3, "G").Value)
Worksheets("Redo " & kind & "데이터").Range("A:Y").delete xlToLeft
cal = calculation(kind)
count_inven = 3 '재고는 3행부터 존재
Do While (Not IsEmpty(Worksheets("재고관리").Cells(count_inven, 2).Value)) '재고 품목 개수를 카운트하는 반복문
count_inven = count_inven + 1
Loop
count_estimate = 3 '견적서는 3행부터 존재
Do While (Not IsEmpty(Worksheets(kind & "견적서").Cells(count_estimate, 3).Value)) '견적서 품목 개수를 카운트하는 반복문
count_estimate = count_estimate + 1
Loop
data = 3 '데이터는 3행부터 존재
Do While (Not IsEmpty(Worksheets(kind).Cells(data, "B").Value)) '데이터의 개수를 카운트하는 반복문
data = data + 1
Loop
For i = 3 To count_estimate - 1 '재고의 품목과 견적서의 품목이 일치하면 재고 갱신
For j = 3 To count_inven - 1
If (Worksheets("재고관리").Cells(j, 2).Value Like Worksheets(kind & "견적서").Cells(i, 3).Value) Then
Worksheets("재고관리").Cells(j, 3).Value = Worksheets("재고관리").Cells(j, 3).Value + (Worksheets(kind & "견적서").Cells(i, 5).Value * cal)
Exit For
End If
Next j
Next i
'데이터 갱신
Range("C" & Trim(Str(data) & ":F" & Trim(Str(data + count_estimate - 4)))).Value = Worksheets(kind & "견적서").Range("B3:E" & Trim(Str(count_estimate - 1))).Value
Range("B" & Trim(Str(data) & ":B" & Trim(Str(data + count_estimate - 4)))).Value = Worksheets(kind & "견적서").Cells(3, 7).Value
End If
End Sub
2. 삭제 & 재고갱신
Sub delete(kind As String)
Dim i As Integer
Dim j As Integer
Dim delete_number As String
Dim success_delete As Boolean
cal = -calculation(kind)
success_delete = False
delete_number = Application.InputBox("삭제하실 거래번호를 입력하세요", "거래삭제", , , , , , 2)
i = 3
Do While (Not IsEmpty(Cells(i, 2).Value))
If (Cells(i, 2).Value Like delete_number) Then
If (Not success_delete) Then
Call save_past(kind, "delete", delete_number)
Worksheets("Redo " & kind & "데이터").Range("A:Y").delete xlToLeft
End If
success_delete = True
j = 3
Do While (Not IsEmpty(Worksheets("재고관리").Cells(j, 2)))
If (Cells(i, 4).Value Like Worksheets("재고관리").Cells(j, 2).Value) Then
Worksheets("재고관리").Cells(j, 3).Value = Worksheets("재고관리").Cells(j, 3).Value + (Worksheets(kind).Cells(i, 6).Value * cal)
Exit Do
End If
j = j + 1
Loop
Range("B" & Trim(Str(i)) & ":F" & Trim(Str(i))).Select
Selection.delete Shift:=xlUp
i = 3
Else
i = i + 1
End If
Loop
If (Not success_delete) Then
msg = MsgBox("이미 삭제되었거나 존재하지않는 번호입니다.", vbYesOnly, "삭제실패")
Else
Range("B3:F500").Select
Selection.Borders(xlDiagonalDown).LineStyle = xlNone
Selection.Borders(xlDiagonalUp).LineStyle = xlNone
With Selection.Borders(xlEdgeLeft)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeTop)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeBottom)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlEdgeRight)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideVertical)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
With Selection.Borders(xlInsideHorizontal)
.LineStyle = xlContinuous
.ColorIndex = xlAutomatic
.TintAndShade = 0
.Weight = xlThin
End With
Range("G2").Select
End If
End Sub
3. 중복확인
Function reduplication_check(kind As String)
Dim overlap As Boolean
Dim i As Integer
Dim msg As Integer
i = 3
overlap = False
Do While (Not IsEmpty(Worksheets(kind).Cells(i, 2).Value))
If (Worksheets(ttype).Cells(i, 2).Value Like Worksheets(kind & "견적서").Cells(3, 7).Value) Then
overlap = True
msg = MsgBox("이미 등록된 견적서입니다", vbYesOnly, "중복경고")
Exit Do
End If
i = i + 1
Loop
reduplication_check = overlap
End Function
4. 유형확인
Function calculation(kind As String)
Dim plus As Boolean
Dim minus As Boolean
Dim i As Integer
plus = False
minus = False
i = 3
Do While (Not Worksheets("재고관리").Cells(i, "I").Value Like "")
If (kind Like Worksheets("재고관리").Cells(i, "I").Value) Then
calculation = 1
plus = True
Exit Do
End If
i = i + 1
Loop
If (Not plus) Then
i = 3
Do While (Not Worksheets("재고관리").Cells(i, "J").Value Like "")
If (kind Like Worksheets("재고관리").Cells(i, "J").Value) Then
calculation = -1
minus = True
Exit Do
End If
i = i + 1
Loop
If (Not minus) Then
msg = MsgBox("입력되지 않은 유형입니다.", vbYesOnly, "실행실패")
calculation = 0
End If
End If
End Function
5. Undo
Sub undo(kind As String)
Dim cal As Integer
cal = calculation(kind)
If (IsEmpty(Worksheets("Undo " & kind & "데이터").Cells(2, "U").Value)) Then
msg = MsgBox("Undo하실 데이터가 없습니다.", vbYesOnly, "Undo 실패")
Else
Call save_future(kind)
'재고 갱신
If (Worksheets("Undo " & kind & "데이터").Cells(1, "V") Like "input") Then
Dim i As Integer
Dim j As Integer
cal = cal * -1
i = 3
Do While (Not IsEmpty(Cells(i, 2).Value))
If (Cells(i, 2).Value Like Worksheets("Undo " & kind & "데이터").Cells(1, "U").Value) Then
j = 3
Do While (Not IsEmpty(Worksheets("재고관리").Cells(j, 2)))
If (Cells(i, 4).Value Like Worksheets("재고관리").Cells(j, 2).Value) Then
Worksheets("재고관리").Cells(j, 3).Value = Worksheets("재고관리").Cells(j, 3).Value + (Worksheets(kind).Cells(i, 6).Value * cal)
Exit Do
End If
j = j + 1
Loop
End If
i = i + 1
Loop
Else
Dim count_inven As Integer
count_inven = 3
Do While (Not IsEmpty(Worksheets("재고관리").Cells(count_inven, 2).Value))
count_inven = count_inven + 1
Loop
For i = 3 To 100
For j = 3 To count_inven - 1
If (Worksheets("Undo " & kind & "데이터").Cells(1, "U").Value Like Worksheets("Undo " & kind & "데이터").Cells(i, "U").Value _
And Worksheets("재고관리").Cells(j, 2).Value Like Worksheets("Undo " & kind & "데이터").Cells(i, "W").Value) Then
Worksheets("재고관리").Cells(j, 3).Value = Worksheets("재고관리").Cells(j, 3).Value + (Worksheets("Undo " & kind & "데이터").Cells(i, "Y").Value * cal)
Exit For
End If
Next j
Next i
End If
'데이터 갱신
Worksheets("Undo " & kind & "데이터").Range("U:Y").Cut Worksheets(kind).Range("B:F")
Range("B1:C1").Value = ""
Cells(1, "D").Value = kind
Worksheets("Undo " & kind & "데이터").Range("A:E").Insert
End If
End Sub
6. Redo
Sub Redo(kind As String)
Dim cal As Integer
cal = calculation(kind)
If (IsEmpty(Worksheets("Redo " & kind & "데이터").Cells(2, "U").Value)) Then
msg = MsgBox("Redo하실 데이터가 없습니다.", vbYesOnly, "Redo 실패")
Else
Call save_past(kind, Worksheets("Redo " & kind & "데이터").Cells(1, "V"), Worksheets("Redo " & kind & "데이터").Cells(1, "U"))
'재고 갱신
If (Worksheets("Redo " & kind & "데이터").Cells(1, "V") Like "delete") Then
Dim i As Integer
Dim j As Integer
cal = cal * -1
i = 3
Do While (Not IsEmpty(Cells(i, 2).Value))
If (Cells(i, 2).Value Like Worksheets("Redo " & kind & "데이터").Cells(1, "U").Value) Then
j = 3
Do While (Not IsEmpty(Worksheets("재고관리").Cells(j, 2)))
If (Cells(i, 4).Value Like Worksheets("재고관리").Cells(j, 2).Value) Then
Worksheets("재고관리").Cells(j, 3).Value = Worksheets("재고관리").Cells(j, 3).Value + (Worksheets(kind).Cells(i, 6).Value * cal)
Exit Do
End If
j = j + 1
Loop
End If
i = i + 1
Loop
Else
Dim count_inven As Integer
count_inven = 3
Do While (Not IsEmpty(Worksheets("재고관리").Cells(count_inven, 2).Value))
count_inven = count_inven + 1
Loop
For i = 3 To 100
For j = 3 To count_inven - 1
If (Worksheets("Redo " & kind & "데이터").Cells(1, "U").Value Like Worksheets("Redo " & kind & "데이터").Cells(i, "U").Value _
And Worksheets("재고관리").Cells(j, 2).Value Like Worksheets("Redo " & kind & "데이터").Cells(i, "W").Value) Then
Worksheets("재고관리").Cells(j, 3).Value = Worksheets("재고관리").Cells(j, 3).Value + (Worksheets("Redo " & kind & "데이터").Cells(i, "Y").Value * cal)
Exit For
End If
Next j
Next i
End If
'데이터 갱신
Worksheets("Redo " & kind & "데이터").Range("U:Y").Cut Worksheets(kind).Range("B:F")
Range("B1:C1").Value = ""
Cells(1, "D").Value = kind
Worksheets("Redo " & kind & "데이터").Range("A:E").Insert
End If
End Sub
7. 과거저장(Undo)
Sub save_past(kind As String, reverse_order As String, number As String)
Worksheets("Undo " & kind & "데이터").Range("A:E").delete xlToLeft
Worksheets(kind).Range("B:F").Copy Worksheets("Undo " & kind & "데이터").Range("U:Y")
Worksheets("Undo " & kind & "데이터").Cells(1, "U").Value = number
Worksheets("Undo " & kind & "데이터").Cells(1, "V").Value = reverse_order
End Sub
8. 미래저장(Redo)
Sub save_future(kind As String)
Worksheets("Redo " & kind & "데이터").Range("A:E").delete xlToLeft
Worksheets(kind).Range("B:F").Copy Worksheets("Redo " & kind & "데이터").Range("U:Y")
Worksheets("Redo " & kind & "데이터").Range("U1:V1").Value = Worksheets("Undo " & kind & "데이터").Range("U1:V1").Value
End Sub
9. 통합실행(실제 매크로 지정 프로시저)
Dim row As Integer
Dim column As String
Sub point()
row = 1
column = "D"
End Sub
Sub add_data()
Call point
If (Not calculation(Cells(row, column)) Like 0) Then
add_inventory (Cells(row, column))
End If
End Sub
Sub delete_data()
Call point
If (Not calculation(Cells(row, column)) Like 0) Then
delete (Cells(row, column))
End If
End Sub
Sub undo_data()
Call point
If (Not calculation(Cells(row, column)) Like 0) Then
undo (Cells(row, column))
End If
End Sub
Sub redo_data()
Call point
If (Not calculation(Cells(row, column)) Like 0) Then
Redo (Cells(row, column))
End If
End Sub
+ 새로운 기능을 추가했습니다.
입고와 출고만 있었던 기존과 다르게 불량이라는 시트가 만들어졌죠?
사실 불량이 만들어진게 다가아닙니다.
영사을 보시면 "재고관리"시트에서 감소에 불량을 넣으니 마치 출고처럼 추가시 -, 삭제시 +, Undo시 반대연산, Redo시 정연산을 합니다.
마치 새로 만든 것처럼 작동합니다.
그러면 반품, 이벤트, 증정 등 많은 유형의 견적서를 만들 수 있겠죠?
하지만, 시트 복붙하고 이름 바꾸는게 귀찮을 겁니다.
걱정하지마세요.
6월 7일 일요일 00시전까지 복사와 이름변경 자동화, 폼을 통한 증가와 감소 입력, 실제 견적서 도입 예시 등을 공개하겠습니다. 즉, 이번 입출고 프로젝트는 6월 6일 토요일 업로드를 통해 마무리하고 더 좋은 프로그램으로 찾아뵙겠습니다.
- 입출고관리 데이터 코드 단순화 + 코드 캡슐화 - 코드제공, 파일제공
6월 6일 자정전 공개
'엑셀 > 엑셀 매크로 사무자동화 코드' 카테고리의 다른 글
입출고 재고관리 프로그램-무료 프로그램 배포 (0) | 2023.08.25 |
---|---|
견적서 종류 추가 - 코드제공, 파일제공 (0) | 2023.08.06 |
입출고 삭제 - 코드제공, 파일제공 (0) | 2023.08.01 |
입출고 Undo, Redo 구현 - 코드제공, 파일제공(복붙용) (0) | 2023.07.30 |
입출고 시 중복 업로드 방지-코드제공, 파일제공(복붙용) (0) | 2023.07.22 |