반응형

안녕하세요 :)

 

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 기초 세번째 글이네요 😊

 

아래 글에서 이어지는 내용이니 참고해주세요 :D

 

https://kim0404.tistory.com/34

 

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

안녕하세요 :) 이전 글 엑셀 사용법 : VBA-기초(1) 바코드 등록하는 엑셀 만들기-1에서 이어지는 글입니다 :D 아래는 제가 작성한 코드입니다 ㅎㅎ.. 이글을 보는 코딩 고수님들은 뒤로가기를 눌러

kim0404.tistory.com

 

 

 

이번 글에서 분석해 볼 코드는

bacoHisNum = setBacodeNum() '바코드 이력 순번
                
Call setShData("매크로", 3, 1, bacoHisNum)      
Call setShBacoHis(bacoHisNum, bacode) '바코드 히스토리 입력    
Call setDropDownHis(bacode) '하단 바코드 이력    

Call setShData("매크로", 3, 3, "") '오류 초기화

 

입니다. 

 

위에서부터 

    1. 바코드 이력 순번 + 1

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

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

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

    5. 오류 Message 셀 초기화.

 

순으로 코딩해봤습니다.

 

 

■  1. 바코드 이력 순번 + 1

'바코드 시트에 순번 입력 및 가져오기
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

바코드 이력 순번셀을 만든 이유는 바코드 이력 시트에 행을 추가할때 행의 번호를 쉽게 파악할 수 있도록 하기 위함입니다.

 

뭐 마지막 행을 찾아 그 다음 행에 데이터가 입력되도록 코드를 짜도 되는데 찾기 귀찮아서 이렇게 만들었어요 ㅎㅎ

 

`로 표시된건 주석이니 신경쓰지 않아도 됩니다 ㅎㅎ

 

Num 이라는 변수를 하나 만들어서

getShData("매크로", 3, 1) 아래 그림에 A3에 해당하는 값을 불러와 1 증가 후 증가된 값을 반환하는 함수입니다 :)

위 그림처럼 되어있으면 A3셀에 해당하는 3값을 불러와 +1 된값인 4를 반환하게 되는거죠 ㅎㅎ

 

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

Call setShData("매크로", 3, 1, bacoHisNum)

반환된 값을 bacoHisNum 변수에 넣어놓고 위 그림 A3셀에 증가된 숫자를 입력해줍니다.

이전글에서 설명했던 setShData() 함수를 사용해서 간단하게 셀값을 입력할 수 있죠 ㅎㅎ

 

 

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

'바코드 이력 남기기
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

 

이제 이력일 쌓는 함수를 보겠습니다.

setShBacoHis( shNum(바코드 순번), bacode(바코드 )  )를 매개변수로 받고있습니다 :)

바코드 순번에 해당하는 행에 바코드값을 넣어주는 함수입니다

 

코드를 보면 shNm 변수에 이력을 쌓을 "바코드 이력" 시트를 변수에 담았습니다. 

 

그 밑에는 Call setShData 로 "바코드 이력" 시트에 shNum에 해당하는 행의 B,C,D,F 열에 각각 데이터값을 입력하게끔 되어있습니다 :)

 

상품명은 나중에 VLOOKUP 함수로 처리하려고 비워두었습니다 ㅎㅎ

더 필요한 정보가 있다면 setShData 를 이용하여 추가로 코딩하면 될것같네요

저는 이 외 필요한 데이터가 없어 간단하게 작성했습니다 :)

 

마지막행은 Form을 추가하면서 추가된 코드입니다.

나중에 설명드릴께요 ^^

 

 

 

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

' 하단 바코드 이력 쌓기
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

 

바코드 최근 이력 데이터를 입력하는 함수입니다.

바코드를 최근에 무얼 찍었는지 직관적으로 알 수 있수 있을것 같아 만들어 보았습니다 ㅎㅎ

반복문(for문)을 사용하면 더 깔끔한 코드가 되겠지만 귀찮고 5행밖에 되지않아 그냥 하드코딩했습니다 :)

C열의 8, 9, 10, 11 행을 변수에 담고 입력한 바코드도 1번 변수에 담습니다.

그리고 차례대로 한칸씩 내려오도록 구성되어있습니다 :)

 

마지막엔 입력한 바코드는 클리어 시켜주면서 입력한 바코드를 직접 삭제하지 않고 편하게 다시 입력할 수 있도록 했습니다 :)

 

5. 오류 Message 셀 초기화.

 

Call setShData("매크로", 3, 3, "") '오류 초기화

 

오류 메세지를 공백으로 초기화 하는 코드입니다.

 

Run_Event 함수에서 IF 문을 실행하는데 바코드셀에 값이 없으면 "바코드란 값 없음"을 오류 Message 셀 밑에 입력되는데 이를 공백으로 만들어 주는 함수입니다 :)

 

아래는 Run_Event 에서 바코드값이 없을때 else로 빠지는 구문입니다.


    If bacode <> "" Then
    
    	...
    
    Else
        
        '이벤트 중지 코드
        Application.ScreenUpdating = False
        Application.EnableEvents = False
    
        Call setShData("매크로", 3, 3, "바코드란 값 없음") '오류
    
        '이벤트 실행 코드
        Application.ScreenUpdating = True
        Application.EnableEvents = True
        
    
    End If

 

이벤트 중지 코드는 Form을 추가하면서 추가된 코드라 다음글에서 설명드릴수 있을것 같네요 :)

 

이 글을 여기까지이며 중구난방으로 작성해서 이해가 될지 모르겠네요 ㅎㅎ

 

다음 글이 바코드 엑셀 마지막 글이 될것 같습니다 :)

 

여기까지 읽어주셔서 감사합니다.

 

다음글에서 뵙겠습니다 

 

 

반응형
반응형
반응형

안녕하세요 :)

이전 글 엑셀 사용법 : 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까지의 함수를 분석해보도록 할께요 :)

 

감사합니다.

반응형
반응형

안녕하세요 :)

오랜만에 글을 올리는것 같습니다.

오늘 설명드릴 엑셀파일은 바코드 등록하는 엑셀파일입니다 :)

아는 지인분께서 바코드를 사용하여 재고조사를 하고 싶은데 엑셀을 다룰지 몰라서 저에게 부탁하셨습니다.

저역시 많이 아는것은 없지만 최대한 도움이 되고자 엑셀을 짜봤는데요.

하지만 결국에는 해당 브랜드에서 제공하는 재고조사 툴을 사용하여 제가 만든 엑셀파일은 켜보지도 못하였네요..

 

기초적인 VBA이가 작성되어 있어 교육적인 문서로 충분하다고 생각하여 공유합니다 :)

 

총 3개의 페이지로 구성되어 있습니다.

1. 매크로 시트

2. 바코드 이력 시트

3. 통계시트

 

1. 매크로시트 부터 확인해보겠습니다 :)

매크로 시트에는 다양한 작업준비코드가 존재합니다.

현순번 : 바코드이력의 행 순번

오류 Message : 오류메세지 출력 셀

자동확인 : 바코드길이에따라 자동으로 확인하는 플래그

바코드길이(1이상) : 입력된 바코드길이 도달시 자동으로 확인기능수행 (자동확인 Y 일경우)

바코드길이(0) : 바코드길이에 상관없이 무조건 확인기능수행

확인버튼 : 바코드셀에 입력된 값을 바코드 이력시트 및 하단 이력에 바코드 입력

입력폼 : 바코드 입력폼창 호출

 

화면에 있는 각각의 기능들을 설명드렸습니다 :)

 

바코드에 숫자입력 후 확인버튼을 누르게 되면 아래에 1~5번까지 이력을 볼 수 있도록 만들었습니다 .

 

 

입력해던 바코드 12345가 아래에 표시된것을 알 수 있습니다.

하지만 아래 5줄은 최신 이력들을 나타낸 것들이고 더 많은 이력들은 바코드 이력 시트에 쌓이게 됩니다.

 

 

 

 

 

바코드 이력 시트에 보면 매크로시트에서 입력한 12345가 입력딘 것을 알 수 있습니다.

 

이런식으로 바코드를 입력하면 바코드 이력시트에 데이터가 쌓여서 쌓인 데이터로 SUMIF, COUNTIF, VLOOKUP 등을 이용해 통계시트에서 활용하려고 했었습니다 :)

 

하지만 셀 입력하는게 제가 생각한 바코드입력기랑 너무 달라서 바로바로 할 수 있는 기능을 추가했습니다.

 

 

 

폼을 이용하여 확인버튼을 누르지 않아도 바로바로 바코드 이력에 데이터가 쌓일 수 있도록 하였습니다 :)

 

첫번째 글에서는 제가 만들었던 엑셀의 구성에 대해 알아보았고

 

다음글에서는 소스를 하나하나 뜯어보는 글로 다시 찾아뵙겠습니다.

 

긴글 읽어주셔서 감사드립니다.

 

 

 

반응형

+ Recent posts