2014-09-01 19 views
3

這是我第一次嘗試爲Word編寫VBA腳本(我是一名前程序員,擁有合理的自學成功能力Excel VBA)。我使用Word 2013(15.0.4641.1001 64位)和VBA 7.1 .142。當使用「步入」或「運行」啓動Word VBA腳本時,其行爲會有所不同

我想執行一個簡單的任務,即在當前光標位置(本身可以在另一個表內)創建一個兩列表。我希望表格是可用寬度的100%,然後我想修正第一列的寬度。本質上,我的代碼做我想做的事(對於第一次嘗試,我對它很滿意),但它不穩定。

問題與寬度有關。如果我將光標定位並「插入」宏,它通常(90%+的時間)做我想要的。如果我「運行」它,它永遠不會正常工作。

我的代碼如下。它應該做的是這樣的: -

  1. 創建一個表5行x 2列,即它的位置的全部寬度。
  2. 將第一列設爲固定寬度(接受簡短的固定格式字符串)
  3. 按順序爲每行編號並右對齊文本。
  4. 將第2列分爲兩行,每個原始行。

問題與行動「2」,其他工作正常。

  • 如果表是全文檔寬度,行動「2」,在「走進」似乎總是正常工作,但是
  • 當它是「運行」,行動「2」始終使失敗第一列50%寬。
  • 如果我手動創建1行×2列的表格,然後「步入」宏在其兩個單元以創建一個子表:
    • 動作「2」爲第一子 - 表工作正常,但
    • 對於第二個子表,操作「2」通常將第一列設置爲50%而不是固定寬度
    • 有時,操作「2」將整個子表設置爲50%其父區的寬度,並將其列設置爲其自身寬度的50%

有一兩件事我注意到的是,在執行時,該命令

 .Columns(1).PreferredWidth = 15 

似乎採取noticably長於其他命令。

正如我所說,這是我的第一次努力,我還不知道是否已經忽略了某個參數。

如果有人能解釋我要出錯的地方以及如何解決問題,我將不勝感激。

乾杯

巴茲

這裏是我的代碼。

Sub CreateTable() 
AddRows = 5 
Set NewTable = ActiveDocument.Tables.Add(Selection.Range, AddRows, 2) 
With NewTable 
'Display cell borders 
    If .Style <> "Table Grid" Then 
     .Style = "Table Grid" 
    End If 
'Make table 100% wide 
    .PreferredWidthType = wdPreferredWidthPercent 
    .PreferredWidth = 100 
'Make column 1 narrow 
    .PreferredWidthType = wdPreferredWidthPoints 
    .Columns(1).PreferredWidth = 15 
    .AutoFitBehavior (wdAutoFitFixed) 
'Number each row 
    For a = 1 To AddRows 
     .Cell(a, 1).Range.InsertAfter a & ")" 
     .Cell(a, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphRight 
    Next a 
'Split column 2 
    For a = 1 To (AddRows * 2) - 1 Step 2 
     .Cell(a, 2).Split NumRows:=2, NumColumns:=1 
    Next a 
End With 
End Sub 

回答

1

由於我還在學習,我還不完全瞭解Word VBA以充分理解爲什麼一種方法有效,另一種方法沒有,但下面是一個簡化版本的代碼。

Sub MakeTable() 
ActiveDocument.Tables.Add Range:=Selection.Range, NumRows:=5, NumColumns:=2, _ 
    DefaultTableBehavior:=wdWord9TableBehavior, AutoFitBehavior:=wdAutoFitWindow 
Selection.Tables(1).Columns(1).PreferredWidthType = wdPreferredWidthPoints 
Selection.Tables(1).Columns(1).PreferredWidth = CentimetersToPoints(1) 
'Number each row 
For a = 1 To AddRows 
    Selection.Tables(1).Cell(a, 1).Range.InsertAfter a & ")" 
    Selection.Tables(1).Cell(a, 1).Range.ParagraphFormat.Alignment = wdAlignParagraphRight 
Next a 
'Split column 2 
For a = 1 To (AddRows * 2) - 1 Step 2 
    Selection.Tables(1).Cell(a, 2).Split NumRows:=2, NumColumns:=1 
Next a 
End Sub 
+0

太棒了!我建議你繼續並「Aceept」這個答案。我相信你現在有足夠的代表在SO上進行聊天,這對於這個級別的問題解決可能有幫助。 – Smandoli 2014-09-23 15:37:59

1
  1. 確保Option Explicit是在每一個模塊的頂部和代碼編譯(你的經驗prolly已經引導你對這個)。
  2. 開始臨時評論行動,目標是進一步隔離問題。我很好奇,如果.AutoFitBehavior是一個問題。
  3. 插入DoEvents以幫助清除所有這些小內部緩衝區。當你逐步瀏覽代碼時,事件總是在做着;可能不是在運行時。
+0

感謝您的回覆Smandoli。我試過你的建議,但無濟於事。選項顯式是活動的,刪除了自動調整行,並且因爲它是一個簡短的例程,所以在每個可能的地方嘗試了DoEvents。 我發現的一件事是,如果我在命令 .Columns(1).PreferredWidth = 15 之後放置了一個斷點,表格格式正確。 執行此命令時有明顯的延遲。就好像它在後臺執行了數百萬次的迭代,這可能是問題的原因。 – 2014-09-14 20:39:58

+0

好的工作。儘管VBA默認是同步的,並且幾乎不會出現任何異常情況,但一定有某種競爭條件。也許你可以通過某種方式來完成這些步驟,調整順序? – Smandoli 2014-09-15 02:29:53

+0

嗨,再次Smandoli 我完全重新編寫我的腳本,現在它做我想要的。然而,我遇到了另一個問題,我可能會作爲一個單獨的問題提出問題,但也許你可以提供幫助。 – 2014-09-23 14:45:44