카테고리 없음

입출고 삭제 - 코드분석

내일도화이팅 2023. 8. 2. 00:42

안녕하세요 반갑습니다.

 

오늘은 입출고 삭제하는 프로그램 코드 분석을 해보도록 하겠습니다.

 

Sub 출고제거()
    Dim i As Integer
    Dim j As Integer

    Dim delete_number As String
    Dim success_delete As Boolean
    
    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
            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("출고").Cells(i, 6).Value
                    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

 

1, input 박스 생성

delete_number = Application.InputBox("삭제하실 거래번호를 입력하세요", "거래삭제", , , , , , 2)

   

[그림 1] Application.InputBox

Application.InputBox는 사용자가 값을 입력할 수 있도록 하는 대화상자를 제공하는 함수입니다.

인수로는 InputBox ( 프롬프트, 제목, 기본값, x축 위치, y축 위치 , HelpFile, HelpContextID, 유형 )

1) 프롬프트는 내용으로 어떤 문구를 사용자에게 보여줄지 입력하는 인수로 다른 인수들과 다르게 필수 인수입니다. 

2) 두 번째 인수는 대화상자에 띄울 제목을 받는 인수입니다.

3) 세 번째 인수는 사용자가 값을 입력하지 않을 시 대체될 기본값입니다.

4) 네 번째 인수는 창을 띄울 x축 위치입니다.(사실 잘 사용하지않습니다.)

5) 다섯 번째 인수는 창을 띄울 y축 위치입니다.(마찬가지로 잘 사용하지않습니다.)

6) 여섯 번째 인수는 도움말 파일 이름입니다. 해당 인수와 일곱 번째 인수인 HelpContextID가 공란이 아닐 시 도움말 선택지가 생깁니다.

7) 마지막 인수는 사용자에게 받는 값의 자료형입니다.

0 공식
1 숫자
2 문자열
8 Range(범위)
16 오류 값
64

0번 공식은 =2+3 같은 공식을 리턴합니다.

입출고 번호는 문자열로된 번호 ex) U4885, T4026 등도 있기 때문에 문자열을 리턴하는 2번을 선택했습니다.

그리고 프롬프트, 제목, 유형을 제외한 나머지 인수들은 필요하지않으므로 공란으로 비웠습니다.


   2. 삭제 & 재고 갱신

i = 3
    Do While (Not IsEmpty(Cells(i, 2).Value))
        If (Cells(i, 2).Value Like delete_number) Then
            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("출고").Cells(i, 6).Value
                    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

해당 코드는 두 부분으로 끊어서 볼 필요가 이습니다.

 

1) 삭제할 넘버가 있는지 확인, 없을 경우

   Do While (Not IsEmpty(Cells(i, 2).Value))
        If (Cells(i, 2).Value Like delete_number) Then
            success_delete = True

해당 코드는 삭제할 넘버가 출고 시트에 있는지 하나하나 확인해보는 코드입니다.

만약 없다면 success_delete는 초기값 그대로 False일 것이고 success_delete가 False 즉, 성공적 삭제에 실패했다면, while문이 종료된 후

If (Not success_delete) Then
     msg = MsgBox("이미 삭제되었거나 존재하지않는 번호입니다.", vbYesOnly, "삭제실패")

 

 해당 코드의 조건에 걸리게 됩니다.

Not은 True를 False로 False를 True로 바꾸는 연산자이므로 success_delete가 False라면 "이미 삭제되었거나 존재하지않는 번호입니다." 라는 메세지 박스를 띄우고 아무것도 하지않습니다.(사실상 아무것도 하지 못하다는 말이 더 맞습니다.)

[그림 2] 삭제할게 없을 때 메세지 박스

참고로 MsgBox의 인수로 vbYesOnly 즉, 확인만 뜨는 인수를 넣었기에 확인만 나옵니다.(return한 값을 사용하지않으면 오류가 생기므로 msg에 담았지만, 별 의미는 없습니다.)

2) 삭제할 넘버가 있을 경우(재고 복구)

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("출고").Cells(i, 6).Value
          Exit Do
     End If

 

삭제할 넘버가 있을 경우 중 해야될 행동이 두가지가 있는데, 하나는 삭제를 하는 것이고 하나는 재고를 복구하는 것입니다.

 

삭제를 먼저하면 안되기때문에 재고를 복구하는 것이 선행시 되어야 합니다.

재고를 복구하는 법은 쉽습니다. 출고가 재고를 감소시켰다면, 이번엔 재고를 증가시키면 됩니다.

 

증가시킬 재고를 찾는 방법은 재고를 뺏을 때와 동일하며, 입고와 다른 점이 출고는 다시 복구시킬 때 +를 해야한다면 입고는 -를 해야합니다. 이는, 출고가 일어날 때 -연산이 있었고 입고가 일어날 때 +연산이 있었기 때문입니다.

 

3) 삭제할 넘버가 있을 경우(삭제)

            Range("B" & Trim(Str(i)) & ":F" & Trim(Str(i))).Select
            Selection.Delete Shift:=xlUp
            i = 3

 

해당 코드는 삭제하는 코드입니다. i는 재고의 열위치를 의미합니다. 저번에도 언급했지만 숫자형을 문자열로 바꾸면 공백이 하나 생기기 때문에 Trim으로 공백을 지운 후 범위를 지정했습니다.

Range는 범위를 지정하는 함수지만, 범위를 문자열로 받기때문에 위 코드처럼 응용이 가능합니다.

그리고 해당 데이터를 select 후 삭제하고 아래셀들을 위로 올립니다.

 

i를 3으로 초기화한 이유는, 해당 셀이 삭제될 경우 밑에 셀들이 위로 올라오기 때문입니다.

(그런데 생각을 해보니 굳이 3으로 하지않고 찾은 그 위치에서 다시 찾아도 될꺼같습니다. 해당 사항은 다음 클린코드 만들기와 캡슐화하기 게시글에서 수정하겠습니다.)

 

4) 삭제할 넘버를 찾지 못한 경우

        Else
            i = i + 1

i의 값을 하나 올려서 다음 열을 탐색합니다.

 

3. 삭제 완료 후처리(success_delete가 True)
    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
    
해당 코드는 길지만, 사실 그냥 선을 그리기 위함입니다.

위, 아래, 왼쪽, 오른쪽 내부, 외부 모두 실선으로 채우는 코드입니다.

 

해당 코드는 분석할 수 는 있으나 굳이 분석하지않고 매크로 기록을 한뒤 복붙한 코드입니다.

 

매크로 기록은 매우 제한적인 경우에서만 사용할 수 있지만, 저런 단순한 계산정도는 매크로 기록으로 할 수 있습니다.

(실제로 회사에서 도형삭제도 매크로 기록으로 한 뒤 그 코드를 복붙했습니다.)

 

이상 입출고 데이터 삭제 코드 설명을 마치겠습니다.

 

봐주셔서 감사합니다.

 

● 입출고 삭제 - 코드제공, 파일제공

https://ksm30546.tistory.com/21

 

입출고 삭제 - 코드제공, 파일제공

※ 제 코드와 파일은 상업적 이용, 개인적 이용이 모두 가능합니다. 다만, 게시판이나 블로그에 업로드할 목적이라면 꼭 출처를 남겨주시기바랍니다. 안녕하세요 오늘은 입고 시트와 출고 시트

ksm30546.tistory.com

 

도움이 되셨다면 좋아요, 댓글 부탁드립니다.

 

모든 피드백과 질문도 환영입니다.