동적배열 (6)
엑셀 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 #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 #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 #25 / For Each~Next_1 [VBA] - 시트숨기기
반응형

엑셀 VBA #25 / For Each~Next_1 [VBA] - 시트숨기기

For Each~Next문으로 시트 숨기기

Sub For_Each_Next로_시트_숨기기1()

Dim sh As Worksheet

For Each sh In ThisWorkbook.Worksheets
      If sh.Name = "메인" Then
      ElseIf sh.Name = "외우기" Then
      Else
            sh.Visible = False
      End If
Next

End Sub

 

 

For Each~Next문 & 동적배열로 시트 숨기기

Sub For_Each_Next_and_동적배열로_시트_숨기기()

Dim sh As Worksheet
Dim s()      '시트이름이 '메인''외우기'가 아닌 시트 이름을 각각 보관할 배열방..동적배열적용
Dim i As Long

For Each sh In ThisWorkbook.Worksheets
      If sh.Name = "메인" Then
      ElseIf sh.Name = "외우기" Then
      Else
            ReDim Preserve s(i)
            s(i) = sh.Name   '각각의 s방에 숨길 시트 이름 보관
            i = i + 1
      End If
Next

Sheets(s).Visible = False

End Sub

 

For Each~Next문에 동적배열을 같이 적용하면 속도가 향상된다.

vba#25.xlsm
0.02MB

 

 

https://www.youtube.com/watch?v=HIlFL8yniM4&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=25

 

 

반응형
  Comments,     Trackbacks
엑셀 VBA #11 / 셀 범위 선택하기_6 [VBA] - Areas
반응형

엑셀 VBA #11 / 셀 범위 선택하기_6 [VBA]

1. 목적 : (비연속적)다중영역의 셀 주소 확인 가능
구조 : 기준개체.Areas
의미 : 다중영역의 전체를 한 묶음으로 지정???

(VBA#12 04:36)
    For each   in rng.SpecialCells(xlCellTypeBlanks).Areas

    rng영역에서 값이 없는 빈셀의 다중영역 전체!!!!!!!

 


2. 사용
  2.1. 선택된 셀이 하나인 경우
     MsgBox Selection.Address
     선택 셀의 주소가 절대주소로 보여짐


     MsgBox Selection.Address(0,0)
     선택 셀의 주소가 상대주소로 보여짐


  2.2. 선택된 셀이 다중인 경우(ex, 4개 영역)
     MsgBox Selection.Areas(1).Address(0,0)
     MsgBox Selection.Areas(2).Address(0,0)
     MsgBox Selection.Areas(3).Address(0,0)
     MsgBox Selection.Areas(4).Address(0,0)

3. 심화활용
선택된 셀 영역의 갯수를 모르는 경우 : For Each ~ Next문 & 동적배열 사용
Dim a As Range
Dim adr()
Dim i As Long

For Each a In Selection.Areas
    ReDim Preserve adr(i)          'adr은 영역의 각각의 주소를 담는 변수
    adr(i) = a.Address(0, 0)
    i = i + 1
Next

MsgBox "선택된 다중범위는 " & vbCr & Join(adr, vbCr)

vba#11.xlsm
0.02MB



https://www.youtube.com/watch?v=lVh9T7V21ZE&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=11

반응형
  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