2012-11-28 125 views
1

嘗試確定Word文檔中每個表的總寬度。第一次迭代後,腳本掛起並且Microsoft Word停止響應。VBA循環在第一次迭代後凍結/崩潰

Sub fixTableAlignment() 
    For Each tTable In ActiveDocument.Tables 
     Dim tRng As Range 
     Dim sngWdth As Single 
     Set tRng = tTable.Cell(1, 1).Range 
     sngWdth = -tRng.Information(wdHorizontalPositionRelativeToPage) 
     Do While tRng.Cells(1).RowIndex = 1 
     tRng.Move unit:=wdCell, Count:=1 
     Loop 
     tRng.MoveEnd wdCharacter, -1 
     sngWdth = sngWdth + tRng.Information(wdHorizontalPositionRelativeToPage) 
     MsgBox PointsToInches(sngWdth) 
    Next tTable 
    End Sub 
+3

您是否嘗試過單步執行帶有'F8'的代碼? – SeanC

+0

如果將兩個'Dim'語句移動到'For Each'語句之上,它有幫助嗎?通過我的測試不會造成問題,但沒有理由繼續重新聲明它們。 –

+0

肖恩,我不幸需要它在一次運行中工作。 Doug,我有:/你是說這個腳本對你來說行得通嗎? 非常感謝您的回覆! –

回答

2

所提供的代碼不適用於由單個行組成的表。這Do While循環:

Do While tRng.Cells(1).RowIndex = 1 
    tRng.Move unit:=wdCell, Count:=1 
Loop 

,跳出一旦我們找到了小區這不是第1行中如果只有單排,然後每一個細胞都在第1行

Move方法返回0如果此舉失敗所以這應該工作:

Dim lngSuccess As Long 

For Each ttable In ThisDocument.Tables 
    Set tRng = ttable.Cell(1, 1).Range 
    sngWdth = -tRng.Information(wdHorizontalPositionRelativeToPage) 

    ' Any non-zero value will do here 
    lngSuccess = 1 
    Do While tRng.Cells(1).RowIndex = 1 And lngSuccess <> 0 
    lngSuccess = tRng.Move(unit:=wdCell, Count:=1) 
    Loop 

    tRng.MoveEnd wdCharacter, -1 
    sngWdth = sngWdth + tRng.Information(wdHorizontalPositionRelativeToPage) 
    MsgBox PointsToInches(sngWdth) 
Next tTable 

另外值得注意的是:tTable沒有在原來的代碼中聲明的宣佈,它的方法(和使用Option Explicit,如果沒有這樣做)。導致錯誤的代碼的一部分可能已經找到了按<Ctrl>-<Break>當Word停止響應 - 這將導致你直接到While循環


編輯處理上的單行表不正確寬度:

這個新版本使用Cell.Width屬性來衡量表的寬度。我找不到使用Range.Information來測量單排表格寬度的可靠方法

Option Explicit 

Sub fixTableAlignment() 
    Dim tTable As Table 
    Dim cCell As Cell 
    Dim sngWdth As Single 
    Dim bFinished As Boolean 

    For Each tTable In ThisDocument.Tables 
     Set cCell = tTable.Cell(1, 1) 
     sngWdth = 0 

     ' Can't just check the row index as cCell 
     ' will be Nothing when we run out of cells 
     ' in a single-row table. Can't check for 
     ' Nothing and also check the row index in 
     ' the Do statement as VBA doesn't short-circuit 
     bFinished = False 
     Do Until bFinished 
      sngWdth = sngWdth + cCell.Width 
      Set cCell = cCell.Next 

      If (cCell Is Nothing) Then 
       bFinished = True 
      ElseIf (cCell.RowIndex <> 1) Then 
       bFinished = True 
      End If 
     Loop 

     MsgBox PointsToInches(sngWdth) 
    Next tTable 
End Sub 
+0

+1:很好地發現 – SeanC

+0

這太棒了!謝謝你barrowc。我還有最後一個問題..那個腳本在只有1行的表上拋出一個錯誤 - 我對VBA很新,怎麼處理Do While語句的這個異常? 「收集的請求成員不存在。」 –

+0

我在發佈答案之前在單行表上對其進行了測試。它在Word 2003中運行正常。我已經對它再次進行了測試,並且不會產生錯誤。但是,它會報告單行表格錯誤的長度,因爲它會移回倒數第二個單元格。我將編輯我的答案來糾正這個問題 – barrowc