vba (79)
엑셀 VBA #44 / Find메서드_변형2 [VBA] - 역방향으로 찾기
반응형

엑셀 VBA #44 / Find메서드_변형2 [VBA] - 역방향으로 찾기



Dim rng As Range, cf As Range
Dim ad As String

Set rng = Range("B3", Cells(Rows.Count, "B").End(xlUp))
Set cf = rng.Find("서울", Range("B18"), , xlWhole, , xlPrevious)

If Not cf Is Nothing Then
    ad = cf.Address
    Do
        
        Cells(Rows.Count, "E").End(3)(2) = cf.Offset(, -1)
        Set cf = rng.FindPrevious(cf)
    
    Loop Until cf.Address = ad
    
End If

결과값
vba#44.xlsm
0.02MB



https://www.youtube.com/watch?v=beI2XhKg3Yg&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=44


반응형
  Comments,     Trackbacks
엑셀 VBA #43 / Find메서드_변형1 [VBA]
반응형

엑셀 VBA #43 / Find메서드_변형1 [VBA]


Dim rng As Range, cf As Range
Dim ad As String

Set rng = Range("A2", Cells(Rows.Count, "A").End(xlUp))
Set cf = rng.Find("A-1", , , xlWhole)

If Not cf Is Nothing Then          'cf값이 있으면
    ad = cf.Address                    'ad라는 변수에 cf값을 넣는다.
    Do
        cf.Interior.ColorIndex = 43
        Set cf = rng.FindNext(cf)       '기존 찾았던 cf셀 이후로 찾는다--findnext
    Loop Until cf.Address = ad        'cf의 주소가 처음 주소와 같을 때 까지 Do~Loop구문작동
End If


[실무에서 가장 많이 사용되는 Find문 구조]
If Not cf Is Nothing Then  
    ad = cf.Address        
    Do
        
    Loop Until cf.Address = ad  
End If

https://www.youtube.com/watch?v=rVCct3N5VOA&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=43

반응형
  Comments,     Trackbacks
엑셀 VBA #42 / Find메서드_기본 [VBA]
반응형

엑셀 VBA #42 / Find메서드_기본 [VBA]

 

 

 

 

예시1.

B-1제품코드의 판정값 불러오기....
For~Next구문 혹은 For Each~Next구문 사용해도 되나, 자료가 방대한 경우 속도가 느려질 수 있음.

Dim rng As Range, cf As Range

Set rng = Range("A2", Cells(Rows.Count, "A").End(xlUp))
Set cf = rng.Find(Range("D2").Value, , , xlWhole)

    'cf는 rng영역 중에서 D2셀과 같을 가지는 셀의 주소

Range("E2") = cf.Offset(, 1)

  '    'Range("E2") = cf.Offset(, 1).value'  로 해도 동일한 결과가 나오네.......




예시2
Dim rng As Range, cf As Range

Set rng = Range("A2", Cells(Rows.Count, "A").End(xlUp))
Set cf = rng.Find(Range("D2").Value, , , xlWhole)

Range("E2").ClearContents

If Not cf Is Nothing Then
    Range("E2") = cf.Offset(, 1)
Else
    MsgBox "해당되는 제품코드가 없습니다."
End if

vba#42.xlsm
0.02MB

 

Find 함수
Find 함수는 엑셀에서 데이터가 일치하거나, 또는 부분일치하는 값을 찾는 VBA 메서드(함수)이다. Find 함수의 기본 사용법은 아래와 같다.
※ 사용법
셀 범위(Range).Find(What:=찾을 값,Lookat:=xlWhole)
-. Lookat:= xlWhole 일 경우 찾을 값과 전체 일치하는 값을 찾음
   Lookat:= xlPart는 부분적으로 일치해도 값을 찾은 것으로 인식
-. 참고로 Find는 값을 찾는다고 설명하였지만 Range 의 형식을 갖는다.(아래에서 설명)
출처: https://ybworld.tistory.com/75 [투손플레이스:티스토리]

 

 

 

 

https://www.youtube.com/watch?v=tx7vfkhg0xU&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=42


반응형
  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 #40 / 행 삭제_개선1 [VBA] - Union
반응형

엑셀 VBA #40 / 행 삭제_개선1 [VBA]

Sub 행삭제_union()

Dim r As Range      ' "A-1"값이 포함된 셀의 범위를 담을 변수(방)
Dim i As Long, lR As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row

For i = 2 To lR
      If Cells(i, "A") = "A-1" Then
            If r Is Nothing Then
                  Set r = Cells(i, "A").Resize(, 2)  'r이 range타입이므로 set문으로!
            Else 'r방에 다른 값이 존재한다면
                  Set r = Union(r, Cells(i, "A").Resize(, 2))  
                  'r방에 r방의 기존 값과 
                  새로운 값(Cells(i, "A").Resize(, 2))을  r방에 넣어라
            End If
      End If
Next

If Not r Is Nothing Then r.Delete    '만약 r방에 값이 존재하면 r을 지워라.

End Sub

 


Union메서드를 사용하지 않았을 때는 for문을 통해 한 행씩 삭제> 한 행이 밀려 올라가는 문제 때문에
마지막행를 시작으로 루프를 돌도록 만들었습니다만,
Union 메서드는 조건을 만족하는 영역들을 모아서 한방에 지우므로 "For i = 2 To lR" 사용해도 ok

 

vba#40.xlsm
0.02MB



https://www.youtube.com/watch?v=6jKY3fr01h4&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=40

 


 

union함수 참조

https://raymond.tistory.com/2257

엑셀 VBA #50 / 중복데이터 처리_3 [VBA]

 

반응형
  Comments,     Trackbacks
엑셀 VBA #39 / 행삭제_기본 [VBA]
반응형

엑셀 VBA #39 / 행삭제_기본 [VBA]


Dim i As Long, lR As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row

For i = lR To 2 Step -1

    If Cells(i, "A") = "A-1" Then
        Cells(i, "A").Resize(, 2).Delete
    End If
    
Next



https://www.youtube.com/watch?v=dfJyFc4uelU&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=39


반응형
  Comments,     Trackbacks
엑셀 VBA #37 / 행삽입_변형 [VBA]
반응형

엑셀 VBA #37 / 행삽입_변형 [VBA]

1. 원하는 개수 만큼 행 삽입

Dim i As Long, lR As Long
Dim j As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row

For i = lR To 2 Step -1
    If Len(Cells(i, "B")) Then                   ' Cells(i, "B")에 값이 있다면 아래 구문 반복해
            For j = 1 To Cells(i, "B").Value   '1부터 B열의 i행의 값만큼 아래 구문을 반복해!!!
                Cells(i, "A").Offset(1).Resize(, 6).Insert Shift:=xlDown
            Next
    End If
Next

결과값



2. 그룹별 행 삽입

Dim i As Long, lR As Long
Dim j As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row

For i = lR To 2 Step -1
    If i <> lR Then
        If Cells(i, "A") <> Cells(i + 1, "A") Then    '지금 행 값과 다음 행의 값이 다르면 다음 구문을 처리해!
              Cells(i, "A").Offset(1).Resize(, 6).Insert Shift:=xlDown
        End If
    End If
Next

결과값
vba#37.xlsm
0.03MB




https://www.youtube.com/watch?v=fFe0JI2r6UM&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=37

 

반응형
  Comments,     Trackbacks
엑셀 VBA #36 / 행삽입_기본 [VBA]
반응형

엑셀 VBA #36 / 행삽입_기본 [VBA]


1. 목적 : VBA에서 행삽입 기능 숙지
2. Insert
- 구문 : 개체.Insert Shift:=xldown
- 의미 : 정해진 영역에서 기존 행은 아래로 이동시키고 새로운 행 삽입

3. 사용

Dim i As Long, lR As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row   ' "A"열의 데이타가 있는 마지막 셀의 행번호

For i = 2 To lR
    If i <> lR Then  '마지막 행 아래는 빈 행이 있으므로, 마지막 행은 행삽입 불요 
        Cells(i, "A").EntireRow.Insert shift:=xlDown
    End If
Next

결과값---오류발생

오류발생원인 : 하나하나의 행 삽입되면서 기존의 행번호도 같이 변경되기때문!

해결위한 1차 코드
Dim i As Long, lR As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row

For i = lR To 2 Step -1  '마지막 번호부터 시작하면서 행번호를 줄여간다
    If i <> lR Then
        Cells(i, "A").EntireRow.Insert shift:=xlDown
    End If
Next

결과값...또 오류 발생!!!

오류발생......

해결위한 2차 코드
Dim i As Long, lR As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row

For i = lR To 2 Step -1 
    If i <> lR Then
        Cells(i, "A").Offset(1).Insert shift:=xlDown
        '작업해야 할 행보다 1칸 아래 행을 선정하여 행 삽입하면 됨
    End If
Next

결과값



4. 심화

Dim i As Long, lR As Long

lR = Cells(Rows.Count, "A").End(xlUp).Row

For i = lR To 2 Step -1
    If i <> lR Then
        Cells(i, "A").Offset(1).Resize(, 5).Insert shift:=xlDown
        'Resize(,5) : 5열까지만 행삽입토록
    End If
Next

vba#36.xlsm
0.02MB

 

 

 

https://www.youtube.com/watch?v=Lz1no-0Z7Xk&list=PLfxvqpVCYZ8e0qlyc_FU46neoWjO7yTWj&index=36




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