Variant 변수에 날짜데이타를 넣을 때

VBA
작성자
saechang
작성일
2023-11-05 22:57
조회
202
엑셀버전 : 엑셀2019

운영체제 : 윈도우11

질문 요약 : Variant 에 날짜를 입력할 때 저장형식을 지정할 수 있는지?

Variant 변수에 날짜데이타를 넣을 때 #2023-11-01# 이런 형식으로 저장이 됩니다.

그런데 알고보니 저게 윈도우에서 설정된 기본 날짜 형식이더군요.

즉 윈도우에서 날짜 표시 형식을 바꾸면 저것도 바뀐다는 말입니다.

기본날짜형식을 yyyy-mm-dd-ddd 로 세팅해놓으면 #2023-11-01-수# 이렇게 저장이 됩니다.

저렇게 세팅해놓은 컴퓨터에서 자꾸 이상 동작이 발생해서 일주일 동안 끙끙대다가 조금 전에 알아냈습니다.

제 컴퓨터에서는 이상 없이 동작되는지라 환장하겠더군요.

안되는 컴퓨터를 가져와서 (민감한 자료 때문에 복잡한 일이 많았습니다.) 제 컴퓨터랑 나란히 놓고 뭐가 다른가 비교해보다가 알아냈습니다.

그 부분이 join 과 split 을 쓰는 부분이라 날짜데이타가 string 으로 저장되는 바람에 오작동이 생긴 겁니다.

일단 임시방편으로 left 함수를 써서 수정을 해놓긴 했지만 말 그대로 임시방편일 뿐.

 

질문 : 윈도우 날짜형식에 상관없이 날짜데이타를 변수에 입력할 때 저장 형식을 지정할 수 있을까요?

#2023-11-01# 이런 형식으로 저장되는 것을 상정하고 VBA를 작성했기 때문에 표시형식이 다른 컴퓨터에서는 오작동이 생깁니다.

format 함수로는 안되더군요.

답변 부탁드립니다.

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

  • 2023-11-05 23:39

    @saechang 님 로캘 설정과 상관없이 Format함수는 정상적으로 사용됩니다.


  • 2023-11-05 23:40

    @saechang 님 cdate 나 cdbl로 형식을 통일시키는걸 고려해보십시오


  • 2023-11-06 02:21

    두 분 모두 감사하지만 제가 원하는 바는 아니로군요.

    제가 원하는 건 변수에 yyyy-mm-dd 형식으로 저장되는 거였습니다.

    올려주신 화면에서도 지역창에 보면 변수에 요일까지 포함되어 있고요.

    제가 만든 함수가 표에서 여러 항목을 배열로 받아서 그 해당 항목의 내용을 join 하여 처리한 후

    다시 split 해서 배열로 다른 함수에 반환하는 로직입니다.

    예를 들면 표에서 날짜, 업체, 제품, 코드, 이렇게 4개를 선택하면 그 4개 항목을 join 해서

    "2023-10-31 | 삼성제과 | 밀가루 | XXX-Powder"  이렇게 문자열로 만들어서 처리하는 거죠.

    그리고 선택 항목은 언제든지 순서와 항목이 변경될 수 있습니다. 날짜가 안 들어갈 수도 있고요.

    항목의 갯수가 많고 데이타형도 다 다르기 때문에 일부러 몽땅 string 으로 처리하는 겁니다.

    그런데 날짜항목만 예외처리를 할 수가 없는 구조입니다.

    할 수는 있지만 코드가 지저분해지고 그럼 애초에 이 함수를 만들 이유가 없어지게 되거든요.

     

    일단 다시 한번 차근차근 생각해봐야겠습니다.

    다시 한번 두 분께 감사드립니다.


  • 2023-11-06 02:32

    해결했습니다.

     

    cells 로 받는게 아니라 cells.text 로 받으면 되는 문제였습니다.

    표의 날짜 항목을 yyyy-mm-dd 형식으로 해야 하지만 그 정도는 양해할 수 있는 문제입니다.

     

     

    일주일 동안 머리 싸맨 것이 5분만에 해결되어 버렸네요. 분명히 기뻐해야 하는데 오히려 허무합니다. 내 일주일~~ (-_-)

     

    기본기가 중요하다는 것을 다시 한 번 절감했습니다. (후~~)


    • 2023-11-06 09:09
      채택된 답변

      @saechang 님 Cells.Text를 사용할 경우 주의가 필요합니다.
      날짜 형식인데 셀 너비가 작아서 ###로 표시될 경우 해당 셀의 Cells.Text는 "###"가 되어 버립니다.

      JOIN을 할 때, 자료를 어떻게 받아서 사용하는지 궁금하네요...


      • 2023-11-06 13:58

        @원조백수 님 그런 문제가 있었군요. 몰랐습니다.

        함수 실행 전에 columns.autofit 을 넣었습니다. 그럼 문제 없을 듯하네요.

         

        함수는 별거 없습니다. 고유값을 추출하는 함수입니다.

        고급필터나 중복제거를 쓰면 간단한데 이건 일단 시트에 뿌린 다음에 처리해야 하고

        if 처리가 안되는 것 같더군요. (제가 잘 몰라서 그러겠지만...)

        특정 날짜나 특정 조건을 만족하는 것 등...

        게다가 고유값 추출 항목이 일정하지 않습니다.

        날짜만, 혹은 날짜, 제품, 혹은 제품, 업체, 날짜, 제품패키지... 이런 식으로 항목 숫자랑 순서가 바뀌다보니

        좀 범용적인 함수가 필요해서요. 쉬운 방법이 있는데 제가 몰라서 그런지...

        그래서 항목마다 and 조건을 걸려니 답이 없어서 선택된 항목 값을 모두 join 해서 1차원배열로 만들어

        중복검사를 처리한 후 다시 split 해서 반환합니다. 그 와중에 오작동이 난 거구요

         

        아뭏든 다시 한번 감사드립니다.


      • 2023-11-06 14:05

        @원조백수

        Option Explicit
        
        Public wsDATA As Worksheet, wsPRODUCT As Worksheet, wsCUSTOMER As Worksheet, wsPACK As Worksheet
        Public tblDATA As ListObject, tblPRODUCT As ListObject, tblCUSTOMER As ListObject, tblPACK As ListObject
        Public wsINPUT As Worksheet, wsCONFIG As Worksheet
        
        Sub UseSheet(ParamArray Args() As Variant)
        
            If UBound(Args) = -1 Then MsgBox "변수가 없습니다.": Exit Sub
            
            Dim arg As Variant
            
            For Each arg In Args
                Select Case arg
                Case "DATA"
                    Set wsDATA = ThisWorkbook.Sheets("2023")
                    Set tblDATA = wsDATA.ListObjects("DATA2023")
                Case "PRODUCT"
                    Set wsPRODUCT = ThisWorkbook.Sheets("제품")
                    Set tblPRODUCT = wsPRODUCT.ListObjects("제품List")
                Case "CUSTOMER"
                    Set wsCUSTOMER = ThisWorkbook.Sheets("업체")
                    Set tblCUSTOMER = wsCUSTOMER.ListObjects("업체List")
                Case "PACK"
                    Set wsPACK = ThisWorkbook.Sheets("제품Pack")
                    Set tblPACK = wsPACK.ListObjects("제품Pack")
                Case "INPUT"
                    Set wsINPUT = ThisWorkbook.Sheets("입력")
                Case "CONFIG"
                    Set wsCONFIG = ThisWorkbook.Sheets("설정")
                Case Else
                    MsgBox "없는 테이블입니다."
                End Select
            Next arg
        
        End Sub
        
        
        Function MatchColumnIndex(Args() As Variant) As Variant
                                                                                            ' DATA표의 항목을 배열로 받아서 column index 를 1부터 시작하는 배열로 반환
            If UBound(Args) = -1 Then MsgBox "변수가 없습니다.": Exit Function
        
            Call UseSheet("DATA")
            
            Dim i As Integer, idxNo() As Variant
            ReDim idxNo(1 To UBound(Args) + 1)
            
            For i = 1 To UBound(Args) + 1
                idxNo(i) = WorksheetFunction.Match(Args(i - 1), tblDATA.HeaderRowRange, 0)
            Next i
        
            MatchColumnIndex = idxNo
        
        End Function
        
        
        
        Function DeDuplication(Fday As Date, Eday As Date, colName() As Variant) As Variant
            
            Call UseSheet("DATA")
            
            Dim ColIdxNo As Variant
            Dim endRow As Long
            Dim endIndex As Long
            Dim result() As String, aTemp() As String, sTemp As String
            Dim isDuplicate As Boolean
            Dim i As Long, j As Integer, k As Long
            Dim r As Long, c As Integer
            Dim vDay As Variant
            Dim tmp() As Variant
            tmp = colName
            ColIdxNo = MatchColumnIndex(tmp)
            
            endRow = tblDATA.DataBodyRange.Rows.Count
            vDay = tblDATA.ListColumns("날짜").DataBodyRange.Value
            
            c = UBound(ColIdxNo)
            
            ReDim aTemp(1 To c)                            ' 한 행의 항목을 담을 배열, 여기서 aTemp의 인덱스는 1로 시작한다.
            
            endIndex = 1
            ReDim result(endIndex)
            
            result(0) = Join(colName, "|")                  ' 0번에 제목줄을 넣는다. 중복검사시 에러발생 방지용.
            isDuplicate = False
        
            For i = 1 To endRow
                If vDay(i, 1) >= Fday And vDay(i, 1) <= Eday Then
                    For j = 1 To c
                        aTemp(j) = tblDATA.DataBodyRange.Cells(i, ColIdxNo(j)).Text      ' DATA표의 선택된 항목을 한 행씩 배열로 만들고
                    Next j
                    sTemp = Join(aTemp, "|")                                        ' 합친다.
                    isDuplicate = False
                    
                    For k = endIndex To 1 Step -1
                        If sTemp = result(k - 1) Then isDuplicate = True: Exit For    ' 중복검사
                    Next k
                    If Not isDuplicate Then
                        ReDim Preserve result(endIndex)                ' 합쳐서 1차원배열로 만드는 이유. 다차원배열은 마지막 차원(2차원이면 열방향)만 preserve.
                        result(endIndex) = sTemp
                        endIndex = endIndex + 1
                    End If
                ElseIf vDay(i, 1) > Eday Then Exit For                  ' 표가 날짜정렬된 상태이므로 더 이상은 루프 돌릴 필요 없음.
                    
                End If
            Next i
        
            r = UBound(result)
            
            Dim Uniq As Variant
            ReDim Uniq(1 To r, 1 To c)
                
            For i = 1 To r
                aTemp = split(result(i), "|")                   ' split으로 분리했으므로 aTemp 의 인덱스는 0으로 시작한다.
                Uniq(i, 1) = left(aTemp(0),10)                 ' 날짜는 항상 첫번째에 있어야 한다.
                For j = 2 To c
                    Uniq(i, j) = aTemp(j - 1)
                Next j
            Next i
        Stop
            DeDuplication = Uniq
            
        End Function
        
        
        Sub 임시run()
        
            Dim 첫날 As Date, 끝날 As Date
            Dim 제목()
            Dim 결과
            
            첫날 = #12/31/2022#
            끝날 = #11/1/2023#
            
            제목 = Array("날짜", "주문번호", "업체", "제품")
            
            결과 = DeDuplication(첫날, 끝날, 제목)
            
        
            Dim head As Range, body As Range
            Set head = ThisWorkbook.Sheets("temp").Range("A2").Resize(1, UBound(제목) + 1)
            Set body = ThisWorkbook.Sheets("temp").Range("A3").Resize(UBound(결과), UBound(제목) + 1)
            
            ThisWorkbook.Sheets("temp").Cells.Clear
            head = 제목
            body = 결과
            body.Columns.AutoFit
            body.Cells.Font.Size = 9
            
        End Sub
        
        

        제가 짠 코드입니다. 많이 어설픈데 한 번 보시고 개선할 점이 있는지 좀 봐주시면 감사하겠습니다.


      • 2023-11-06 14:11

        @원조백수 님 마지막 부분이 수정 전의 코드가 올라갔군요.

                
            For i = 1 To r
                aTemp = split(result(i), "|")                   ' split으로 분리했으므로 aTemp 의 인덱스는 0으로 시작한다.
        
                For j = 1 To c
                    Uniq(i, j) = aTemp(j - 1)
                Next j
            Next i
        Stop
            DeDuplication = Uniq
            
        End Function

         


        • 2023-11-06 17:58

          @saechang 님 데이터 한 행을 JOIN으로 연결하여 고유값을 확인하신다면,
          Dictionary에 넣어 두고, oDict.Exists(sKey) 처럼 중복을 확인하는 것이 좋을 듯 합니다.


전체 13,331
번호 카테고리 제목 작성자 작성일 추천 조회
알림
[📚교재 출간 안내] 「진짜쓰는 실무엑셀」 , 드디어 출간되었습니다! (236)
오빠두엑셀 | 2022.02.03 | 추천 514 | 조회 260122
오빠두엑셀 2022.02.03 514 260122
공지사항 문서서식
⭐ [더 나은 커뮤니티 문화를 위한 Q&A 글 작성 규칙] ⭐ (197)
오빠두엑셀 | 2021.10.28 | 추천 280 | 조회 17878
오빠두엑셀 2021.10.28 280 17878
64437 함수/공식
New [다중조건 index large row] 함수가 적용이 안되네요 엑셀파일첨부파일 (1)
abc초콜릿 | 11:53 | 추천 0 | 조회 11
abc초콜릿 11:53 - 11
64433 VBA
New 셀레니움 세부 내용 가져오는 방법
임정호 | 10:26 | 추천 0 | 조회 10
임정호 10:26 - 10
64432 함수/공식
New Min if 함수 오류 해결 부탁드립니다. 엑셀파일 (2) 답변완료
shlolife | 09:50 | 추천 0 | 조회 17
shlolife 09:50 - 17
64429 함수/공식
New [해결방법문의] 여러시트에서 이름에따른 금액을 검색하고 싶습니다. 첨부파일 (1)
김광연 | 03:10 | 추천 0 | 조회 26
김광연 03:10 - 26
64427 차트/그래프
New 막대그래프의 선을 따서 반전시키는 방법 문의 엑셀파일첨부파일 (1)
new_hwan | 01:36 | 추천 0 | 조회 17
new_hwan 01:36 - 17
64423 함수/공식
New 이름,주소 월 별로 비교해서 변경사항 있으면 IF 중첩함수로 추출하는 방법 첨부파일 (1)
아숫 | 2023.12.01 | 추천 0 | 조회 31
아숫 2023.12.01 - 31
64420 기능/도구
New ㅠㅠㅠㅠㅠ.... 어제부터 몇시간째 못풀고 있습니다.. 나열되어 있는표 교차행(?)으로 만드는법 엑셀파일 (6)
문재희 | 2023.12.01 | 추천 0 | 조회 39
문재희 2023.12.01 - 39
64417
New 달 바뀌면 자동으로 적용되는 서식궁금합니다. 엑셀파일첨부파일
gnsdlgns | 2023.12.01 | 추천 0 | 조회 40
gnsdlgns 2023.12.01 - 40
64415
New 거래명부에서 가져온 정보로 거래명세서 자동채우기. 같은날 다수거래처, 다수품목 일때 오류 관련 첨부파일 (1)
excellJK | 2023.12.01 | 추천 0 | 조회 37
excellJK 2023.12.01 - 37
64414 함수/공식
New 연차현황 관련 엑셀파일 (3)
용용 | 2023.12.01 | 추천 0 | 조회 43
용용 2023.12.01 - 43
64411 함수/공식
New 가장 가까운 좌표 리스트업 엑셀파일첨부파일
aish | 2023.12.01 | 추천 0 | 조회 40
aish 2023.12.01 - 40
64410 VBA
New 앞 단어의 받침 유무에 따라 잘못 사용된 (을/를) 검사 매크로 만들기 질문 엑셀파일 (2)
777 | 2023.12.01 | 추천 0 | 조회 38
777 2023.12.01 - 38
64405 함수/공식
New 한 좌표값(a,b)이랑 가장 가까운 좌표값 찾기 (4)
aish | 2023.12.01 | 추천 0 | 조회 39
aish 2023.12.01 - 39
64404 함수/공식
New 구매리스트 관련문의 (VLOOKUP 중복 건너뛰고 표기하기) 엑셀파일 (3)
러브미몬스터 | 2023.12.01 | 추천 0 | 조회 43
러브미몬스터 2023.12.01 - 43
64396 함수/공식
New 표준편차 계산시 특정월의 데이터만 계산하고 싶습니다(X방향) 엑셀파일첨부파일 (2) 답변완료
전설 | 2023.12.01 | 추천 0 | 조회 38
전설 2023.12.01 - 38
64393 함수/공식
New 엑셀 함수 값 관련 질문 (2)
리덕구 | 2023.12.01 | 추천 0 | 조회 36
리덕구 2023.12.01 - 36
64387 VBA
New 아실 크롤링 관련 문의 (1)
임정호 | 2023.11.30 | 추천 0 | 조회 42
임정호 2023.11.30 - 42
64384 VBA
New VBA PivotItem 문의 (1)
봉s | 2023.11.30 | 추천 0 | 조회 43
봉s 2023.11.30 - 43
64382 파워쿼리/피벗
New [파워쿼리] 쿼리안에서 구분기호 기준으로 열분할을 하고 난 후, 아래로 채우기가 안됩니다.!! (6) 답변완료
jja**** | 2023.11.30 | 추천 0 | 조회 50
jja**** 2023.11.30 - 50
64381 함수/공식
New row()가 자동으로 변경될 수 있도록.... 엑셀파일 (4)
대빵 | 2023.11.30 | 추천 0 | 조회 47
대빵 2023.11.30 - 47
64377 피벗테이블
New 엑셀 피벗 행/열 비율 산출 질문 (2)
bugko**** | 2023.11.30 | 추천 0 | 조회 33
bugko**** 2023.11.30 - 33
64376 VBA
New 견적서 내용을 리스트업 하는 VBA 엑셀파일첨부파일
조범주 | 2023.11.30 | 추천 0 | 조회 44
조범주 2023.11.30 - 44
64371 구글시트
New 두 개 시트 연동 (4) 답변완료
RecSoo | 2023.11.30 | 추천 0 | 조회 48
RecSoo 2023.11.30 - 48
64370 함수/공식
New 모든시트를 선택하는 함수가 있을까요?ㅠㅠ (2)
myyh**** | 2023.11.30 | 추천 0 | 조회 61
myyh**** 2023.11.30 - 61
64367 VBA
New 특정셀에 여러 변수 값을 대입하여 나오는 계산 값을 변수에 맞게 한번에 출력되게 하는 방법이 있을까요?? 엑셀파일첨부파일 (2) 답변완료
박재관 | 2023.11.30 | 추천 0 | 조회 46
박재관 2023.11.30 - 46
64366 문서서식
New 전체인쇄와 시트1개 인쇄시 이미지 품질 저하문제 첨부파일 (2)
코코마 | 2023.11.30 | 추천 0 | 조회 31
코코마 2023.11.30 - 31
64360 함수/공식
New 각 열의 텍스트를 비교하여 일치율에 따라 관련열 값 가져오기 첨부파일 (1)
요코하마박 | 2023.11.30 | 추천 0 | 조회 43
요코하마박 2023.11.30 - 43
64359 구글시트
New 엑셀 또는 구글시트 - 다른시트 데이터의 새로운값만 순차적으로 가져오는방법.. (3)
myyh**** | 2023.11.30 | 추천 0 | 조회 37
myyh**** 2023.11.30 - 37
64355 함수/공식
New sumifs 문의 드립니다. (2) 답변완료
sarangh**** | 2023.11.30 | 추천 0 | 조회 43
sarangh**** 2023.11.30 - 43
64353 함수/공식
New 엑셀 수식이 안 먹어요~ 엑셀파일 (2)
안녕 | 2023.11.30 | 추천 0 | 조회 60
안녕 2023.11.30 - 60