이런 류의 문제를 풀기 위해서는 반복될 기초 틀을 하나의 영역으로 잡는것이 가장 중요하다 이 한 블럭만 완성을 하면
그 다음 부터는 순환 반복이기 때문에 큰 어려움이 없을 것이다.
46번은 전형적으로 For each의 움직임을 이해한다면 바로 풀 수 있는 문제이고
46-1은 offset의 움직임을 이해한다면 큰 어려움없이 풀 수 있을 것이다.
본인의 코드를 보고도 이해가 안된다면 아직 셀기반의 움직임을 정확히 이해 못한거니 이참에 움직임을 하나씩 찍어보길 바란다.
더보기
Option Explicit
Sub 기초방46()
Dim rngAll As Range
Dim rngA As Range
Dim i&, r&
Set rngAll = make_rng([e4]) '= 영역 만들기
[e4:o200].ClearContents '= 초기화
For r = 1 To 6 '= 만들어진 영역을 6번 반복
For Each rngA In rngAll
i = i + 1 '= For each 움직임에 따라 +1
rngA = i
haja_Delay rngA
If i >= 97 Then Exit For '= 카운트 숫자가 97보다 커지면 종료
Next rngA
Set rngAll = rngAll.Offset(10)
Next r
Call 기초방46_1
End Sub
Sub 기초방46_1()
Dim i&, j&, r&, Cnt&
Dim rngX As Range
Set rngX = make_rng([e4]) '= 영역 만들기
[e4:o200].ClearContents '= 초기화
For r = 1 To 6 '= 6번 반복
For i = 1 To 10 '= 왼쪽 위에서 오르쪽 아래로 내려오는 대각선 만들기
Cnt = Cnt + 1
rngX(i, i) = Cnt
haja_Delay rngX(i, i)
Next i
Cnt = Cnt + 1
Set rngX = rngX(1, i) '= 오른쪽 위 꼭지점 인쇄
rngX = Cnt
haja_Delay rngX
For j = 1 To 9 '= 오른쪽 위에서 왼쪽 아래로 내려오는 대각선 만들기
If IsEmpty(rngX.Offset(j, -j)) Then
Cnt = Cnt + 1
rngX.Offset(j, -j) = Cnt '= 이미 숫자가 있다면 다음 번 셀에 출력
haja_Delay rngX.Offset(j, -j)
End If
Next j
Set rngX = rngX.Offset(j, -j)
Next r
End Sub
Function make_rng(rngX As Range) As Range
Dim i&, j&, r&, Cnt&
For i = 1 To 10
rngX(i, i) = 1
Next i
Set rngX = rngX(1, i)
rngX = 1
For j = 1 To 9
rngX.Offset(j, -j) = 1
Next j
Set make_rng = [e4:o13].SpecialCells(2)
End Function
Function haja_Delay(rngX As Range)
Dim i&
For i = 1 To 10
rngX.Select
rngX.Font.Bold = True
rngX.Interior.ColorIndex = Application.RandBetween(1, 50)
Next i
rngX.Font.Bold = False
rngX.Interior.ColorIndex = xlNone
End Function
'VBA > 엑사남_기초방' 카테고리의 다른 글
[기초방] VBA 100제 #52 [ 민원인 서식변경 ] (0) | 2023.07.03 |
---|---|
[기초방] VBA 100제 #51 [ 주소 나누기 ] (0) | 2023.07.02 |
[기초방] VBA 100제 #45 [ 반구성하기 ] (0) | 2023.03.19 |
[기초방] VBA 100제 #44 [ 각종 통화 할인율 구하기 ] (0) | 2023.03.17 |
[기초방] VBA 100제 #43 [ 조합 정렬하기 ] (0) | 2023.03.16 |
댓글