자료실

부자는 돈을 써서 시간을 아끼지만 가난한 사람은 시간을 써서 돈을 아낀다

vb6.0/vba

IT HUB를 찾아주셔서 감사합니다.

vb6.0/vba [vb6.0/vba] 생 년, 월, 일, 입력하고 주민번호 뒷 자리 입력받아 검증까지...

페이지 정보

profile_image
작성자 하나를하더라도최선을
댓글 0건 조회 6,726회 작성일 20-01-30 00:23

본문

주민번호 관련 해서 만들어 보았습니다.
지식인 http://kin.naver.com/qna/detail.nhn?d1id=1&dirId=102020101&docId=147839337 답변을 하고 나니 심심도 하고...
좀더 수정해서 올려 봅니다.


Sub 주민번호입력받아검증까지()
'// 아래는 배열형 변수
Dim lenH As Variant     '// 년, 월, 일 의 최고 글자수
Dim dateH As Variant    '// 년, 월, 일 의 Max
Dim lenL As Variant     '// 년, 월, 일 의 최소 글자수
Dim dateL As Variant    '// 년, 월, 일 의 Min
Dim codeCK As Variant   '// 주민번호 체크용
Dim dateVal As Variant  '// 입력받을 날자를 넣을 변수

'// 아래는 문자형 변수
Dim myDate  As String   '// 입력받을 날자
Dim myCode As String    '// 입력받을 주민번호 뒷자리
Dim msg As String       '// 메세지 출력에 사용

'// 아래는 숫자형 변수
Dim n As Long   '// 순환문에 사용
Dim i As Long   '// 주번 계산에 사용

'// 아래는 각 배열에 값을 넣어 줌
lenH = Split("4,2,2", ",")   '// 날자의 최고 글자수
lenL = Split("4,1,1", ",")   '// 날자의 최소 글자수
dateH = Split("2012,12,31", ",")  '// 날자가 이보다 클수는 없다
dateL = Split("1900,1,1", ",")    '// 날자가 이보다 작을 순 없다
codeCK = Split("2,3,4,5,6,7,8,9,2,3,4,5", ",") '// 주민번호 검증용 ....

'On Error Resume Next

reDate: '// 날자 입력 오류시 이곳으로 분기 함
'// 아래는 날자를 입력 받습니다. 날자 입력 형태는
'// 2012/1/1 또는 2012/01/01 이런 식으로 입력 받음
myDate = Application.InputBox("생년월일을 입력해 수세요...", "주번앞자리", Format(Date, "yyyy") & "/" & Format(Date, "mm") & "/" & Format(Date, "dd"), , , , , 2)
If myDate = "False" Then Exit Sub '// 취소를 누를경우 프로시져 종료
dateVal = Split(myDate, "/")  '// 입력 받은 날자를 / 기준으로 잘라서 배열에 넣음
For n = 0 To 2  '// 날자는 년, 월, 일 이므로 배열이 0부터 시작하므로 0~2 즉 3번 순환
    '// 아래는 각 배열(년, 월, 일)의 글자 수, 날자 값을 검증 하여 아닐경우 다시 입력 받음
    If (Len(dateVal(n)) <> lenH(n) Or Len(dateVal(n)) <> lenL(n)) And (Val(dateVal(n)) > Val(dateH(n)) Or Val(dateVal(n)) < Val(dateL(n))) Then
        msg = "날자 형태가 잘못 되었습니다."    '// 출력할 메세지를 넣음
        msg = msg & vbCr & " 다시 입력 하시겠습니까?"   '// 출력할 메세지를 추가함
        If MsgBox(msg, 64 + vbYesNo, "날자 오류!") = vbYes Then GoTo reDate '// 메세지를 출력하고 확인을 누르면 reDate로 분기
        Exit Sub    '// 취소를 누를 경우 프로시져 종료
    Else
        dateVal(n) = Format(Val(dateVal(n)), "00")  '// 각 배열(년, 월, 일)이 정상이면 숫자를 2자리로 만들어 넣음
    End If
Next    '// 3회 순환 할때까지 배열 순환

    myDate = Right(Join(dateVal, ""), 6) '// 입력받은 배열을 다시 합치고 오른쪽 6글자를 넣음
    msg = "주민등록번호 앞자리는 " & myDate & " 입니다."    '// 출력할 메세지 넣음
    MsgBox msg  '// 메세지 출력
   
reCode: '// 주민번호 뒷자리 7자리가 안될경우 분기할 곳
    i = 0
    myCode = Application.InputBox("주민번호를 입력해 수세요...", "주번뒷자리", "")  '// 주민번호 입력 받음
    If myCode = "False" Then Exit Sub '// 취소를 누를경우 프로시져 종료
    If Len(myCode) <> 7 Then    '// 7자가 아니면
        MsgBox "다시 입력해 주세요" & vbCr & vbCr & "주민번호는 7자리 입니다."  '// 메세지 출력
        GoTo reCode '// 다시 입력 받음
    End If
    '// 7자 일경우
    myCode = myDate & myCode    '// 날자와 주민번호 합침
    '// 아래는 입력받은 숫자 갯수보다 1개 작게 순환 즉 주민번호 12자 까지 순환
    '// Len(myCode) - 1를 12로 바꾸어 주어도 됨
    For n = 1 To Len(myCode) - 1
        i = i + Mid(myCode, n, 1) * codeCK(n - 1)   '// i에 각 숫자와 체크용 각 배열의 숫자를 곱해서 기존값에 추가함
    Next
If Right(myCode, 1) = 11 - (i Mod 11) Then  '// 주민번호 마지막 번호 검증하여 정상이면
    MsgBox "정상적인 주민 번호로..." & vbCr & vbCr & Left(myCode, 6) & "-" & Right(myCode, 7) & "입니다."   '// 완성된 주민번호 메세지 출력
Else    '// 주민번호 검증에 실패 하면
    msg = "주민번호 검증에 실패 하였습니다."    '// 출력할 메세지를 넣음
    msg = msg & vbCr & "주민번호 끝자리가 " & 11 - (i Mod 11) & "와 일치하지 않습니다."    '// 출력할 메세지를 추가함
    msg = msg & vbCr & "대한민국 사람이 아니거나 태어날 수 없는 사람 입니다."    '// 출력할 메세지를 추가함
    msg = msg & vbCr & vbCr & "다시 입력 하겠습니까?"    '// 출력할 메세지를 추가함
    If MsgBox(msg, 64 + vbYesNo, "검증 오류!") = vbYes Then GoTo reCode '// 메세지를 출력하고 홛인 단추를 누르면 reCode로 분기
End If
End Sub


첨부파일

댓글목록

등록된 댓글이 없습니다.