2017-01-19 42 views
2

我試圖從Excel自動化PowerPoint。一切正常。我有以下代碼塊,完美工作:變量未定義錯誤Enigma

Set MyTextbox = mySlide.Shapes.AddTextbox(1, Left:=myShape.Left - 3, Top:=42, Width:=myShape.Width + 6, Height:=10).TextFrame.TextRange 
With MyTextbox 
    .Text = Format(MyShapeDate, "m/yy") 
    .Font.Size = 11 
    .ParagraphFormat.Alignment = ppAlignCenter 
    .Font.Bold = True 
End With 

我將代碼保存爲插件,並試圖添加一個新的選項卡和按鈕,失敗。於是我將代碼帶回工作簿。當我試圖再次運行它時,我得到一個未定義爲ppAlignCenter的變量。有人會知道爲什麼會發生這種情況,或者它是一個常見的錯誤嗎?

+1

'ppAlignCenter'聽起來像一個PowerPoint常量。你是否還有所有必要的參考資料? – YowE3K

+0

這是一個PowerPoint常量,我正在使用後期綁定。但它運作完美無數次。 – Brian

+3

如果你使用後期綁定,'ppAlignCenter'是沒有意義的,除非你給它一個值。 – vacip

回答

8

It is a PowerPoint constant and I am using late binding. But it worked perfectly numerous times.

然後你後期綁定。把你自己放在VBA的鞋子裏:你正在編譯這個項目,並且你遇到了ppAlignCenter作爲令牌/標識符。如果Option Explicit已打開(它應爲!),並且未引用PowerPoint對象庫,則ppAlignCenter是未聲明的變量,您不知道該如何處理它 - 因此您將手放在空中和尖叫的用戶:

Compile error: variable not defined.

如果Option Explicit未打開,和PowerPoint不被引用,那麼你就「聲明」未初始化變量Variant在現場,名爲ppAlignCenter,這樣的分配可以編譯MyTextBox.ParagraphFormat.Alignment

由於變量沒有初始化,在運行時將其值只是0 - 並從那裏目前還不清楚會發生什麼,因爲PpParagraphAlignment擁有的0值沒有成員,因此它可能是MyTextBox.ParagraphFormat.Alignment分配提出了一個運行時錯誤,但這完全取決於Alignment屬性的實現。

現在,如果PowerPoint演示庫引用(早期綁定),然後ppAlignCenter解析爲您知道是真的只是一個2,所以你可以繼續編譯PpParagraphAlignment.ppAlignCenter枚舉值。


PpParagraphAlignment枚舉以PowerPoint類型庫中定義,因此,如果您後期綁定到庫中,你不能按名稱引用它的成員,因爲VBA將嘗試在編譯期解決這些問題時間 - 並沒有這樣做。

因此,不是這樣的:

.ParagraphFormat.Alignment = ppAlignCenter 

你需要這樣做:

.ParagraphFormat.Alignment = 2 'ppAlignCenter 

那你爲什麼後期綁定到一個類型庫,你知道你需要無論如何,該方案甚至希望在運行時工作?

後期綁定意味着你與Object變量而不是特定類型的工作 - 這意味着運行時的界面查找和相當多的開銷,你並不需要在所有 ...而這些查找會如果圖書館不在場,反正會失敗。更何況,編程對Object意味着你不會得到智能感知並需要四重檢查你正在做的一切,因爲編譯器不會幫助你,如果你犯了一個錯字,運行時會尖叫。

......說,早期綁定引用是特定於版本的 - 因此,如果您要將代碼分發給運行不同版本庫的用戶,那麼遲到綁定將確保一切適用於所有人(前提是您的代碼不使用特定於版本的API功能)。在這種情況下,最好的折衷辦法是讓開發以及早期綁定的引用(因此您可以獲得智能感知和自動完成!),然後在分發時將所有內容切換到遲到。

+0

優秀的解釋!不斷學習。使總體感覺和解決我的問題。謝謝! – Brian

+0

RE上一段:如果您在所有用戶運行不同版本的PowerPoint的環境中使用宏,那麼分發一個晚期版本的宏將確保一切適用於所有人;早期引用是特定於版本的。 –

+0

很好的解釋,@ Mat'sMug ...我也喜歡它,但是如果你編輯的答案包含有關遲到綁定的信息,請參閱你的評論和版本特異性。謝謝! –