- Key,Item - Item으로는 String,Number,Sheet,Workbook,Dictionary,Collection,True,False,..가 될 수 있다. 개념도2
Dictionary구성원 - Add : 사전에 새로운 키와 항목을 추가 Add(key,Item) - CopareMode - Count : 사전의 항목수를 가져옴 - Exists : 지정한 키가 사전에 있는 확인함 - Item : 지정한 키에 대해 항목을 설정하거나 가져옴 Item(Key) - Items : 사전의 모든 항목을 포함하는 배열을 가져옴 Function Items() -Key : 다른 키로 바꿈 Key(Key) -Keys : 사전의 모든 키를 포함하는 배열을 가져옴 Function Keys()
Sub vba90강231231()
Dim rng As Range, c As Range
Dim nc As New Collection
Dim j As Long, i As Long, k As Long
Dim a()
' C열 데이타를 텍스트 타입으로 바꾸기
Set rng = Range("c5", Cells(Rows.Count, "c").End(3))
rng.TextToColumns Destination:=rng, fieldinfo:=Array(1, 2)
'정렬하기
Range("b5", Cells(Rows.Count, "c").End(3)).Sort Range("b5", Cells(Rows.Count, "c").End(3))(1, 2)
'New Collection & 배열 접목
On Error Resume Next
For Each c In rng
nc.Add Trim(c), CStr(Trim(c))
Next
On Error GoTo 0
j = 1 'j의 초기값을 설정하지않으면 0부터 시작함..nc의 초기값은 1이므로 본 코드 필요
i = 5
Range("e4").Select
Do
Do While Cells(i, "c") = nc(j)
ReDim Preserve a(k)
a(k) = nc(j) 'nc(j)의 값을 동적배열 a변수에 집어 넣기
ActiveCell.Offset(1) = k + 1
ActiveCell.Offset(1, 1) = nc(j)
ActiveCell.Offset(1).Select
k = k + 1
i = i + 1
Loop
j = j + 1
k = 0
Erase a
ActiveCell.Offset(1).Select
Loop While j <= nc.Count
End Sub
Sub Vlookup기능실현_New_Scripting_Dictionary_배열231228()
Dim dict As New Scripting.Dictionary
Dim rngS, rngF
Dim i As Long
Dim arr()
rngS = Sheet1.Range("a2", Sheet1.Cells(Rows.Count, "b").End(3)) 'rngS배열방 지정
rngF = Sheet2.Range("a2", Sheet2.Cells(Rows.Count, "a").End(3)) 'rngT배열방 지정
For i = 1 To UBound(rngS, 1)
If dict.Exists(rngS(i, 1)) Then
Else
dict.Add rngS(i, 1), rngS(i, 2)
'rngS(i,1)은 Key값, rngS(i,2)는 Item값임!!!!!
'cells(i,1)..cells(i,2)가 아님에 주의
End If
Next
ReDim arr(1 To UBound(rngF, 1), 1 To 1)
For i = 1 To UBound(rngF, 1)
If dict.Exists(rngF(i, 1)) Then
arr(i, 1) = dict(rngF(i, 1))
' "rngF(i,1)"은 Key값이고,
"dict(rngF(i,1))"은 그 Key값에 해당하는 Item의 값임!!!!!!!
Else
End If
Next
Sheet2.Range("e2").Resize(UBound(arr, 1), 1) = arr
End Sub
셀 범위'Sheet1.Range("A2", Sheet1.Cells(Rows.Count, "B").End(3))'를 rngS방에 넣기 rngF = Sheet2.Range("A2", Sheet2.Cells(Rows.Count, "A").End(3)) 셀 범위'Sheet2.Range("A2", Sheet2.Cells(Rows.Count, "A").End(3))'를 rngS방에 넣기
ReDim arr(1 To UBound(rngF, 1), 1 To 1) '????? For i = 1 To UBound(rngF, 1) 'UBound(rngF,1) : rngF의 1차원영역의 최대값 For j = 1 To UBound(rngS, 1) 'UBound(rngS,1) : rngS의 1차원영역의 최대값 'Sheet2.Cells(i, "E") = rngS(j, 2) '본 코드사용시 속도저하(배열코드가 아니라 워크시트 코드?이므로) If rngF(i, 1) = rngS(j, 1) Then arr(i, 1) = rngS(j, 2) Exit For '영상에서 이 코드는 빼먹었습니다. 넣어야 합니다.
'1:1로 매칭되므로 값을 찾았으면 안쪽 for문을 빠져나와야지
'그렇지 않으면 끝까지 루프를 돌므로 시간이 더 소요가 됩니다. End If Next Next
Sub 행삭제_배열_myexr231224()
Dim r As Variant '모든 데이타를 넣을 배열방r....variant적용
Dim a() '배열방r의 데이타 중 'A-1'이외 값을 넣을 배열방a....동적배열적용
Dim i As Long, j As Long, k As Long
'-----------------------------------------------------
'값을 각 배열방에 넣는 과정
r = Range("A1", Cells(Rows.Count, "B").End(xlUp))
ReDim a(1 To UBound(r, 1), 1 To 2)
'동적배열의 영역 확정, a는 2차원이므로 a(1차원,2차원)으로 표시해야함
'1차원 크기는 1부터 r의 행 갯수, 2차원 크기는 1부터 2열까지
For i = 1 To UBound(r, 1) ' UBound(r,1)=UBound(1): r배열의 1차원 위치의 최대값까지
If Cells(i, "A") <> "A-1" Then 'cells(i,"A")의 값이 "A-1"이 아니면
j = j + 1 'j의 초기값이 지정이 없으므로 지정해야하는데,
'j값은 1부터 시작해야 하므로 'j=j+1'코드 설정함
For k = 1 To 2 '열변호를 확장시킬 변수가 필요함
a(j, k) = r(i, k) 'i는 r방에 대응하는 변수이므로,
'i를 a방에 대응할 수 없으니 별도의 변수j를 대입함
Next
End If
Next
'------------------------------------------
'-------------------------------------------
'a방 배열 값을 뿌려주기
Range("A1").CurrentRegion.ClearContents
Range("A1").Resize(UBound(a, 1), 2) = a
'셀A1을 기준으로 "a배열의 1차원 최대값 및 2차원 최대값"만큼 리사이즈한 영역에 a배열값을 넣어준다.
'-------------------------------------------
End Sub
[개념] 1개의 변수에 여러 개의 값을 저장하여 활용할 수 있는 자료 구조 Array미적용시 5개 과목(국어,영어,수학,과학,체육)이 있는데, 과목명을 변수에 담아봅시다. 과목이 모두 5개이고 과목명이 문자이니까... 5개의 문자변수를 정의해야 하겠죠 Dim Subject1 As String Dim Subject2 As String .... .... Dim Subject5 As String Subject1 = "국어" .... .... Subject5 = "체육"
Array적용시 Dim Subject(1 to 5) As String Subject(1) = "국어" .... .... Subject(5) = "체육"
[Array변수를 정의하는 방법] 방식1 : Dim 배열변수(배열크기) As 변수타입 Dim MayArray(5) As String
방식2 : Dim 배열변수(시작번호 to 끝번호) As 변수타입 Dim MyArray(1 to 5) As String
[Array변수에 값을 저장하는 방법] 방식1(Dim MayArray(5) As String)로 한 경우 : MyArray(0) = "국어" '처음 시작번호는 0, 1이 아님!!!! .... MyArray(4) = "체육"
방식2(Dim MyArray(1 to 5) As String)로 한 경우 : MyArray(1) = "국어" '처음 시작번호는 내가 지정한 1!!! .... MyArray(5) = "체육"
[Array변수에 저장된 값을 불러오는 방법] Option Explicit Sub 배열값 불러오기() Dim MyArray(5) As String MyArray(0) = "국어" MyArray(1) = "영어" MyArray(2) = "수학" MyArray(3) = "과학" MyArray(4) = "체육" MsgBox MyArray(1) '영어가 출력됨 End Sub