前陣子在 Delphi.KTOP 看到一篇「請問 Excel AddSmartArt 第一個參數該怎麼設定」。
覺得操作 SmartArt 這點很有意思,這兩天才有時間認真看了這篇文章,一開始以為使用 Excel 的「錄製巨集」就可以搞定,但直覺認為回覆此內容時會得到「我早就已經知道」的結果。
因此決定一試 Excel 巨集功能,取得的 VBA 內容是:
Call ActiveSheet.Shapes.AddSmartArt(Application.SmartArtLayouts( _
"urn:microsoft.com/office/officeart/2005/8/layout/cycle1")).Select
就這麼短短一行,轉到 Delphi 上會是以下內容:
procedure TForm2.Button3Click(Sender: TObject);
var
ExcelApp,
ActiveSheet,
oSALayout: Variant;
begin
try
ExcelApp := CreateOleObject('Excel.Application');
except
ShowMessage('建立EXCEL錯誤');
end;
ExcelApp.Visible := True;
ExcelApp.WorkBooks.Add;
ActiveSheet := ExcelApp.ActiveSheet;
oSALayout := ExcelApp.SmartArtLayouts('urn:microsoft.com/office/officeart/2005/8/layout/hierarchy2');
ActiveSheet.Shapes.AddSmartArt(oSALayout, 50, 50, 200, 200);
end;
卻得到以下結果:
看來樓主的問題內容並沒有說明完整,就來看一下 Excel Developer Docs 怎麼描述 SmartArtLayouts:
文件也就這麼一點點,沒了。 再透過 Google 搜尋,沒有更多的資料,Delphi 似乎沒有人這樣做,【找不到成員】這問題難道就無解了嗎?
Google 沒有沒關係,Excel_TLB 單元來解答
利用 Excel 執行檔來製作最適合它的 Delphi 元件看來是最終解法,果不其然,答案在這裡:ExcelApplication 確實有 SmartArtLayouts 成員,接下來就是直接操作它,程式碼直接公開:
VBA 對 OLE 成員非常自由,Item 到底是什麼東西?經查詢的結果是:
微軟連自家軟體的工程師手冊都寫得如此破碎和簡短,也難怪這方面的開發資訊幾近沒有。
原本還要多寫些關於 SmartArt 賦值的內容,無奈再往下追盡是 Access Violation,使用 Excel_TLB 時必定會發生,Stack Overflow 這篇【Delphi - How to create Excel PivotChart】也遇到一模一樣的問題,雖無法找到原因,但改以 OLE 重新刻一次後卻可以解決問題。
結論
問題內容不是很完整,導致在解題時會把樓主所遇到的「意外」再重新刷過一遍,這會平白消耗願意幫忙的解題人們的時間,有經驗的解題人通常不會浪費時間在這種題目上,我在問問題時會把經過的路程和途中的意外等盡可能描述出來,可以有效縮短解題人的時間。
EXCEL_TLB 函式庫在解題上可說是幫了大忙,在 EXCEL 操作上有任何問題,往這單元找就對了!
你說沒看到真正的解答?請再往上看紅框處的解答即可。
又或是看底下這張圖:
Excel_TLB 看來比較適合當字典查,查完後仍須以 OLE 刻回去。
和你分享。😉
See Also
- SmartArtLayouts.Item method (Office)
- SmartArtLayout 物件 (Office)
- Excel keeps running slow using SmartArtLayout in VBA?
- Delphi и OLE Automation с Excel
- How do I use Application.Run in Excel
沒有留言:
張貼留言