設計階段的 Visual Studio 疑難排解
更新:2007 年 11 月
當您使用 Visual Studio Tools for Office 開發方案時,可能會遇到以下問題。
儲存方案後執行會引發錯誤
Visual Studio 在方案儲存之前,會先將這些方案放在暫存資料夾中。Visual Studio Tools for Office 會自動變更您的安全性原則,以信任放在暫存位置的方案。這些變更是在建置 (Build) 方案時進行。如果您將方案儲存到永久資料夾之前並未進行任何變更,那麼當您從新位置再次執行方案時,Visual Studio 就不會建置該方案。因此,在新位置的方案不會自動受到信任,而且也不會執行。
如果將新方案儲存到永久位置之後發生錯誤,請開啟 [建置] 功能表,然後按一下 [重建方案]。這樣即使您未對方案進行任何變更,Visual Studio 也會建置方案。Visual Studio Tools for Office 接著就會適當變更新位置的安全性原則。
無法建立以含有限制權限之文件為基礎的文件層級專案
如果文件具有限制權限,Visual Studio Tools for Office 就無法建置文件層級專案。如果專案包含具有限制權限的文件,則不會編譯專案,而您會在 [錯誤清單] 視窗中接收下列訊息:
無法加入自訂。
如果您想加入具有限制權限的文件,則在開發和建置方案時請使用無限制的文件。然後,在您發行方案之後,將限制權限套用至位於發行位置的文件。
當使用 C# 時某些事件沒有引發
在 Office 主要 Interop 組件中,含有同名方法與事件的 Office 物件分成了兩個物件:一個是包含所有屬性於方法的核心物件,另一個是事件物件,其中包含了名稱與屬性或方法相衝突的事件。這些事件物件會使用命名慣例 <objectname>_Event。如果您沒有看見所需的事件,請轉換成 <objectname>_Event 介面。
例如,Workbook 有 ActivateEvent 事件和 Activate 方法。若要處理這個事件,請使用 WorkbookEvents_Event 取代 Workbook。
在宣告區段中建立成員變數:
private Excel.Workbook wkbk;
private Excel.WorkbookEvents_Event wbEvents;
private Excel.WorkbookEvents_ActivateEventHandler activateEvent;
在 _Startup 中連接事件:
wbEvents = (Excel.WorkbookEvents_Event)wkbk;
activateEvent = new Excel.WorkbookEvents_ActivateEventHandler(ThisWorkbook_Activate);
wbEvents.Activate += activateEvent;
寫入事件處理常式:
private void ThisWorkbook_Activate()
{
// Your code goes here.
}
您必須轉換成 WorkbookEvents_Event,因為 Excel.Workbook.Activate 會傳回 Activate 方法而非 ActivateEvent 事件。
或者,您也可以將物件轉換成 Startup 中對應的事件介面:
((Excel.WorkbookEvents_Event)(Globals.ThisWorkbook.InnerObject)).Activate +=
new Excel.WorkbookEvents_ActivateEventHandler(ThisWorkbook_Activate);
然後,寫入事件處理常式的程式碼:
private void ThisWorkbook_Activate()
{
// Your code goes here.
}
無法辨識 Office 類別的參考
某些類別名稱 (像 Application) 會出現在多個命名空間中,例如 Microsoft.Office.Interop.Word 和 System.Windows.Forms 等命名空間。因此,專案範本最上方的 Imports/using 陳述式會包括簡寫的限定常數,例如:
Imports Word = Microsoft.Office.Interop.Word
using Word = Microsoft.Office.Interop.Word;
如果使用這種 Imports/using 陳述式,您必須能分辨 Office 類別的參考與 Word 或 Excel 限定詞的不同,例如:
Dim doc As Word.Document
Word.Document doc;
如果您使用未限定的宣告,將會發生錯誤,例如:
Dim doc As Document ' Class is ambiguous
Document doc; // Class is ambiguous
即使您已匯入了 Word 或 Excel 命名空間,而且也能存取其中的所有類別,但仍然必須使用 Word 或 Excel 完整限定所有型別,以免命名空間混淆不清。
以現有專案的文件為基礎來建立新專案時,遺失了控制項屬性
如果您以現有專案的文件為基礎來建立新的 Visual Studio Tools for Office 專案,文件中任何控制項的屬性都不會複製到新專案中。您必須以手動方式重設任何預先存在之控制項的屬性。或者,您也可以建立現有專案的複本而不建立新專案,或將現有專案載入新方案中 (在設計工具中),然後從現有文件複製控制項並貼到新文件中,藉此保留控制項屬性。
控制項在文件或工作表上顯示為黑色矩形
如果您將文件或工作表上的控制項設為群組,Visual Studio Tools for Office 就不再能夠辨認控制項。您無法從 [屬性] 視窗中存取群組控制項,而且這些控制項在文件或工作表上會顯示為黑色矩形。您必須解除群組控制項,以便還原其功能。
在 Visual Studio 中看不到 Word 範本上的控制項
如果您在 Visual Studio 設計工具中開啟 Word 範本,可能看不到該範本上未與文字排列的控制項。這是因為 Visual Studio 會以 [標準] 模式開啟 Word 範本。若要檢視這些控制項,請按一下 [檢視] 功能表,指向 [Microsoft Office Word 檢視],然後按一下 [整頁模式]。
快取的 Visual Basic 資料集名稱並未在快取中正確顯示
使用 Visual Basic 建立標記為 Cached 和 WithEvents 的 DataSet 物件 (包括從 [資料來源] 視窗或 [工具箱] 拖曳的 DataSet 物件,且其 CacheInDocument 屬性設定為 True),在快取中顯示的名稱前面會加上底線。比方說,如果建立 DataSet 並將其命名為 Customers,CachedDataItem 在快取中的名稱將會是 _Customers。在使用 ServerDocument 存取此快取項目時,必須指定 _Customers 而不是 Customers。
當 Microsoft Office 2003 專案命名為 Excel 或 Word 時發生編譯錯誤
Excel 和 Word 是 Office 專案中保留的關鍵字。
在刪除 NamedRange 控制項之後發生編譯器錯誤
如果您從工作表刪除 NamedRange 控制項,而該工作表並非設計工具的現用工作表,則自動產生的程式碼可能不會從專案中移除,而且可能會發生編譯器 (Compiler) 錯誤。為了確定將移式碼移除,請務必選取包含 NamedRange 控制項的工作表,在刪除控制項之前讓它成為現用工作表。如果刪除控制項時沒有刪除自動產生的程式碼,您可以啟動工作表並進行變更,讓系統將該工作表標示為已修改,從而讓設計工具刪除該程式碼。重建專案時,便會移除程式碼。
使用組件的 HTTP 路徑無法運作
以下是兩種主要的可能原因:
對於在 HTTP 位置建立的組件,[Visual Studio Tools for Office 專案精靈] 不會修改其安全性原則。您必須以手動方式授與組件完全信任。如需詳細資訊,請參閱 HOW TO:將使用權限授與資料夾和組件 (2003 系統)。
ASP.NET 預設會停用 DLL 下載。如果要讓組件下載給使用者,Web 伺服器系統管理員必須變更網際網路資訊服務 (IIS) 屬性,允許從儲存組件的目錄下載 DLL。如需詳細資訊,請至 Web 伺服器上的 https://localhost/iisHelp/,參閱網際網路資訊服務 (IIS) 說明。
若要測試這是不是造成問題的原因,您可以檢查 Web 伺服器記錄檔中是否有被拒絕的 DLL 要求。如果看起來可能是其他原因造成的,請設定偵錯工具在所有例外狀況中斷,然後查看錯誤訊息。
在 UNC 網路位置建立的專案不會自動修改安全性原則
[Visual Studio Tools for Office 專案精靈] 會在「使用者」層級修改安全性原則。如果您在 UNC 網路位置建立專案,必須在電腦層級修改安全性原則並授與組件完全信任,然後才能執行專案。您必須以手動方式在電腦層級進行變更。如需詳細資訊,請參閱 HOW TO:將使用權限授與資料夾和組件 (2003 系統)。
文件開啟時未引發 DocumentChange 事件
當現用文件變更時,會引發 DocumentChange 事件,而且通常在開啟文件時也會引發這個事件。但是,由於 Word 可以不同方式開啟文件 (例如,從命令列、從 Windows 檔案總管或從 Word 中的 [檔案] 功能表),所以開啟文件時不一定會引發 DocumentChange 事件。但是在開啟之後,如果現用文件變更了,應該會引發這個事件。如果您要在文件開啟時執行動作,請使用 Startup 事件。
偵錯之後執行緒未正確停止
Visual Studio Tools for Office 會按照執行緒命名慣例,讓偵錯工具正確關閉程式。如果您在方案中建立執行緒,則應在每個執行緒名稱的前面加上 VSTA_,確保停止偵錯時能正確處理這些執行緒。例如,對於等待網路事件的執行緒,您可以將其 Name 屬性設定為 VSTA_NetworkListener。
在 Internet Explorer 中引發的 Excel 事件與 Excel 中的不同
如果在 Internet Explorer 內裝載活頁簿,引發事件的順序會與在 Excel 中開啟活頁簿時不同。此外,某些事件會引發兩次。如果您的方案包含 Internet Explorer,請測試不同的事件順序對方案運作的影響。
從範本建立文件時未引發 New 事件
當您使用命令提示字元開啟 Word 範本並建立新文件時,必須使用 /z 參數引發 New 事件。在 /z 之後不要加空格,否則 Word 會開啟範本進行編輯,而不是依據範本建立新文件。例如 winword.exe /z"mytemplate.dot"。
這和使用 /t 參數的情況類似,不過 /z 會引發 New 事件。
開啟 XML 工作表時未引發 Open 事件
如果您的 Excel 專案使用現有非原生工作表 (例如 Excel XML 格式),那麼開啟工作表時不會引發 Open 事件。
BeforeClose 方法已執行,但使用者仍然讓活頁簿保持開啟
即使呼叫 BeforeClose 事件處理常式之後,使用者仍然可能取消關閉活頁簿並繼續使用您的方案。如果使用者在工作表中做了某些變更,然後不先存檔就以某種動作關閉活頁簿,就會發生這種情況。這時會呼叫 BeforeClose 事件處理常式,然後顯示一個可以讓使用者選擇取消關閉的對話方塊。
如果您將關閉資料庫連接或執行其他清除動作的程式碼放在 BeforeClose 事件處理常式中,那麼有可能呼叫該程式碼,但同時使用者仍在使用方案。
插入美工圖案命令在 Visual Studio 設計工具中沒有任何作用
在 Visual Studio 設計工具中開啟 Excel 或 Word 時,開啟 [插入] 功能表並指向 [圖片],然後按一下 [美工圖案] 並不會開啟 [美工圖案] 工作窗格。若要使用功能表命令加入美工圖案,必須在 Visual Studio 以外,開啟主要專案資料夾中的活頁簿或文件複本 (不是位於 \bin 資料夾中的複本)、加入美工圖案,然後儲存活頁簿或文件。
即使已安裝 Office 2003 仍無法建立 2003 文件層級專案
這個問題可能在您解除安裝 2007 Microsoft Office System,然後安裝 Office 2003 時發生。您可能會在建立 2003 文件層級自訂專案時收到下列錯誤訊息:
「這部電腦上沒有安裝相容版本的 Microsoft Office。」
若要解決這個問題:
關閉 Visual Studio。
開啟適當的 Microsoft Office 應用程式,然後關閉該應用程式。例如,如果您要建立 Excel 2003 活頁簿專案,則開啟然後關閉 Excel 2003。
啟動 Visual Studio 並建立專案。
在 Visual Studio 中開啟 Excel 文件層級自訂專案時 Excel 活頁簿變成停用狀態
當您開啟 Excel 2007,然後在 Visual Studio 中建立 Excel 2007 文件層級自訂專案時,最先開啟的活頁簿會停止回應。
若要解決這個問題,請按一下 Visual Studio 設計工具中顯示的活頁簿。您最先開啟的活頁簿就會開始回應。