유저폼으로 표에 데이타를 입력하는 방법

VBA
작성자
saechang
작성일
2023-09-22 19:02
조회
479
엑셀버전 : 엑셀2019

운영체제 : 윈도우11

질문 요약 : 유저폼으로 표에 데이타를 입력하는 방법

Private Sub btn1_Click()
 
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("DATA")
 
    Dim tblDATA As ListObject
    Set tblDATA = sh.ListObjects("DATA")
 
 
    Dim newRow As Long
    newRow = tblDATA.ListRows.Count + 1
 
    With 입력
 
        tblDATA.ListColumns("날짜").DataBodyRange(newRow, 1).Value = .TextBox1.Value
        tblDATA.ListColumns("입출").DataBodyRange(newRow, 1).Value = .TextBox2.Value
        tblDATA.ListColumns("업무번호").DataBodyRange(newRow, 1).Value = .TextBox3.Value
        tblDATA.ListColumns("업체").DataBodyRange(newRow, 1).Value = .TextBox4.Value
        tblDATA.ListColumns("제품명").DataBodyRange(newRow, 1).Value = .TextBox5.Value
        tblDATA.ListColumns("제품번호").DataBodyRange(newRow, 1).Value = .TextBox6.Value
        tblDATA.ListColumns("제품수량").DataBodyRange(newRow, 1).Value = .TextBox7.Value
        tblDATA.ListColumns("제품단가").DataBodyRange(newRow, 1).Value = .TextBox8.Value
        tblDATA.ListColumns("모델넘버").DataBodyRange(newRow, 1).Value = .TextBox9.Value
        tblDATA.ListColumns("제조원가").DataBodyRange(newRow, 1).Value = .TextBox10.Value
        tblDATA.ListColumns("입고가격").DataBodyRange(newRow, 1).Value = .TextBox11.Value
        tblDATA.ListColumns("출고가격").DataBodyRange(newRow, 1).Value = .TextBox12.Value
        tblDATA.ListColumns("입고날짜").DataBodyRange(newRow, 1).Value = .TextBox13.Value
        tblDATA.ListColumns("보관장소").DataBodyRange(newRow, 1).Value = .TextBox14.Value
        tblDATA.ListColumns("담당부서").DataBodyRange(newRow, 1).Value = .TextBox15.Value
 
    End With
End Sub

아주 간단하게 이런 식으로 데이타를 입력하고 있습니다. (유저폼이 대충 만든 거라서 조악합니다. 죄송)

이렇게 쓰다보니 문제가 몇개 발생해서 조언을 구합니다.

1. 속도가 느립니다.

- 유저폼에는 생략했지만 원래 테이블에 있는 No. 번호 에도 다 입력을 합니다. 즉 위의 코드보다 항목이 훨씬 더 많습니다. 코드에서는 생략했지만 No.번호 항목은 for 문을 돌립니다. 번호라서 가능한 부분이죠.

문제점은 항목이 많다보니 속도가 엄청 느립니다.  항목이 모두 70개가 넘으니 버튼 한번 누르면 입력되는데 한 세월입니다.

application.screenupdate 였나... 이걸 써봐도 느립니다. 컴퓨터가 구려서 그런 건지도 모르겠지만...

 

그러다가 배열로 입력하면 빠르다는 말을 듣고 배열을 정의해서 각 항목을 배열에 담고 뿌려보았습니다. 속도가 빨라졌습니다.

배열에 대해 잘 몰라서 좀 불안하지만 괜찮은 것 같았습니다. 그런데...

 

2. 원본데이타 표의 항목이 순서가 변경될 때가 있어서 배열을 못 쓰고 있습니다.

업무가 데이타를 받아서 거기에 유저폼으로 입력하는 방식입니다. 문제는 가끔 받는 데이타가 순서가 변경되어서 오는 때가 있다는 겁니다.

제품명-제품번호-제품단가   이런 순서에서 제품번호-제품명-세부구분  이런 식으로 순서가 변경될 때가 가끔 있어서 배열로는 오입력을 내게 됩니다. 그렇다고 입력하는 분에게 순서를 다시 원래대로 변경해서 입력하라고 할 수도 없습니다.

 

그래서 각 항목 이름으로 변수를 만들고 텍스트박스 값을 그 변수에 집어넣어서 입력하도록 했습니다

Private Sub btn2_Click()
 
    Dim sh As Worksheet
    Set sh = ThisWorkbook.Sheets("DATA")
 
    Dim tblDATA As ListObject
    Set tblDATA = sh.ListObjects("DATA")
 
    Dim 날짜, 입출, 업무번호, 업체, 제품명, 제품번호, 제품단가, 세부구분, 제조원가, 입고가격, 출고가격, 입고날짜, 보관장소, 담당부서, 제품수량
 
    With 입력
        날짜 = .TextBox1.Value
        입출 = .TextBox2.Value
        업무번호 = .TextBox3.Value
        업체 = .TextBox4.Value
        제품명 = .TextBox5.Value
        제품번호 = .TextBox6.Value
        제품단가 = .TextBox7.Value
        세부구분 = .TextBox8.Value
        제조원가 = .TextBox9.Value
        입고가격 = .TextBox10.Value
        출고가격 = .TextBox11.Value
        입고날짜 = .TextBox12.Value
        보관장소 = .TextBox13.Value
        담당부서 = .TextBox14.Value
        제품수량 = .TextBox15.Value
    End With
 
 
    Dim newRow As Long
    newRow = tblDATA.ListRows.Count + 1
 
        tblDATA.ListColumns("날짜").DataBodyRange(newRow, 1).Value = 날짜
        tblDATA.ListColumns("입출").DataBodyRange(newRow, 1).Value = 입출
        tblDATA.ListColumns("업무번호").DataBodyRange(newRow, 1).Value = 업무번호
        tblDATA.ListColumns("업체").DataBodyRange(newRow, 1).Value = 업체
        tblDATA.ListColumns("제품명").DataBodyRange(newRow, 1).Value = 제품명
        tblDATA.ListColumns("제품번호").DataBodyRange(newRow, 1).Value = 제품번호
        tblDATA.ListColumns("제품단가").DataBodyRange(newRow, 1).Value = 제품단가
        tblDATA.ListColumns("세부구분").DataBodyRange(newRow, 1).Value = 세부구분
        tblDATA.ListColumns("제조원가").DataBodyRange(newRow, 1).Value = 제조원가
        tblDATA.ListColumns("입고가격").DataBodyRange(newRow, 1).Value = 입고가격
        tblDATA.ListColumns("출고가격").DataBodyRange(newRow, 1).Value = 출고가격
        tblDATA.ListColumns("입고날짜").DataBodyRange(newRow, 1).Value = 입고날짜
        tblDATA.ListColumns("보관장소").DataBodyRange(newRow, 1).Value = 보관장소
        tblDATA.ListColumns("담당부서").DataBodyRange(newRow, 1).Value = 담당부서
        tblDATA.ListColumns("제품수량").DataBodyRange(newRow, 1).Value = 제품수량
 
 
End Sub

제가 드릴 질문은 여기서부터입니다. 각 항목의 이름으로 지정된 변수를 배열에 넣으려면 column index 에 매핑을 해야하는데 도통 방법을 모르겠습니다. 조언 부탁드립니다.

 

혹시나 제 삽질보다 훨씬 좋은 방법이 있으시면 다른 방법도 알려주시면 감사하겠습니다.

 

 

신고
스크랩
공유
회원등급 : 6레벨
포인트 : 411 EP
총질문 : 12 개 (마감율 : 58%)
채택답변 : 0 개
전체 1

  • 2023-09-22 21:23

    @saechang

    오빠두 엑셀님이 공유해 주시는 사용자 정의 함수 이용해 보세요. 작성하기 편하실 겁니다.


전체 13,423
번호 카테고리 제목 작성자 작성일 추천 조회
알림
[📚10만부 출간 기념] 「진짜쓰는 실무엑셀」 한정판 리커버 + 8시간 로드맵 특별 부록
오빠두엑셀 | 07:19 | 추천 7 | 조회 322
오빠두엑셀 07:19 7 322
공지사항 문서서식
⭐ [더 나은 커뮤니티 문화를 위한 Q&A 글 작성 규칙] ⭐ (197)
오빠두엑셀 | 2021.10.28 | 추천 280 | 조회 18655
오빠두엑셀 2021.10.28 280 18655
64744 기능/도구
New 찾기/바꾸기
노베이스엑셀 | 20:56 | 추천 0 | 조회 11
노베이스엑셀 20:56 - 11
64741 VBA
New vba 사용자 입력값으로 trim 비율 설정이 불가한가요? 엑셀파일첨부파일
1y7u3n | 18:36 | 추천 0 | 조회 15
1y7u3n 18:36 - 15
64737 VBA
New 평균을 역산하여 질문당 평가점수를 배점하는 문제 엑셀파일첨부파일
2010 | 17:08 | 추천 0 | 조회 18
2010 17:08 - 18
64733 차트/그래프
New 엑셀 그래프 축 문의 첨부파일 (1)
smsy | 13:49 | 추천 0 | 조회 25
smsy 13:49 - 25
64732 함수/공식
New IF 다중조건 질문드립니다!! 첨부파일 (1)
dkssud**** | 13:49 | 추천 0 | 조회 22
dkssud**** 13:49 - 22
64723 차트/그래프
New 월별 형식에 따른 오름차순 차이 엑셀파일첨부파일 (1) 답변완료
엑셀고수왕소취 | 01:31 | 추천 0 | 조회 29
엑셀고수왕소취 01:31 - 29
64722 파워쿼리/피벗
New 피벗내 전년도대비 성장률 표기를 전체매출 내림차순으로 정렬하 엑셀파일첨부파일
엑셀고수왕소취 | 01:14 | 추천 0 | 조회 23
엑셀고수왕소취 01:14 - 23
64720 함수/공식
New 다중조건을 만족하는 값 가져오는 방법 엑셀파일첨부파일 (2)
럭키현 | 2023.12.08 | 추천 0 | 조회 36
럭키현 2023.12.08 - 36
64718 함수/공식
New 엑셀 시트명 가져오기 함수 오류 (1)
후추소녀 | 2023.12.08 | 추천 0 | 조회 28
후추소녀 2023.12.08 - 28
64714 함수/공식
New 특정 문자만 추출하는 방법 첨부파일 (2)
러블리JH | 2023.12.08 | 추천 0 | 조회 38
러블리JH 2023.12.08 - 38
64713 문서서식
New 파이썬이 기본탭에 안보입니다 추가하는 방법이 없을까요? 첨부파일 (1)
레키타임 | 2023.12.08 | 추천 0 | 조회 28
레키타임 2023.12.08 - 28
64711 함수/공식
New 엑셀 함수 내용이 길어서 설정된칸이 다 가려집니다 ㅠㅠ 첨부파일 (2)
cheri**** | 2023.12.08 | 추천 1 | 조회 29
cheri**** 2023.12.08 1 29
64701 함수/공식
New 엑셀 함수 문의_숫자 자리수(5자리로 통일) 바꾸기 (근태자료 시간 형식 변경) 엑셀파일 (2)
| 2023.12.08 | 추천 0 | 조회 32
2023.12.08 - 32
64695
New 시작 날짜시간 / 끝 날짜 시간입력 받아 그 시간대의 데이터만 남기고 나머지는 삭제하는 VBA 엑셀파일첨부파일 (2)
lee**** | 2023.12.08 | 추천 0 | 조회 31
lee**** 2023.12.08 - 31
64691 기능/도구
New 오류 표시는 설정 하는게 낫나요? (1)
노베이스엑셀 | 2023.12.08 | 추천 0 | 조회 23
노베이스엑셀 2023.12.08 - 23
64689 함수/공식
New 간단한 질문하나 드립니다ㅠㅠ (1)
똥깽쓰 | 2023.12.08 | 추천 0 | 조회 33
똥깽쓰 2023.12.08 - 33
64688 기능/도구
New 빠른실행도구 설정관련 문의 드려요!! 첨부파일 (2)
호도로로 | 2023.12.08 | 추천 0 | 조회 33
호도로로 2023.12.08 - 33
64684 파워쿼리/피벗
New 쿼리결합으로 만든 테이블에 추가한 열이 새로고침 할 때마다 계속 바뀝니다. (1)
갈귀 | 2023.12.08 | 추천 0 | 조회 28
갈귀 2023.12.08 - 28
64682 함수/공식
New 너무 어려워요 ㅠㅠ날짜와 시각(콜론, 기호 구분 없이 숫자 4자리만 적혀있는,,,)으로 총 소요된 시간(분)을 구하고 싶습니다. 첨부파일 (2) 답변완료
up**** | 2023.12.08 | 추천 0 | 조회 33
up**** 2023.12.08 - 33
64678 문서서식
New 특수문자(기호)입력 후 띄어쓰기 시 기호 바로 뒤에 생기는 동그라미를 없앨 수는 없을까요??? 첨부파일
권영근 | 2023.12.08 | 추천 0 | 조회 26
권영근 2023.12.08 - 26
64675 VBA
New 엑셀에서 메일 보낼때 서명란과 본문이 섞이는 문제.. (2)
bird**** | 2023.12.08 | 추천 0 | 조회 39
bird**** 2023.12.08 - 39
64672 문서서식
New 시트를 복사한 후, 모든 조건이 같은데도 인쇄 미리보기창이 길쭉해지는 문제 첨부파일 (3)
비손 | 2023.12.08 | 추천 1 | 조회 44
비손 2023.12.08 1 44
64669 함수/공식
New 나눠진 셀을 하나의 셀 안에 취합하는 방법 엑셀파일첨부파일 (3) 답변완료
아숫 | 2023.12.07 | 추천 0 | 조회 54
아숫 2023.12.07 - 54
64666 함수/공식
New 중복값중 2번째 이후부터 나오는 값을 따로 추출하고 싶습니다 첨부파일 (4) 답변완료
아숫 | 2023.12.07 | 추천 0 | 조회 30
아숫 2023.12.07 - 30
64662 기능/도구
New 강의내용 엑셀 찾기 및 바꾸기 (1)
노베이스엑셀 | 2023.12.07 | 추천 0 | 조회 49
노베이스엑셀 2023.12.07 - 49
64661 함수/공식
New 바로 위 숫자랑 비교해서 조건부서식 색칠하는 방법 질문입니다 엑셀파일 (1)
유령회원 | 2023.12.07 | 추천 0 | 조회 55
유령회원 2023.12.07 - 55
64658 함수/공식
New 2개회사 가입금액대비 보험료 월계산 엑셀파일 (3)
조녜 | 2023.12.07 | 추천 0 | 조회 52
조녜 2023.12.07 - 52
64654 함수/공식
New 날자별 집계하고 싶은데 ㅠㅠ 날자 부분이 달라서 값이 안나와요 도와주세요!! 엑셀파일 (4) 답변완료
시이그 | 2023.12.07 | 추천 0 | 조회 62
시이그 2023.12.07 - 62
64653 함수/공식
New 연관된 상품들을 각 열에 정리하기 첨부파일 (2)
piano**** | 2023.12.07 | 추천 0 | 조회 49
piano**** 2023.12.07 - 49
64650 함수/공식
New 요일별 이용자 평균값을 구하고 싶어요 (2)
소현 | 2023.12.07 | 추천 0 | 조회 43
소현 2023.12.07 - 43