배열 (8)
[VBA] Dictionary에 대한 이해1
반응형

Dictionary에 대한 이해


- 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()

 

반응형
  Comments,     Trackbacks
엑셀 VBA #90 / 데이터재배치 [VBA]
반응형

엑셀 VBA #90 / 데이터재배치 [VBA]

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

 

 

 

 



https://www.youtube.com/watch?v=x9b1bRVoMic&t=736s

ㅁㅁㅁ

반응형
  Comments,     Trackbacks
엑셀 VBA #127 / Vlookup시리즈3_배열+Dictionary활용 [VBA]
반응형

엑셀 VBA #127 / Vlookup시리즈3_배열+Dictionary활용 [VBA]

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

vba#127.xlsm
0.31MB


엑셀 VBA #118 / Dictionary 개체_기본 [VBA]
엑셀 VBA #119 / Dictionary 개체_실무 [VBA]



https://www.youtube.com/watch?v=I4iyh9tF5kc&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=129
ㅁㅁ

반응형
  Comments,     Trackbacks
엑셀 VBA #126 / Vlookup시리즈2_배열 활용 [VBA]
반응형

엑셀 VBA #126 / Vlookup시리즈2_배열 활용 [VBA]
Vlookup 함수같은 기능
   1. 파워쿼리
   2. 배열
   3. 배열 + Dictionary

 

Sub VlookupVBA_1()   '배열로 Vlookup기능실현

Dim rngS As Variant     '워크시트의 셀범위를 배열로 집어 넣을 땐 항상 Variant임
Dim rngF As Variant      '           "
Dim arr()


Application.ScreenUpdating = False
Sheet2.Range("E2:E" & Sheet2.Range("A2").End(xlDown).Row).Clear

rngS = Sheet1.Range("A2", Sheet1.Cells(Rows.Count, "B").End(3))

셀 범위'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

Sheet2.Range("E2").Resize(UBound(arr, 1), 1) = arr
Application.ScreenUpdating = True

End Sub

vba#126.xlsm
0.30MB



https://www.youtube.com/watch?v=QM-o-95daIc&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=128

엑셀 VBA #29 / VBA함수(split) [VBA]

반응형
  Comments,     Trackbacks
엑셀 VBA #118 / Dictionary 개체_기본 [VBA]
반응형

엑셀 VBA #118 / Dictionary 개체_기본 [VBA]

[New Dictionary]
Dim dict As Oject
Set dict = CreateObject("scripting.dictionary")
위 두 문장으로 된 구문( Late Binding이라 함)

아래 하나의 문장으로 된 구문( Early Binding이라 함)으로 할 수 있다.

Dim dict As New Scripting.Dictionary



1.구조 
Dictionary이름명. Add  Key  Item


2. 예시
dict.Add "사과",111
dict.Add "바나나",222
dict.Add "딸기",333

조사식창에 나온 Keys, Items

 

3. For ~ Next문에 적용

3.1. 기본
Dim dict As New Scripting.Dictionary
Dim i As Long

dict.Add "사과", 111
dict.Add "바나나", 222
dict.Add "딸기", 333

For i = 0 To 2
    Cells(i + 1, 1) = dict.Items(i)
Next

위 구문의 문제점은 Item 갯수가 아주 많은 경우에는 처리속도가 느려진다는 것이다..

그래서 Key  및 Item값을 워크시트에 한꺼번 뿌려줄 필요가 있다.

이것을 할 수 있는 방법이 '배열'이다.

 

3.1. 동적배열

Dim dict As New Scripting.Dictionary
Dim i As Long
Dim arr() As Variant    '동적배열 적용. arr()의 값 유형을 모르니 Variant로 한다.

dict.Add "사과", 111
dict.Add "바나나", 222
dict.Add "딸기", 333

For i = 0 To 2
    'Cells(i + 1, 1) = dict.Items(i)
    ReDim Preserve arr(i)   ' 동적배열 적용문으로 동적배열의 사이즈를 i값으로 재선언
    arr(i) = dict.Items(i)        'item(i)값을 arr방에 집어넣기!!!!
Next

동적배열 arr방에 값이 들어옴

 

 

이제는 arr방에 들어온 item(i)값을 시트에 뿌려보자

......

   arr(i) = dict.Items(i)
Next

range("A1:A3") =arr

range("A1:A3") =arr이 시트에 뿌려진 모습

메모리 상에서는 arr은 아래 그림처럼 가로로 담겨져 있다.

 

이를 A1:A3로 올바르게 뿌려지기 위해서는 Transpose함수를 아래처럼 적용해야 한다.

range("A1:A3") =Application.transpose(arr)

3.1.1. UBound & LBound

For~Next문에서 i의 마지막 값을 프로그램이 자동으로 지정할 수 있도록 해야한다. 하드코딩하는 방법을 바람직하지 않다.프로그램이 알아서 값을 지정할 수 있도록 하는 변수에는 UBound와 LBound가 있다.

For i = 0 To 2

For i = 0 To UBound(dict.Items)   

 

4. 최종 코드

Sub Pdictionary()

Dim dict As New Scripting.Dictionary
Dim i As Long
Dim arr() As Variant


dict.Add "사과", 111
dict.Add "바나나", 222
dict.Add "딸기", 333

For i = 0 To UBound(dict.Items)
    'Cells(i + 1, 1) = dict.Items(i)
    ReDim Preserve arr(i)
    arr(i) = dict.Items(i)
Next


Range("A1:A3") = Application.Transpose(arr)
 
End Sub

vba#118.xlsm
0.02MB

 

VBA - Dictionary(Late vs Early Binding) by 우노사설

 

 

https://www.youtube.com/watch?v=1yBE6MGkIA4&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=120

 

 

 

반응형
  Comments,     Trackbacks
엑셀 VBA #41 / 행 삭제_개선2 [VBA] - 배열
반응형

엑셀 VBA #41 / 행 삭제_개선2 [VBA] - 배열

 

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

 



결과값

 

vba#41.xlsm
0.02MB


https://www.youtube.com/watch?v=c7rkH3le9cs&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=41






반응형
  Comments,     Trackbacks
엑셀 VBA #27 / 배열 [VBA] - 배열
반응형

엑셀 VBA #27 / 배열 [VBA] - 배열

1. 목적 : 일반 변수 등을 사용하는 것보다 배열을 사용하면 처리 속도 향상된다.

2. 구조
  2.1. 정적배열 : 배열의 크기가 정해진 경우 사용
  Dim a(2)    '3개의 배열 방이 생성
  Dim i As Long

  For i = 0 to 2
     a(i) = i
  Next

2.2. 동적배열 : 배열의 크기가 정해지지 않은 경우 사용
  Dim aa()
  Dim i As Long, cnt As Long

  cnt = 2

  For i = 0 to cnt
     ReDim Preserve aa(i)
  Next

3. 특이사항
배열의 초기화 필요시 Next 다음에 'errase 배열명' 입력함
cf. 정적배열에 배열초기화 할 경우, 배열방은 남아 있으나 배열값은 없어짐

 


     동적배열에 배열초기화 할 경우, 배열방 및 값이 없어짐



https://www.youtube.com/watch?v=wSoOaVG0BxA&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=27

반응형
  Comments,     Trackbacks
vba - Array(배열)1
반응형

Array(배열)1

[개념]
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

 

https://blog.naver.com/mydarlingharbour/223007267848

반응형
  Comments,     Trackbacks
최근 작성 글
최근 작성 댓글
최근 작성 트랙백
프로필
공지사항
글 보관함
캘린더
«   2024/12   »
1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30 31
TODAY TOTAL