2017-12-03 10 views
0

내 문서에서 "Small"이라는 테이블 스타일이 있습니다.중첩 테이블에 서식 적용

Sub FormatTables() 
    Dim t As Table 
    For Each t In ActiveDocument.Tables 
     If t.Style = "Small" Then 
      t.Range.Font.Size = 8 
     End If 
    Next 
End Sub 

문제는이다, 그것은 중첩 된 테이블에 대해 작동하지 않습니다 : 그리고 여기이 스타일의 각 테이블에있는 글꼴 크기를 변경합니다 매크로이다. 아래 그림에서 검은 색 테이블은 "Normal"이고 파란색 테이블은 "Small"입니다. 그것은 어떻게 고칠 수 있 었는가?

enter image description here

+3

't.Range.Tables.Count'를 검사하면't'에 중첩 된 테이블이 들어 있는지 알 수 있습니다. 그런 다음 반복 할 수 있습니다. –

+0

@TimWilliams 글쎄, 예를 들어 [ this] (https://stackoverflow.com/questions/12105718/how-to-access-a-table-within-a-range-nested-in-another-table)하지만 현재 어떻게 될 수 있는지 이해할 수 없습니다. 내 경우 적응 ... –

+0

@ TimWilliams 여기 내 세미 작업 버전 (https://jsfiddle.net/n5b00mod/)입니다. 그러나 중첩 된 테이블의 첫 번째 수준에서만 작동합니다. 예를 들어, 테이블 정상, 첫 번째 안쪽에 두 번째 테이블 정상 및 다음 테이블 두 번째 보통 내 작은 경우이 작은 테이블 서식이 없습니다. 내가 이해하는 바와 같이, 여기에'Do While ... Loop'을 사용해야하지만 정확히 어떻게해야하는지 이해할 수 없습니다. –

답변

1

이것은 모든 테이블, 임의의 깊이로 내포 심지어 테이블을 처리한다.

Sub FormatTables() 

    Dim t As Table, col As New Collection 
    Dim n As Table 

    'add all top-level table(s) to collection 
    For Each t In ActiveDocument.Tables 
     col.Add t 
    Next 

    'process each table from the collection 
    Do While col.Count > 0 
     Set t = col(1) '<< reference the first table from the collection 
     col.Remove 1 '<< remove it from collection 
     Debug.Print "Table has " & t.Rows.Count & " rows", t.Style 

     If t.Style = "Small" Then t.Range.Font.Size = 8 

     'gather any nested table(s) for checking 
     For Each n In t.Tables 
      col.Add n 
     Next n 
    Loop 

End Sub 
+0

대단히 감사합니다. 나는이 문제를 하루 종일 풀려고했다. –

1

비슷한 질문이 있습니다. 나는 이것을 게시하기 전에 많은 연구를했다.

Sub testtest() 

Dim aRange As Range 

MsgBox ThisDocument.Tables.Count 
For Each oTable In ThisDocument.Tables 
    For Each oCell In oTable.Range.Cells 
     Set aRange = oCell.Range 
     aRange.MoveEnd Count:=-2 
     aRange.Select 
     MsgBox aRange.Tables.Count 
     MsgBox oCell.Tables.Count 
    Next oCell 
Next oTable 



End Sub 

Explaination : 나는 다음과 같은 코드로 또 다른 테이블 중 하나를 중첩 된 두 개의 작은 테이블을 삽입하고, 시험, 빈 문서를 만든 첫째,에 의해 셀의 범위의 끝을 이동하는 이유 -1 그리고 그 후에 -2까지 셀의 끝에서 모호한 Chr(13)Chr(7)을 제외하는 것입니다. 위의 테스트를 통해 이제 aRange.Tables.Count은 테이블이 셀에 중첩되어 있지 않은 경우에도 항상 1 (그리고 절대로 0) 인 것으로 나타났습니다. MsgBox을 통해 oCell.Tables.Count을 검사 할 때까지 나는 당황했습니다. - oTable.TablesoTable.Range.Tables의 차이점은 비슷합니다. - 중첩 테이블이 상위 Table에 중첩되어 상위 레벨 Cell에 중첩되지만 테이블 또는 셀의 Range에는 중첩되지 않습니다.

따라서 선택한 답변은 Collection (vba에 고유 한 것으로, 나는 어딘가에서 읽음을 기억하는 것 같습니다)을 활용하는 환상적인 방법을 제공하며 문제를 해결하기 위해 노력하지만, 문제의 "경첩"또는 "요령"을 지적하지 않았습니다. 다시 한번 말하지만, "knack"은 oTable.Tables을 사용하지만 중첩 된 테이블을 "catch"할 수 있지만 oTable.Range.Tables은 사용할 수 없다는 것입니다. 비교에서는 oTable.Range.Cells을 사용하는 테이블의 셀을 "catch"할 수 있지만 oTable.Cells은 사용할 수 없습니다.