본문 바로가기
VBA/엑사남_기초방

[기초방] VBA 100제 #9 [ 데이터 영역 선택하기 ]

by 일등미노왕국 2023. 1. 5.

기초방 #9번 문제는 Offset 의 정확한 이해를 바탕으로 풀이가 가능한 문제이고

기초방 #9-1번 문제는 End 속성값을 통해 풀 수 있는 문제이다.

 

현재 기초방에서는 최대한 셀 기반으로 문제를 풀어내고 있다.

다른 언어들은 셀기반이 아니고 배열 구조여서 이해하기가 처음엔 어려울수도 있는데, VBA는 내가 하나씩 찍어볼수 있어서 이차원배열과 일차원배열을 이해하는데 더할 나위 없이 좋다..

 

할말이 없는데...참...나...

장인어른과 둘만 남아서 억지로 억지로 대화를 이어가는거 같다.

본인 코드에서 자주 등장하는 Cells(rows.count,"a").end(3)(2) 는 A열의 가장 아래에서 위로 컨트롤 윗 화살표를 했을 때 잡히는 셀에서 한칸 아래 부분을 말한다.. 

만일 잡힌셀에서 두줄 내려온 영역을 잡고 싶으면 Cells(rows.count,"a").end(3)(3)  이렇게 하면 된다.

 

본인이 초창기때 많이 했던 코드중에  range("a"&i) 이런 코드를 많이 사용하였는데 현재는 거의 쓰지 않는다. 불필요한 for문을 만들지 않기 위해서인데 가끔 이런걸 물어보시는 분이 계신다. 

for i =1 to 10
	for j=1 to 10
    
    	cells(i,j) = "X"
    	
    next j

next i
----------------------------------------
for each rngA in [a1:j10]

	rngA = "X"

next rngA

이런것도

for i = 1 to 10

	range("a" & i ) = "X"

next i

-------------------------------------

for each rngA in [a1:a10]

	rnga = "X"

next rnga

for each 문은 컬렉션에서 개체를 순환할때 필수적 순환문이며, 여러 언어에서도 사용하고 있기에 For each 구문과 친해질 필요가 있다. 본인이 for each 를 쓰면서 가장 힘들었던건 cell(i,j) 이것을 표현하지 못해서 였다.

 

이런건 이렇게 사용하면 된다. 가령 for each rngA in rngall 을 순환해야 한다면

cells(rnga.row, rnga.column + 2)  이런식으로 사용이 가능하다 

아래 구문에서 rngA.next는 단순하게 rngA(1,2) / rnga.offset(,1) 과 같다 . 그냥 rngA 에 옆에 있는값을 뜻한다.

더보기
Option Explicit
Sub 기초방_9()

    Dim rngX As Range: Set rngX = [g4]
    Dim rngAll As Range: Set rngAll = [c16:c26]
    Dim rngA As Range
    Dim Bln As Boolean: Bln = True
    
    Haja_Format                                              '= 초기화
    
    Do Until rngX = ""
    
        rngX.Offset(, rngX.Value) = rngX(1, -3)             '= Offset 상수만큼 알파벳 출력하기
    
        Set rngX = rngX.Offset(1)
        
    Loop
    
    For Each rngA In rngAll                                 '= end 상수만큼 값 출력하기
    
        If Bln = True Then
            Cells(Rows.Count, "g").End(3)(2).Resize(1, 2) = Array(rngA, rngA.Next)  '= 최초값
            Bln = False
        Else                                                                        '= 두번째 값부터
            Cells(Rows.Count, "g").End(3)(rngA.Next.Value + 2).Resize(1, 2) = Array(rngA, rngA.Next)
        End If
    
    Next rngA

   ' Haja_Format                                             '= 서식입히기
    
End Sub

Function Haja_Format()

    Dim rngAll As Range: Set rngAll = Union([h4:l10], [g16:h60])
    
    rngAll.ClearContents
    rngAll.Borders.LineStyle = 1
    rngAll.HorizontalAlignment = xlCenter
    
End Function

 큰 어려움없이 코드 이해가 가능하리라 본다.

기초방# 9 Insert.xlsm
0.02MB

보고있나...딱총!!

댓글