반응형

안녕하세요 :)

 

https://kim0404.tistory.com/35

 

엑셀 사용법 : VBA-기초(3) 바코드 등록하는 엑셀 만들기-3

안녕하세요 :) VBA 기초 세번째 글이네요 😊 아래 글에서 이어지는 내용이니 참고해주세요 :D https://kim0404.tistory.com/34 엑셀 사용법 : VBA-기초(2) 바코드 등록하는 엑셀 만들기-2 안녕하세요 :) 이전

kim0404.tistory.com

 

VBA-기초(3)에서 이어지는 글입니다 :)

 

 

저 엑셀을 만들다가 생각이 난게 지금껏 만들었던 엑셀은 바코드를 찍고-확인-찍고-확인-찍고-확인...

을 해야한다는 아주 큰 불편함이 생길것 같더라구요 :)

 

그래서 어떻게 할까 생각하다가 Form을 이용해서 찍으면 바로바로 이력에 쌓일 수 있도록 수정했습니다 :)

 

 

위와 같이 간단하게 TextBox의 Change 이벤트를 이용해서 찍자마자 바로 이력 시트에 입력될 수 있도록 만들었어요 :)

 

 

■ TextBox Change 이벤트 코드

Private Sub TextBox1_Change()

    '입력폼 텍스트
    Dim TarTxt
    TarTxt = TextBox1.Value
    
    '바코드길이(F3)
    Dim TarTxtLen
    TarTxtLen = Len(TarTxt)    
    
    '오토체크YN
    Dim AutoChkYn As String
    AutoChkYn = getShData("매크로", 3, "E")
    
    '바코드길이(공통)
    Dim BarCodeLen As Integer
    BarCodeLen = getShData("매크로", 3, "F")
    
    
    '오토체크 Y AND (입력값 = 바코드 길이 or 바코드 길이 0 일때)
    If AutoChkYn = "Y" And (TarTxtLen = BarCodeLen Or BarCodeLen = 0) Then
    
        
        '바코드셀에 입력하고 Run 이벤트
        Call setShData("매크로", 7, "C", TarTxt)
        Call Run_Event
        
        TextBox1.Value = ""    
    
    End If    

End Sub




Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    'MsgBox KeyCode    
    
    'KeyCode 13 = "엔터"
    '엔터 누를때 Run 이벤트 실행
    If KeyCode = 13 Then    
    
        '입력폼 텍스트
        Dim TarTxt
        TarTxt = TextBox1.Value        
    
        '바코드셀에 입력하고 Run 이벤트
        Call setShData("매크로", 7, "C", TarTxt)
        Call Run_Event
        
        TextBox1.Value = ""
    
    End If
End Sub

 

코드를 보게되면 change 이벤트와 keyUp 이벤트가 있는걸 볼수 있습니다 :)

주석을 달아놔서 쉽게 보실 수 있으실꺼에요 :)

 

change 이벤트는 TextBox에 타이핑할때마다 change 이벤트를 타게됩니다.

그래서 오토체크와 바코드 길이가 있는데 

 

오토체크 Y일때 바코드 길이셀과 입력한 바코드의 길이가 같다면 자동으로 확인되어 이력에 쌓일 수 있도록 했습니다.

 

* 오토체크 = Y        바코드길이셀  = 6

12345 <<< 까지 TextBox에 입력되다가 123456 << 6을 입력하게 되면 이력에 쌓이는거죠 ㅎㅎ

 

이건 수기로 입력할때 사용하는 거고 바코드를 찍게되면 길이를 모르니까

바코드 길이를 0으로 놓으면 어떤 값이든 길이에 상관없이 이력에 기록되도록 설정했습니다 :)

 

 If AutoChkYn = "Y" And (TarTxtLen = BarCodeLen Or BarCodeLen = 0) Then ....  

 

그리고 이 조건에 만족한다면

바코드 셀에 TextBox 값을 입력하고

Call Run_Event를 하게 되는거죠 ㅎㅎ

 

KeyUp 이벤트의 경우 혹여나 수기로 입력할 때, 바코드 길이가 다를때 엔터버튼으로 기록할 수 있도록 했습니다 :)

 

Private Sub TextBox1_KeyUp(ByVal KeyCode As MSForms.ReturnInteger, ByVal Shift As Integer)

    'MsgBox KeyCode    
    
    'KeyCode 13 = "엔터"
    '엔터 누를때 Run 이벤트 실행
    If KeyCode = 13 Then

 

MsgBox를 통해 KeyCode를 찍어보게 되면 키보드를 입력할 때마다 숫자가 바뀌는것을 알 수 있는데요.

그 숫자가 키보드와 매핑되어있는 숫자입니다 :)

 

엔터를 눌러보게 되면 13의 숫자가 나오는데, 엔터를 누를때 Run_Event를 실행 시키는 코드입니다 :)

 

아래 제가 만들었던 엑셀파일을 첨부해 놓을테니 뜯어보세요 ㅎㅎ

 

이상 VBA 기초 바코드 등록하는 엑셀만들기 였습니다 :)

 

다음에는 다른 작업물로 돌아올께요 

 

 

 

 

매크로_사용문서_v2.xlsm
0.06MB

 

 

 

 

 

 

 

 

 

 

 

 

 

반응형
반응형
반응형

안녕하세요 :)

이전 글 엑셀 사용법 : VBA-기초(1) 바코드 등록하는 엑셀 만들기-1에서 이어지는 글입니다 :D

 

 

아래는 제가 작성한 코드입니다 ㅎㅎ..

이글을 보는 코딩 고수님들은 뒤로가기를 눌러주세요 ㅜㅜ..

허접하지만 설명하겠습니다 ...

 


■ 코드

Sub 단추1_Click()

    '셀 클릭 잠시 막아 놓음.
    Call Run_Event

End Sub



' 실행 함수
Sub Run_Event()

    Dim dumy

    Dim bacode As String '바코드 변수
    Dim bacoHisNum As Integer '바코드 순번 변수

    
    bacode = getShData("매크로", 7, "C")
    
    
    If bacode <> "" Then
    
        
        bacoHisNum = setBacodeNum() '바코드 이력 순번
        
        
        Call setShData("매크로", 3, 1, bacoHisNum) '삭제
        
        Call setShBacoHis(bacoHisNum, bacode) '바코드 히스토리 입력
    
        Call setDropDownHis(bacode) '하단 바코드 이력
    
    
        Call setShData("매크로", 3, 3, "") '오류 초기화
    
    Else
        
        '이벤트 중지 코드
        Application.ScreenUpdating = False
        Application.EnableEvents = False
    
        Call setShData("매크로", 3, 3, "바코드란 값 없음") '오류
    
    
        '이벤트 실행 코드
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        
    
    End If


End Sub


'******************************사용자 정의함수 Start *******************************

'바코드 시트에 순번 입력 및 가져오기
Function setBacodeNum()
    Dim Num
    
    'Num = getShData("바코드 이력", 1, 1)
    'Num = Num + 1
    
    'Worksheets("바코드 이력").Cells(1, 1) = Num
    
    
    
    Num = getShData("매크로", 3, 1)
    Num = Num + 1
    
    Worksheets("매크로").Cells(3, 1) = Num
    
    setBacodeNum = Num
End Function


'바코드 이력 남기기
Function setShBacoHis(shNum, bacode)

    Dim shNm
    
    shNm = "바코드 이력"


    Call setShData(shNm, shNum, "B", "N") '삭제여부
    Call setShData(shNm, shNum, "C", shNum - 2) '순번
    Call setShData(shNm, shNum, "D", bacode) '바코드
    'Call setShData(shNm, shNum, "E", bacode) '상품명은 vloopup으로 처리
    Call setShData(shNm, shNum, "F", Now) '바코드
    
    'Application.Goto reference:=[A&shNum], Scroll:=True
    
    'Application.Goto reference:=Worksheets("바코드 이력).Range("G10"), Scroll:=True
    
    
        Application.Goto Reference:=Worksheets(shNm).Range("A" & shNum), Scroll:=False
    
End Function


' 하단 바코드 이력 쌓기
Function setDropDownHis(bacode)

    Dim shNm, bcData1, bcData2, bcData3, bcData4, bcData5
    shNm = "매크로"

    bcData1 = bacode
    bcData2 = getShData(shNm, 8, "C")
    bcData3 = getShData(shNm, 9, "C")
    bcData4 = getShData(shNm, 10, "C")
    bcData5 = getShData(shNm, 11, "C")

    Call setShData(shNm, 8, "C", bcData1) '1행
    Call setShData(shNm, 9, "C", bcData2) '2행
    Call setShData(shNm, 10, "C", bcData3) '3행
    Call setShData(shNm, 11, "C", bcData4) '4행
    Call setShData(shNm, 12, "C", bcData5) '5행
    
    
    Call setShData(shNm, 7, "C", "") '바코드 값 초기화

End Function


'******************************사용자 정의함수 End *******************************

'-------------------------공통 함수 Start ---------------------------------------

'시트명, 행, 열 값 가져오기
Function getShData(sheetName, Row, Col)

    Dim shData

    shData = Worksheets(sheetName).Cells(Row, Col).Value
    
    getShData = shData
End Function


'시트명, 행, 열 입력값
Sub setShData(bacoShNm, Row, Col, shData)

    Worksheets(bacoShNm).Cells(Row, Col) = shData

End Sub

 

 

 

 

하나하나 뜯어볼께요 :)

먼저 공통함수 부터 보겠습니다.

 

 

■ 공통함수

'-------------------------공통 함수 Start ---------------------------------------

'시트명, 행, 열 값 가져오기
Function getShData(sheetName, Row, Col)

    Dim shData

    shData = Worksheets(sheetName).Cells(Row, Col).Value
    
    getShData = shData
End Function


'시트명, 행, 열 입력값
Sub setShData(bacoShNm, Row, Col, shData)

    Worksheets(bacoShNm).Cells(Row, Col) = shData

End Sub

 

공통함수를 왜 만드는 이유는 그냥 제가 편하게 사용하기 위해서 만들었습니다 ㅎㅎ

setShData() 함수는 한줄로 구성되어 있지만

getShData() 함수는 세줄로 되어있어서 간단하게 사용하려고 만들었습니다.

그리고 매번 길다란 문구를 입력할 필요도 없어서 이런식으로 만들면 좋아요

 

대강 코드에 대해 설명하면

setShData()는 매개변수 bacdShNm, Row, Col, shData를 받는다고 나와있습니다.

setShData("매크로", 1, 1, "A1 데이터 입력")로 간단하게 매크로시트 1행, 1열에 "A1 데이터 입력" 이라는 값을 넣을 수 있습니다.

 

getShData()는 매개변수 bacdShNm, Row, Col를 받는데요

이는 getShData("매크로", 1, 1)로 간단하게 위에서 set 했던 "A1 데이터 입력" 값을 가져올 수 있습니다.

 

 

■ 단추1_Click()

Sub 단추1_Click()

    '셀 클릭 잠시 막아 놓음.
    Call Run_Event

End Sub

 

단추1_Click() 함수는 확인 버튼을 누를때 실행됩니다.

아래 Call Run_Event 를 호출하는걸 볼 수 있습니다.

함수를 찢어놓는건 재활용하기 좋기 때문입니다. ㅎㅎ

 

 

 

■ Run_Event()

' 실행 함수
Sub Run_Event()

    Dim dumy

    Dim bacode As String '바코드 변수
    Dim bacoHisNum As Integer '바코드 순번 변수

    
    bacode = getShData("매크로", 7, "C")
    
    
    If bacode <> "" Then
    
        
        bacoHisNum = setBacodeNum() '바코드 이력 순번
        
        
        Call setShData("매크로", 3, 1, bacoHisNum) '삭제
        
        Call setShBacoHis(bacoHisNum, bacode) '바코드 히스토리 입력
    
        Call setDropDownHis(bacode) '하단 바코드 이력
    
    
        Call setShData("매크로", 3, 3, "") '오류 초기화
    
    Else
        
        '이벤트 중지 코드
        Application.ScreenUpdating = False
        Application.EnableEvents = False
    
        Call setShData("매크로", 3, 3, "바코드란 값 없음") '오류
    
    
        '이벤트 실행 코드
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        
    
    End If


End Sub

 

 

핵심이 되는 함수죠.

 

매크로 시트의 C7 데이터를 읽어와 바코드 이력 시트에 입력하는 코드입니다.

 

C7의 값이 존재할때 ( 바코드값 <> "")

 

    1. 바코드 이력 순번 + 1

    2. 바코드 이력 순번 A3셀에 입력.

    3. 바코드 이력 시트에 데이터 입력.

    4. 매크로 시트 최근이력 데이터 입력.

    5. 오류 Message 셀 초기화.

 

순으로 되어있습니다.

메인이 되는 함수는 간결하게 작성하는게 유지보수에 좋은것 같아요ㅎㅎ

흐름을 먼저 파악해야 어디서 부터 어떻게 무엇이 잘못되었거나 내가 수정하고 싶은 기능이 어디에 있는지 빠르게  파악하기 쉬운것 같습니다.

 

오늘은 여기까지 하고 다음글에 1~5까지의 함수를 분석해보도록 할께요 :)

 

감사합니다.

반응형

+ Recent posts