EXCEL - VBA

엑셀의 표를 티스토리의 표로 변환하는 매크로(4) - 셀 병합2

별동산 2022. 10. 1. 09:38
반응형

1. 경우의 수 찾기

프로그램은 모든 경우의 수를 찾아서 그에 따른 처리를 해야 완벽한 프로그램이 됩니다. 하나라도 빠지면 불완전하고 이상한 결과를 낳게 되니 모든 경우의 수를 찾는 노력을 게을리 하면 안됩니다. 이것이 처리 로직을 짜는 것만큼 중요합니다.

엑셀 예제 표

위 표를 살펴보면 셀 병합이 된 경우도 있고, 안된 경우도 있고,

셀 병합도 가로 방향으로만 된 경우, 세로 방향으로만 된 경우, 두 방향 모두 셀 병합인 경우가 있습니다.

또한 글자도 굵은 글자가 있고, 보통 글자가 있고, 들여쓰기가 된 경우도 있고 아닌 경우도 있고,

데이터가 문자인 경우도 있고 숫자인 경우도 있습니다. 일반적으로 숫자는 천단위마다 콤마를 넣어서 표시합니다.

위와 같은 개별 요인들을 결합해서 모든 경우의 수를 도출하고 그에 따른 적당한 처리방법을 강구해야 합니다.

2. 프로그램

엑셀표변환(병합).xlsm
0.03MB


코드는 아래와 같습니다.

Option Explicit

Sub make_table2()
    '변수 선언
    Dim end_Row As Integer, end_Col As Integer, i As Integer, j As Integer, k As Integer
    Dim start_loc As Integer, end_loc As Integer
    
    ' 마지막 행과 열을 구함
    end_Row = Range("a1000").End(xlUp).Row

    For j = 2 To 100
        If InStr(Cells(end_Row, j), "<tr>") > 0 Then
            end_Col = j - 1
            Exit For
        End If
    Next
    
    If end_Col = 0 Then
        end_Col = Cells(end_Row, 100).End(xlToLeft).Column
    End If
    
    ' 기존 데이터 지움
    Range(Cells(1, end_Col + 1), Cells(end_Row, 100)).ClearContents
    
    ' 첫번째로 기록할 셀에 table, tbody 입력
    Cells(1, end_Col + 1) = "<table style='border-collapse: collapse; width: 100%;' border='1' data-ke-align='alignLeft'><tbody>"
    
    '1행부터 끝행까지 반복 처리
    For i = 1 To end_Row
        '1열부터 끝열까지 반복 처리
        For j = 1 To end_Col
        
            ' 셀에 데이터가 있는 경우
            If Len(Cells(i, j)) > 0 Then
                
            
                Select Case j
                    '첫 열인 경우
                    Case 1:
                    
                        ' 세로 방향, 가로 방향이 모두 병합된 경우
                        If Cells(i, j).MergeArea.Rows.Count > 1 And Cells(i, j).MergeArea.Columns.Count > 1 Then
                            '기존 값에 <tr> 넣고, <td 태그를 넣으면서, rowspan, colspan 값을 넣고, 처리 셀 값을 결합하고 td 태그 닫음
                            Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td rowspan=" & Cells(i, j).MergeArea.Rows.Count & _
                                " colspan=" & Cells(i, j).MergeArea.Columns.Count & ">" & Cells(i, j) & "</td>"
                                
                        ' 세로 방향만 셀 병합인 경우
                        ElseIf Cells(i, j).MergeArea.Rows.Count > 1 Then
                            '기존 값에 <tr> 넣고, <td 태그를 넣으면서, rowspan 값만 넣고, 처리 셀 값을 결합하고 td 태그 닫음
                            Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td rowspan=" & Cells(i, j).MergeArea.Rows.Count & ">" & Cells(i, j) & "</td>"
                            
                        ' 가로 방향만 셀 병합인 경우
                        ElseIf Cells(i, j).MergeArea.Columns.Count > 1 Then
                            '기존 값에 <tr> 넣고, <td 태그를 넣으면서, colspan 값만 넣고, 처리 셀 값을 결합하고 td 태그 닫음
                            Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td colspan=" & Cells(i, j).MergeArea.Columns.Count & ">" & Cells(i, j) & "</td>"
                            
                        ' 셀 병합이 아닌 경우
                        Else
                            '기존 값에 <tr> 연결하고, <td> 태그 열면서 처리 셀 값을 결합하고 td 태그 닫음
                            Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td>" & Cells(i, j) & "</td>"
                        End If
    
                    ' 끝 열인 경우
                    Case end_Col:
                        ' 끝열이 병합이면서 값이 있을 수는 없으므로 셀 병합 조건 없음
                        ' 기존 값에 결합하면서 td 태그를 열고 처리 셀값을 더한 다음 td태그와 tr태그를 닫음
                        ' 1행보다 큰 경우만 처리 셀 값이 숫자인 경우 천 단위마다 콤마를 넣음
                        Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<td>" & _
                            IIf(i > 1 And WorksheetFunction.IsNumber(Cells(i, j)), WorksheetFunction.Text(Cells(i, j), "#,##0"), Cells(i, j)) & "</td></tr>"
                            
                    ' 중간 열인 경우
                    Case Else:
                        ' 세로 방향, 가로 방향이 모두 병합된 경우
                        If Cells(i, j).MergeArea.Rows.Count > 1 And Cells(i, j).MergeArea.Columns.Count > 1 Then
                            ' 기존 값에 <tr> 넣고, <td 태그를 넣으면서, rowspan, colspan 값을 넣고, 처리 셀 값을 결합하고 td 태그 닫음
                            ' 1행보다 큰 경우만 처리 셀 값이 숫자인 경우 천 단위마다 콤마를 넣음
                            Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<td rowspan=" & Cells(i, j).MergeArea.Rows.Count & _
                                " colspan=" & Cells(i, j).MergeArea.Columns.Count & ">" & _
                                IIf(i > 1 And WorksheetFunction.IsNumber(Cells(i, j)), WorksheetFunction.Text(Cells(i, j), "#,##0"), Cells(i, j)) & "</td>"
                                
                        ' 세로 방향만 셀 병합인 경우
                        ElseIf Cells(i, j).MergeArea.Rows.Count > 1 Then
                            ' 기존 값에 <tr> 넣고, <td 태그를 넣으면서, rowspan 값만 넣고, 처리 셀 값을 결합하고 td 태그 닫음
                            ' 1행보다 큰 경우만 처리 셀 값이 숫자인 경우 천 단위마다 콤마를 넣음
                            Cells(i, end_Col + j) = "<td rowspan=" & Cells(i, j).MergeArea.Rows.Count & ">" & _
                                IIf(i > 1 And WorksheetFunction.IsNumber(Cells(i, j)), WorksheetFunction.Text(Cells(i, j), "#,##0"), Cells(i, j)) & "</td>"
                        
                        ' 가로 방향만 셀 병합인 경우
                        ElseIf Cells(i, j).MergeArea.Columns.Count > 1 Then
                            ' 기존 값에 <tr> 넣고, <td 태그를 넣으면서, colspan 값만 넣고, 처리 셀 값을 결합하고 td 태그 닫음
                            ' 1행보다 큰 경우만 처리 셀 값이 숫자인 경우 천 단위마다 콤마를 넣음
                            Cells(i, end_Col + j) = "<td colspan=" & Cells(i, j).MergeArea.Columns.Count & ">" & _
                                IIf(i > 1 And WorksheetFunction.IsNumber(Cells(i, j)), WorksheetFunction.Text(Cells(i, j), "#,##0"), Cells(i, j)) & "</td>"
                        
                        ' 셀 병합이 아닌 경우
                        Else
                            '기존 값에 결합하면서 <td> 태그 열면서 처리 셀 값을 결합하고 td 태그 닫음
                            ' 1행보다 큰 경우만 처리 셀 값이 숫자인 경우 천 단위마다 콤마를 넣음
                            Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<td>" & _
                                IIf(i > 1 And WorksheetFunction.IsNumber(Cells(i, j)), WorksheetFunction.Text(Cells(i, j), "#,##0"), Cells(i, j)) & "</td>"
                        End If
                End Select
            
            '셀에 데이터가 없는 경우
            Else
                Select Case j
                    '첫번째 열인 경우
                    Case 1:
                        '셀 병합이라면 <tr> 태그 추가
                        If Cells(i, j).MergeArea.Rows.Count > 1 Or Cells(i, j).MergeArea.Columns.Count > 1 Then
                            Cells(i, end_Col + j) = "<tr>"
                            
                        '셀 병합이 아니라면 <tr><td></td> 태그 추가
                        Else
                            Cells(i, end_Col + j) = "<tr><td></td>"
                        End If
                    
                    ' 끝 열인 경우
                    Case end_Col:
                        '셀 병합이라면 </tr> 태그 추가
                        If Cells(i, j).MergeArea.Rows.Count > 1 Or Cells(i, j).MergeArea.Columns.Count > 1 Then
                            Cells(i, end_Col + j) = "</tr>"
                            
                        '셀 병합이 아니라면 <td></td></tr> 태그 추가
                        Else
                            Cells(i, end_Col + j) = "<td></td></tr>"
                        End If
                        
                    '중간 열인 경우
                    Case Else:
                        '셀 병합이 아니라면 <td></td> 태그 추가
                        If Cells(i, j).MergeArea.Rows.Count = 1 And Cells(i, j).MergeArea.Columns.Count = 1 Then
                            Cells(i, end_Col + j) = "<td></td>"
                        End If
                End Select
            End If
            
            '가운데 정렬, 숫자인 경우 오른쪽 정렬
            If Cells(i, j).HorizontalAlignment = xlCenter Then
                Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), "<td", "<td style='text-align:center;' ")
            ElseIf WorksheetFunction.IsNumber(Cells(i, j)) Then
                Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), "<td", "<td style='text-align:right;' ")
'                Cells(i, end_Col + j).NumberFormat = "#,##0"
            End If
            
            ' 글자 굵게
            If Cells(i, j).Font.Bold = True Then
                start_loc = InStr(Cells(i, end_Col + j), ">")
                end_loc = InStr(start_loc, Cells(i, end_Col + j), "<")
                Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1), "<b>" & Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1) & "</b>")
            End If
            
            ' 들여쓰기
            If Cells(i, j).IndentLevel > 0 Then
                start_loc = InStr(Cells(i, end_Col + j), ">")
                end_loc = InStr(start_loc, Cells(i, end_Col + j), "<")
                Dim n_nbsp As String
                n_nbsp = ""
                For k = 1 To Cells(i, j).IndentLevel
                    n_nbsp = n_nbsp & "&nbsp;"
                Next
                Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1), n_nbsp & Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1))
            End If
                
        Next
    Next
    
    ' 마지막에 닫는 tbody와 table 태그 추가
    Cells(end_Row, end_Col + j - 1) = Cells(end_Row, end_Col + j - 1) & "</tbody></table>"
    
End Sub

3. 프로그램에 대한 설명

① 명시적으로 변수 선언

Option Explicit

변수 선언을 명시적으로 하라는 의미입니다. 변수의 형식이 숫자이거나 문자로 지정해야 문자인데 숫자가 들어오거나 할 경우 에러를 잡을 수 있습니다.

② 서브 프로시저의 형식

Sub make_table2()
코드
End Sub

sub 프로시져의 이름은 make_table2이고 괄호안에 아무 것도 없는 것은 인수가 없기 때문입니다. End Sub로 끝납니다. sub 입력하고 프로시저 이름을 입력한 다음 엔터키를 누르면 ()와 End Sub가 자동으로 입력됩니다.

③ 변수 선언 형식

'변수 선언
Dim end_Row As Integer, end_Col As Integer, i As Integer, j As Integer
Dim start_loc As Integer, end_loc As Integer

변수 선언 앞의 작은 따옴표(')는 주석 표시로서 코드에 대한 설명을 기록하거나 실행하지 않아야 할 코드 앞에 붙입니다.

변수는 dim 다음 변수명, 그리고 형식을 as 다음에 적습니다. integer은 정수로서 음수, 양수가 가능한데 -32,767부터 32,767까지입니다.

④ 처리할 대상의 마지막 행과 열을 구함

' 마지막 행과 열을 구함
end_Row = Range("a1000").End(xlUp).Row

For j = 2 To 100
If InStr(Cells(end_Row, j), "<tr>") > 0 Then
end_Col = j - 1
Exit For
End If
Next
If end_Col = 0 Then
end_Col = Cells(end_Row, 100).End(xlToLeft).Column
End If

표 안의 데이터를 처리하는 것이므로 마지막 행과 열을 알아야 합니다.

마지막 행인 end_Row는 a1000셀에서 위로 올라와서 멈추는[End(xlUp)] 셀의 행 수(row)입니다.

마지막 열인 end_Col은 아래와 같이 오른쪽에 HTML 태그가 작성되기 때문에 좀 복잡하게 구했습니다.

표의 끝 열 구하기


먼저 tr 태그의 위치를 for 반복문과 inStr함수를 이용해서
InStr(Cells(end_Row, j), "")이 0보다 크다면 tr 태그가 있는 것이므로 j+1을 end_Col로 하고,
0일 경우, 다시 말해 tr 태그가 없을 경우는 마지막 행 100번째 열에서 왼쪽으로 와서 걸리는[End(xlToLeft)] 열의 수(Column)가 end_Col이 됩니다.

cells함수는 행과 열을 이용해서 셀을 지정합니다. 다시 말해 cells(3,2)라면 3행 2열이므로 B3셀이 됩니다.

⑤ 기존 데이터 지움

' 기존 데이터 지움
Range(Cells(1, end_Col + 1), Cells(end_Row, 100)).ClearContents

HTML 코드가 있는 범위, 끝열 다음 1행부터 마지막 행 100열까지 지웁니다.

⑥ HTML 코드 작성

ⓐ table, tbody 태그 엶

' 첫번째로 기록할 셀에 table, tbody 입력
Cells(1, end_Col + 1) = "<table style='border-collapse: collapse; width: 100%;' border='1' data-ke-align='alignLeft'><tbody>"

HTML 태그로 표를 만들기 위해 table을 이용하는데
border-collapse: collapse; 중첩되지 않게 하고,
width: 100%; 너비는 100%,
border='1' 경계선은 실선으로 그리고,
data-ke-align='alignLeft' 왼쪽 정렬합니다.
그리고, tbody를 엽니다.

ⓑ for 반복문

'1행부터 끝행까지 반복 처리
For i = 1 To end_Row
'1열부터 끝열까지 반복 처리
For j = 1 To end_Col
실행문
Next
Next

For 문은 변수의 시작값과 종료값을 지정해서 시작값에서 종료값까지 1씩 증가하면서 처리합니다. 증가값을 지정하려면 step 2 식으로 지정합니다.

For 문의 Next로 끝나고 그 안에 실행문을 넣습니다.
위 코드는 for 반복문을 이중으로 사용한 것으로 i가 변하는 동안 j도 변하면서 처리됩니다.
i가 1일 때 j가 1부터 end_Col까지 변하면서 처리되고, i가 1이 증가한 2가 되면 다시 j가 1부터 end_Col까지 변하면서 처리됩니다.

ⓒ if 조건문

' 셀에 데이터가 있는 경우
If Len(Cells(i, j)) > 0 Then
실행문1
else
실행문2
end if

If 조건문으로 Len(Cells(i, j)) > 0, 셀에 데이터가 있는 경우와 없는 경우를 나눠서 처리합니다.

ⓓ select case 조건문

Select Case j
'첫 열인 경우
Case 1:
실행문1
  ' 끝 열인 경우
    Case end_Col:
      실행문2
  ' 중간 열인 경우
    Case Else:
      실행문3
End Select

Select문도 if문과 비슷하게 조건에 따라 처리하는 것인데,
case j로 j값에 따라서 처리를 합니다.
위 코드의 경우는 j가 1, 첫 열인경우, end_Col, 끝 열인 경우, Else, 중간 열인 경우로 나눠서 처리하고 있습니다.

[여기서부터는 1열일 경우의 처리]

' 세로 방향, 가로 방향이 모두 병합된 경우
If Cells(i, j).MergeArea.Rows.Count > 1 And Cells(i, j).MergeArea.Columns.Count > 1 Then
'기존 값에 <tr> 넣고, <td 태그를 넣으면서, rowspan, colspan 값을 넣고, 처리 셀 값을 결합하고 td 태그 닫음
Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td rowspan=" & Cells(i, j).MergeArea.Rows.Count & _
" colspan=" & Cells(i, j).MergeArea.Columns.Count & ">" & Cells(i, j) & "</td>"

셀 병합 여부 등을 판단하는 것은 https://lsw3210.tistory.com/153 글을 참고 바랍니다.

첫 열이므로 tr 태그를 넣고,
세로, 가로 모두 셀 병합된 경우는 td 태그 안에 rowspan과 colspan을 넣는데, rowspan 값은 Cells(i, j).MergeArea.Rows.Count로 구하고, colspan값은 Cells(i, j).MergeArea.Columns.Count로 구합니다.

또한 위에서 table 태그를 삽입했기 때문에 기존 데이터인 Cells(i, end_Col + j)와 결합(&)합니다.

코드가 길 경우는 _ 표시를 줄 뒤에 추가한 다음 다음 줄에 입력하면 한 줄로 인식됩니다.

' 세로 방향만 셀 병합인 경우
If Cells(i, j).MergeArea.Rows.Count > 1 Then
'기존 값에 <tr> 넣고, <td 태그를 넣으면서, rowspan, colspan 값을 넣고, 처리 셀 값을 결합하고 td 태그 닫음
Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td rowspan=" & Cells(i, j).MergeArea.Rows.Count & ">" & Cells(i, j) & "</td>"

세로 방향만 셀 병합이라면 위 코드에서 colspan 부분만 빼면 됩니다.

' 가로 방향만 셀 병합인 경우
ElseIf Cells(i, j).MergeArea.Columns.Count > 1 Then
'기존 값에 <tr> 넣고, <td 태그를 넣으면서, colspan 값만 넣고, 처리 셀 값을 결합하고 td 태그 닫음
Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td colspan=" & Cells(i, j).MergeArea.Columns.Count & ">" & Cells(i, j) & "</td>"

가로 방향만 셀 병합이라면 colspan 부분만 넣으면 됩니다.

' 셀 병합이 아닌 경우
Else
'기존 값에 <tr> 연결하고, <td> 태그 열면서 처리 셀 값을 결합하고 td 태그 닫음
Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<tr><td>" & Cells(i, j) & "</td>"
End If

셀 병합이 아닌 경우는 단순히 tr과 td 태그 사이에 처리 셀의 값만 넣으면 됩니다.
기존에 입력된 값과 결합하는 것은 같습니다.

[여기서부터는 표의 끝 열일 경우의 처리]

' 끝 열인 경우
Case end_Col:
' 끝열이 병합이면서 값이 있을 수는 없으므로 셀 병합 조건 없음
  ' 기존 값에 결합하면서 td 태그를 열고 처리 셀값을 더한 다음 td태그와 tr태그를 닫음
  ' 1행보다 큰 경우만 처리 셀 값이 숫자인 경우 천 단위마다 콤마를 넣음
  Cells(i, end_Col + j) = Cells(i, end_Col + j) & "<td>" & _
    IIf(i > 1 And WorksheetFunction.IsNumber(Cells(i, j)), WorksheetFunction.Text(Cells(i, j), "#,##0"), Cells(i, j)) & "</td></tr>"

끝 열인 경우 td 태그 안에 처리 셀값을 넣는 것을 같고 tr 태그를 닫아 한 줄을 마무리 합니다.

iif 함수는 VBA에서 사용하는 IF 함수로 if문과 구분하기 위해 i를 앞에 붙였습니다.
따라서, iif함수의 입력 방식은 iif(조건, 참일 경우 값, 거짓일 경우 값)으로 if함수와 동일합니다.

조건이 i > 1 And WorksheetFunction.IsNumber(Cells(i, j))인데, 처리 행 i가 1보다 크고, 처리 셀 값이 숫자일 경우란 의미입니다. 다시 말해 1행일 경우는 숫자이더라도 거짓이 됩니다.

WorksheetFunction.Text(Cells(i, j), "#,##0") : Text 함수가 VBA에 없기 때문에 워크시트의 함수인 Text를 사용해야 하며 이 때는 WorksheetFunction을 앞에 붙입니다.

Text(숫자, 숫자 형식)인데, 숫자 형식을 천단위마다 콤마를 넣고 0일 경우에도 0을 표시하도록 한 것입니다.

이하 If문안의 실행문은 위와 비슷하므로 설명을 생략하겠습니다.

ⓔ 가운데 정렬, 오른쪽 정렬

' 처리 셀이 가운데 정렬인 경우 가운데 정렬, 숫자인 경우는 오른쪽 정렬
If Cells(i, j).HorizontalAlignment = xlCenter Then
Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), "<td", "<td style='text-align:center;' ")
ElseIf WorksheetFunction.IsNumber(Cells(i, j)) Then
Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), "<td", "<td style='text-align:right;' ")
End If

처리 셀이 가운데 정렬(맞춤)이라면 HTML 코드에도 가운데 정렬에 해당하는 style='text-align:center;' "를 넣는데 substitute(대체) 함수를 이용해서 기존의 <td 를 <td style='text-align:center;' 로 바꾸도록 했습니다.

또한 숫자인 경우에는 정렬은 안되어 있더라도

숫자가 정렬(맞춤)되어 있지 않음, 그러나 숫자는 기본값이 오른쪽 정렬

오른쪽 정렬하도록 했습니다.

ⓕ 처리 셀이 굵은 글자일 경우 글자 굵게

' 글자 굵게
If Cells(i, j).Font.Bold = True Then
start_loc = InStr(Cells(i, end_Col + j), ">")
  end_loc = InStr(start_loc, Cells(i, end_Col + j), "<")
  Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1), "<b>" & Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1) & "</b>")
End If

글자 굵기가 참인 경우

처리된 셀의 값이 <td style='text-align:center;' >금액</td>이므로
>의 위치를 찾아 start_loc 변수에 대입하고,
start_loc 부터 <의 위치를 찾아 end_loc에 대입한 다음
mid함수를 이용해 >와 < 사이에 있는 문자, 위에서는 금액을 찾습니다.

그리고,substitue 함수를 이용해 앞뒤에 <b>와 </b>를 붙여서 글자를 굵게 만듭니다.

ⓖ 처리 셀이 들여쓰기된 경우 들여쓰기

' 들여쓰기
If Cells(i, j).IndentLevel > 0 Then
start_loc = InStr(Cells(i, end_Col + j), ">")
  end_loc = InStr(start_loc, Cells(i, end_Col + j), "<")
n_nbsp = ""
For k = 1 To Cells(i, j).IndentLevel
n_nbsp = n_nbsp & "&nbsp;"
Next
  Cells(i, end_Col + j) = WorksheetFunction.Substitute(Cells(i, end_Col + j), Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1), n_nbsp & Mid(Cells(i, end_Col + j), start_loc + 1, end_loc - start_loc - 1))
End If

들여쓰기가 된 경우는 indentLevel이 0보다 큰지 여부로 판단합니다.

마찬가지로 >와 <의 위치를 찾아 그 사이의 문자 앞에 &nbsp;, 공백을 indent_level만큼 삽입합니다.

ⓗ tbody, table 태그 닫음

' 마지막에 닫는 tbody와 table 태그 추가
Cells(end_Row, end_Col + j - 1) = Cells(end_Row, end_Col + j - 1) & "</tbody></table>"

4. 프로그램 실행

위 코드를 개발도구 - 매크로 명령을 누른 후

개발도구 매크로 명령


매크로 이름 목록에서 make_table2를 더블 클릭하거나 클릭하고 실행 버튼을 눌러 실행하면

매크로 실행


아래와 같이 왼쪽 표 오른쪽에 HTML 코드가 생성됩니다. G1셀부터 L12셀까지 마우스로 끌어서 범위를 선택하고 홈 탭에서 복사 명령을 누릅니다.

엑셀 표를 HTML 코드로 변환한 화면


그리고, 본 화면 윗 부분에 있는 기본모드를 누른 다음 HTML을 선택합니다.

티스토리의 기본 모드와 HTML 모드간 전환


그리고, 맨 아래 줄에 붙여 넣으면 아래와 같이 되는데,

티스토리 HTML 코드


위 HTML을 누른 후 다시 기본모드를 눌러 본 화면으로 돌아오면 아래와 같이 엑셀 표가 삽입된 것을 알 수 있습니다.

구분 2021 2022
수량 금액 수량 금액
전체 3,807 1,903,500 3,865 1,932,500
서울 소계 2,392 1,196,000 2,555 1,277,500
강남 617 308,500 650 325,000
강동 458 229,000 335 167,500
강서 783 391,500 967 483,500
강북 534 267,000 603 301,500
경기 소계 638 319,000 803 401,500
수원 275 137,500 668 334,000
의정부 312 156,000 642 321,000
제주도   777 388,500 507 253,500
반응형