線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:3596
推到 Plurk!
推到 Facebook!

利用Delphi的OLE將資料匯至Excel

答題得分者是:wscken
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-07-31 16:27:25 IP:60.248.xxx.xxx 訂閱
請問各位大大,

我在excel利用巨集錄製以下vb語法,想把它轉成delphi語法,
以下語法是將匯入至excel中,尋找有"未納"字串改變格式變成紅色字體.
請問各位大大,有沒有人知道.thks

With Application.ReplaceFormat.Font
.Subscript = False
.ColorIndex = 3
End With
Cells.Replace What:="未納", Replacement:="", LookAt:=xlPart, SearchOrder _
:=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=True

pceyes
尊榮會員


發表:70
回覆:657
積分:1140
註冊:2003-03-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-08-01 13:00:29 IP:122.118.xxx.xxx 訂閱
難以歸類主題的討論區(Delphi) » 執行Excel內已寫好的巨集
http://delphi.ktop.com.tw/board.php?cid=30&fid=69&tid=35114
------
努力會更接近成功
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-08-04 16:20:44 IP:60.248.xxx.xxx 訂閱
謝謝您。

可是我的動作是由SQL過濾資料 再 丟至 EXCEL檔,
如何將我要這段需求 新增到 EXCEL巨集中。

thks
st33chen
尊榮會員


發表:15
回覆:591
積分:1201
註冊:2005-09-30

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-08-12 14:14:21 IP:122.116.xxx.xxx 訂閱
------
IS IT WHAT IT IS
我是 李慕白 請倒著唸.
又想把老話拿出來說, 請用台語發音 : 專家專家全是ROBOT CAR (滷肉腳啦);
都已接手這麼久了, 績效還是那麼爛, 講話還那麼大聲.
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-08-22 09:46:14 IP:60.248.xxx.xxx 訂閱

===================引 用 st33chen 文 章===================
是不是您所要的

http://www.wscken.idv.tw/pjblog/article.asp?id=12


謝謝st33chen。
真是一個很好的東西,可是我在run過程。
有出現 陣列索引超出範圍,
程式是出現在
CM := aWorkBook.VBProject.VBComponents.Item(ModuleNm).Codemodule;
是 這段的關係ModuleNm := 'M1';
可是M1在EXCEL怎麼會超出範圍。
麻煩大家,THKS。
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-18 14:23:44 IP:203.66.xxx.xxx 訂閱
那應該是你自己捕捉下來的錯誤吧!

Try的時候發現錯誤,因為根本不存在,所以在 except的時候新增進去,
所以你就會看到他有錯誤產生,可是巨集卻又寫入的情形了




===================引 用 t0288542 文 章===================

===================引 用 st33chen 文 章===================
是不是您所要的

http://www.wscken.idv.tw/pjblog/article.asp?id=12


謝謝st33chen。
真是一個很好的東西,可是我在run過程。
有出現 陣列索引超出範圍,
程式是出現在
CM := aWorkBook.VBProject.VBComponents.Item(ModuleNm).Codemodule;
是 這段的關係ModuleNm := 'M1';
可是M1在EXCEL怎麼會超出範圍。
麻煩大家,THKS。
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#7 引用回覆 回覆 發表時間:2008-09-19 13:16:55 IP:60.248.xxx.xxx 訂閱
謝謝您,如只單獨執行,
CM1 := WorkBook.VBProject.VBComponents.Add(1);
CM1.Name := ModuleNm;
CM1.CodeModule.AddFromString(sMacro2);
是ok。
不好意思,請教您,在try內和except有什麼差別,為何您會這麼寫。
ModuleNm := 'M1';
try
CM := WorkBook.VBProject.VBComponents.Item(ModuleNm).Codemodule;
CM.DeleteLines(1, CM.CountOfLines);
CM.InsertLines(1, sMacro2);
except
CM1 := WorkBook.VBProject.VBComponents.Add(1);
CM1.Name := ModuleNm;
CM1.CodeModule.AddFromString(sMacro2);
end;
麻煩您。
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#8 引用回覆 回覆 發表時間:2008-09-21 10:05:31 IP:203.66.xxx.xxx 訂閱
因為是假設Codemodule已經存在,直接寫入,
如果失敗,表示沒有那個Codemodule,所以就新增一個。


你可以把產生的Excel檔案存下來,
寫另外一個按鈕的事件變成這樣

[code delphi]
procedure TForm1.Button3Click(Sender: TObject);
const
// Excel巨集內容
sMacro: String =
' Sub Dynamic_Macro(Pa1) '#13#10
' MsgBox ("This Is Dynamic Create Excel''s Macro Test(" & Pa1 & ")") '#13#10
' End Sub ';
var
OpnDia : TOpenDialog ;
vSheet, vWorkBook, vExcel : Variant;
CM: OleVariant;
CM1: OleVariant;
ModuleNm: String;
begin

OpnDia := TOpenDialog.Create(self) ;
OpnDia.Filter := 'Excel Files (*.xls)|*.xls';
OpnDia.Title := 'Open Excel File';
if OpnDia.Execute then begin
edtFile.Text := OpnDia.FileName ;
try
// 產生Excel物件
vExcel := CreateOleObject('Excel.Application');
vExcel.WindowState := xlMaximized;
vExcel.Visible := True; // 顯示或不顯示
vExcel.DisplayAlerts := True; // 提示訊息
vExcel.ScreenUpdating := True; // 螢幕更新
vWorkBook := vExcel.WorkBooks.Open(edtFile.Text);

vSheet:=vExcel.Worksheets.Item[1];
vSheet.Name:='Test Macro.';

ModuleNm := 'M1';
try
CM := vWorkBook.VBProject.VBComponents.Item(ModuleNm).Codemodule;
CM.DeleteLines(1, CM.CountOfLines);
CM.InsertLines(1, sMacro);
except
on E: Exception do begin
MessageDlg('Failed!' #13#10 E.Message, mtError, [mbOk], 0);
CM1 := vWorkBook.VBProject.VBComponents.Add(1);
CM1.Name := ModuleNm;
CM1.CodeModule.AddFromString(sMacro);
end;
end;
// vExcel.Run('Dynamic_Macro');
vExcel.Run('Dynamic_Macro', 'TEST123');

except
ShowMessage('ERROR');
VarClear(vSheet);
VarClear(vWorkBook);
vExcel.Quit;
VarClear(vExcel);
end;
end;

end;
[/code]

在去開啟剛剛已經有巨集的檔案,
就可以發現他這次except的不會執行,因為巨集已經存在了。
t0288542
中階會員


發表:216
回覆:254
積分:94
註冊:2004-10-06

發送簡訊給我
#9 引用回覆 回覆 發表時間:2008-09-23 08:36:56 IP:60.248.xxx.xxx 訂閱
謝謝您。
請問您,Delphi與Excel這方面資料,您都在那裡找或者有書籍,
網路上資料似乎沒有這麼深入主題。
wscken
初階會員


發表:28
回覆:75
積分:45
註冊:2003-08-05

發送簡訊給我
#10 引用回覆 回覆 發表時間:2008-09-24 17:22:38 IP:203.66.xxx.xxx 訂閱
我也忘記是哪裡來的了,似乎是我同事教的,
很多問題,其實網路上高手很多,像在Ktop,很多高手都會回答的。
如果說像這種資料的話,基本上,Delphi如果沒人這樣做,去查C# Java那些語言,
,寫法都差不多,測試一下,改一點點,基本上都是可以的。
系統時間:2024-04-20 6:03:14
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!