Excel - Sample

[VBA] 유효성 검사의 오류 > Dictionary에 Range개체 Key로 사용문제

EGTools 2024. 1. 25. 19:00
728x90

 

아래 첨부 파일은 매크로 [실행] 버튼을 클릭하면 [I1] 셀에 유효성 검사 목록을 설정합니다.

유효성 검사.xlsm
0.02MB

 

 

실제로 정상적으로 작동은 되는데, 저장하고 다시 열면 아래와 같이 문서 복구가 진행이 됩니다.

 

 

사용된 코드는 매우 간단해서 아래와 같습니다.

Sub test()

    Dim strText As String
    Dim int1 As Integer
    
    With CreateObject("Scripting.Dictionary")
    
        For int1 = 2 To 21
            If Not .Exists(Cells(int1, 2)) Then .Add Cells(int1, 2), ""
        Next int1
        strText = Join(.keys, ",")
    End With
    
    With Range("I1").Validation
        .Delete
        .Add xlValidateList, xlValidAlertStop, xlBetween, strText
    End With

End Sub

 

아무런 오류도 발생하지 않고, 매크로 실행후에도 유효성 검사가 정상적으로 작동하는데 어떻게 된 것일까요???

 


 

유효성 검사에 등록할 값은 10개의 목록이 2번 중복되어 있어서

Dictionary를 이용해서 10개만 남긴 후에 휴효성 검사 목록에 넣는 것인데,

실제로는 20개가 그대로 모두 등록이 됩니다.

 

왜 그럴까요?

Dictionary를 개체 변수를 할당하여 Debug 해 봅니다.

 

어라... Range Object 개체가 통으로 Dictionary의 Key로 등록이 되었네요...

Dictionary에 개체도 key로 등록이 되는군요...

 

이제 오류가 발생하지 않도록 Cells.Value2 로 수정된 코드를 시험해 봅니다.

Sub test()

    Dim strText As String
    Dim int1 As Integer
    
    With CreateObject("Scripting.Dictionary")
    
        For int1 = 2 To 21
            If Not .Exists(Cells(int1, 2).Value2) Then .Add Cells(int1, 2).Value2, ""
        Next int1
        strText = Join(.keys, ",")
    End With
    
    With Range("I1").Validation
        .Delete
        .Add xlValidateList, xlValidAlertStop, xlBetween, strText
    End With

End Sub

 

생각했던 대로 String 값으로 Key에 잘 등록되었고, 중복검사도 잘 되어 10개만 남았네요...

이제는 저장을 하고 열어도 문제 없이 제대로 열립니다.

728x90