2017-12-03 346 views
0

在我的文檔中,我有稱爲「小」的表格樣式。這裏是宏,這將在這種風格的每個表改變字體大小:爲嵌套表格應用格式

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 

的問題是,它不會對嵌套表工作。如下圖所示,黑色表格爲「正常」,藍色表格爲「小型」。它如何被修復?

enter image description here

+3

檢查(例如)'t.Range.Tables.Count'會告訴你't'是否包含任何嵌套表:然後你可以循環這些... –

+0

@TimWilliams嗯,我試過了,例如[類似的東西這](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 

闡釋:首先,我通過移動細胞的範圍的端部的原因-1,之後減去-2是爲了排除單元格末尾可疑的Chr(13)Chr(7)。這就解釋了,現在通過上面的測試,我發現aRange.Tables.Count總是1(並且從不爲0),即使沒有表嵌套在單元格中。直到我通過MsgBox檢查了oCell.Tables.Count之後,我才感到困惑。 - oTable.TablesoTable.Range.Tables的區別類似。 - 嵌套表嵌套到父代Table,它嵌套到上層Cell,但不嵌套到表格或單元的Range

因此,我認爲所選答案的確利用了Collection(這對vba來說是獨一無二的,我似乎記得在某處閱讀),並且確實可以解決這個問題,但它有沒有指出問題的「鉸鏈」或「訣竅」。再一次,「訣竅」是你可以使用oTable.Tables而不是oTable.Range.Tables「捕捉」嵌套表格;相比之下,您可以使用oTable.Range.Cells而不是oTable.Cells來「捕捉」表格中的單元格。