EXCEL - VBA

좌표를 이용해 엑셀에 도면 표시하기(3)

별동산 2023. 11. 16. 10:28
반응형

좌표를 이용해서 도면 위치 표시하기2(완성).xlsm
0.04MB

 

 

(라) For ~ Next 반복문 실행

    For i = 2 To 21
        BottomRow = 작은값행(Sheets(3).Cells(i, 2).Value, eastRange)
        topRow = 작은값행(Sheets(3).Cells(i, 3).Value, eastRange)
        RightCol = 작은값열(Sheets(3).Cells(i, 4).Value, northRange) + 1
        LeftCol = 작은값열(Sheets(3).Cells(i, 5).Value, northRange) - 1
        
        Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, Cells(topRow, LeftCol).Left, Cells(topRow, LeftCol).Top, _
            Cells(topRow, RightCol).Left - Cells(topRow, LeftCol).Left, Cells(BottomRow, RightCol).Top - Cells(topRow, RightCol).Top)
        shp.TextFrame2.TextRange.Text = Sheets(2).Range("a" & i)
        shp.TextFrame2.TextRange.Font.Size = 15
        If i = 9 Then i = i + 1
        shp.Fill.ForeColor.SchemeColor = i
    Next

 

① For ~ Next

For 문은 단순 For, For Each로 구분됩니다.

위 반복문에서는 i라는 변수를 이용해 1부터 21까지 1씩 증가하면서 반복하도록 했습니다.

 

21은 Sheets(3).cells(rows.count,1).End(xlUp).row입니다. 이렇게 하는 것이 프로그램의 유연성을 높이는 방법입니다.

 

② 사각형의 왼쪽, 위와 너비, 높이를 지정하기 위한 기초 값 구하기

        BottomRow = 작은값행(Sheets(3).Cells(i, 2).Value, eastRange)
        topRow = 작은값행(Sheets(3).Cells(i, 3).Value, eastRange)
        RightCol = 작은값열(Sheets(3).Cells(i, 4).Value, northRange) + 1
        LeftCol = 작은값열(Sheets(3).Cells(i, 5).Value, northRange) - 1

 

아래와 같이 좌표값은 동경과 북위 모두 왼쪽이 작은데,

 

좌표 위치는 동경은 아래가 작아서 동일한데,

북위는 오른쪽이 좌표 위치값이 작아서 헷갈립니다.

 

 

㉮ BottomRow 구하기 

BottomRow = 작은값행(Sheets(3).Cells(i, 2).Value, eastRange)

 

BottomRow는 작은값행이라는 함수를 이용하고, 

함수의 인수는 Sheets(3).Cells(i, 2).Value와 eastRange 변수 2개입니다.

 

㉯ 작은값행 구하기 함수

작은값행이라는 함수가 2번 쓰이기 때문에 함수로 만든 후 공통으로 사용할 수 있도록 한 것입니다.

Function 작은값행(longi_value, rngA)
    For Each c In rngA
        If longi_value > c.Value Then
            작은값행 = c.Row
            Exit For
        End If
    Next
End Function

 

Funciton 다음에 함수명이 나오고, 그 안에 인수명이 2개 있습니다.

longi_value는 동경 좌표값을 받는 변수이고,

rnaA는 동경 좌표값이 있는 Sheet4의 B열입니다.

 

For Each c In rngA
    ...
Next

 

 

rngA범위의 셀을 하나씩 움직이면서 반복문 안의 실행문을 반복 실행합니다.

        If longi_value > c.Value Then
            작은값행 = c.Row
            Exit For
        End If

 

longi_value 다시 말해 동경 좌표값이 rngA내 한 셀의 값보다 크면 조건문을 만족하므로 if문 안의 내용을 실행하고 아니면 반복문을 반복합니다.

 

좌표 값을 살펴보면 Sheet3의 B2셀의 값이 643,075로 고정이고,

c.Value는 Sheet4의 B3셀부터 아래로 내려가는데,

B3셀의 값이 690,000으로 조건문을 만족하지 못하므로

계속 내려가면서 비교하다가

c.Value값이 작아지는 643에서 멈춥니다.

 

㉰ 작은값열 구하기 함수

Function 작은값열(i, colName, rngA)
    For Each c In rngA
        If Sheets(3).Cells(i, colName) > c.Value Then
            작은값열 = c.Column
            Exit For
        End If
    Next
End Function

 

작은값행과 논리는 똑같습니다.

 

그러나, 북위의 경우 왼쪽이 큰 숫자이기 때문에 RightCol과 LeftCol도 +1 또는 -1을 해서 정확한 위치가 되도록 해야 합니다.

 

예를 들어 북위 689600의 경우 작은 값은 689000인데 +1을 하고 위치를 구해야 합니다.

LeftCol 줄에 중단점을 설정한 후 실행하고, RightCol위에 마우스 커서를 올려 놓으면 값을 알 수 있는데, 38입니다.

 

그런데 도형을 그릴 때 셀의 왼쪽을 기준으로 도형을 그리고, +1을 해야 하는 것입니다. 따라서, 689가 아니라 688이 구해지는 답이고, 그것이 38번째입니다. 

 

 

③ 직사각형 그리기

Set shp = ActiveSheet.Shapes.AddShape(msoShapeRectangle, Cells(topRow, LeftCol).Left, Cells(topRow, LeftCol).Top, _
      Cells(topRow, RightCol).Left - Cells(topRow, LeftCol).Left, Cells(BottomRow, RightCol).Top - Cells(topRow, RightCol).Top)

 

직사각형을 그릴 때 왼쪽, 위쪽, 너비, 높이 순으로  좌표를 지정하므로, 첫번째는 셀 주소의 Left이고, 두번째는 Top,

너비는 오른쪽 열의 Left부터 왼쪽 열의 Left를 빼서 구하며,

높이는 아래 행의 Top부터 위 행의 Top을 빼서 구합니다.

 

④ 도형에 글자 넣기

shp.TextFrame2.TextRange.Text = Sheets(3).Range("a" & i)
shp.TextFrame2.TextRange.Font.Size = 15

글자를 넣는데, Sheet 3의 A열 값을 넣고, 폰트 크기는 15로 지정합니다.

원래 코드는 Sheet2라고 되어 있는데, 일관성 차원에서 Sheet3로 고쳤습니다.

 

⑤ 도형 색 지정하기

If i = 9 Then i = i + 1
shp.Fill.ForeColor.SchemeColor = i

 

반복문의 i값을 이용하는데, i값이 9이면 흰색이기 때문에 도형을 구분하기 어려우므로 1을 더해서 다른 색이 되도록 했습니다.

 

⑥ 완성된 화면

아래와 같이 색깔별로 직사각형이 만들어지고, 왼쪽 위에 DWG 번호가 입력됩니다.

 

 

그런데 직사각형이 겹치는 부분이 있는데, 맞춰보면 맞습니다.

DWG 4(위 노란색)와 5(오란색 오른쪽 자주색)가 겹치는 것은 North가 680800이라 중복되는 것이고,

 

DWG 6과 10이 겹치는데, 동경이 

 

 

아래와 같이 동경은 558,600에서 568,600까지가 겹치고, 북위도 678,600에서 645,500까지가 겹칩니다.

 

(2) 도형 지우기

이 부분은 Sheet3을 지우는 것으로 되어 있던 것을 Sheet4를 지우는 것으로 바꾸고,

돌아올 때 Sheet2가 아니라 Sheet3로 돌아오도록만 수정했습니다.

반응형