全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1725
推到 Plurk!
推到 Facebook!

Macrol 套用到Delphi???

答題得分者是:timhuang
moko
一般會員


發表:31
回覆:34
積分:13
註冊:2002-09-20

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-05-27 18:41:45 IP:210.65.xxx.xxx 未訂閱
請問一個操控EXCEL的問題,我編了一個複製貼上(不同的sheet)的巨集, 可是怎麼把這些指令轉換到Delphi去呢?我搜尋了一些問題,但還是不甚了解!!內容如下:        Range("A1:F10").Select     Application.CutCopyMode = False     Selection.Copy     Sheets("sheet1").Select     Range("B3").Select     ActiveWindow.SmallScroll Down:=-3     ActiveSheet.Paste    麻煩有人替我解答好嗎???謝謝!
pgdennis
資深會員


發表:41
回覆:526
積分:443
註冊:2002-05-23

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-05-28 16:35:51 IP:218.163.xxx.xxx 未訂閱
 
procedure TForm1.Button1Click(Sender: TObject);
var  MyExcel: Variant;
     x,y:integer;
begin
  MyExcel := CreateOleOBject('Excel.Application');
  MyExcel.WorkBooks.Add;
  MyExcel.WorkBooks[1].WorkSheets[1].Cells[1,1] := 'uu';
  MyExcel.WorkBooks[1].WorkSheets[1].Cells[1,2] := 'uu11';
  MyExcel.WorkBooks[1].Saveas('d:\t.xls');
  MyExcel.WorkBooks[1].Close;
  MyExcel.WorkBooks.Add('d:\t.xls');
  MyExcel.Visible := True;      MyExcel.WorkBooks[1].WorkSheets[1].Range['A1:F10'].select;
  MyExcel.CutCopyMode := False;
  MyExcel.Selection.Copy;
  MyExcel.WorkBooks[1].WorkSheets['sheet2'].Select;
  MyExcel.WorkBooks[1].WorkSheets['sheet2'].Range['B3'].select;
//  MyExcel.SmallScroll(-3);試不出來
  >    其實你也可以用 >    永遠追不上技術更新的速度    發表人 - 
        
------
星期一,二...無窮迴圈@@
moko
一般會員


發表:31
回覆:34
積分:13
註冊:2002-09-20

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-05-30 18:26:45 IP:210.65.xxx.xxx 未訂閱
感謝 pgdennis 後來我知道可以用run的方式,可否再請教,若我要把值傳出來 那要怎麼寫才能讓Delphi接收?參數怎麼寫呢? 謝謝喔!
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-05-30 21:27:21 IP:61.221.xxx.xxx 未訂閱
引言: 感謝 pgdennis 後來我知道可以用run的方式,可否再請教,若我要把值傳出來 那要怎麼寫才能讓Delphi接收?參數怎麼寫呢? 謝謝喔!
要取得某儲存格的值有兩種比較簡單的方法: 1) 直接傳入位置, 如 A7, B5 var mystr: string; mystr := VarToStr(MyExcel.WorkBooks[1].WorkSheets['sheet2'].Range['B5']); 2) 傳入的是 y, x 位置, 都是由 1開始算, 如 A7 就是 [7, 1], B5 就是 [5, 2] var mystr: string; mystr := VarToStr(MyExcel.WorkBooks[1].WorkSheets['sheet2'].Cells[5, 2]);
moko
一般會員


發表:31
回覆:34
積分:13
註冊:2002-09-20

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-06-01 18:51:06 IP:218.161.xxx.xxx 未訂閱
多謝 > 請幫個忙囉,謝謝。
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-06-01 21:55:53 IP:61.221.xxx.xxx 未訂閱
若是要由巨集傳回的話, 巨集必須是以 function 的方式宣告, 如下:    
Function Macro1()
    
    'xxxx
    '.....
    
    Macro1 = "123"      '要回傳的值在 VBA 中是要以該 function 的名稱的變數為回傳值.
    
End Function
如此一來該 Macro1 才有回傳的能力, 在 delphi 中的呼叫傳回方式如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  excel: Variant;
  a: string;
begin
  excel := CreateOleObject('excel.application');
  excel.WorkBooks.Open('c:\1.xls');
  a := VarToStr(excel.Run('Module1.Macro1'));  //就是直接取回即可
  ShowMessage(a);                              //show出的結果就是 '123'
  excel.Visible := true;
  excel.Quit;
  excel := Unassigned;
end;
moko
一般會員


發表:31
回覆:34
積分:13
註冊:2002-09-20

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-06-02 15:32:26 IP:210.65.xxx.xxx 未訂閱
timhuang謝謝你囉...我了解了! 可是還有一個問題,假若有3或4個值 傳出值和delphi傳回值的寫法該怎麼做? 再麻煩一下了,謝謝! <>< face="Verdana, Arial, Helvetica">引言: 若是要由巨集傳回的話, 巨集必須是以 function 的方式宣告, 如下:
Function Macro1()
    
    'xxxx
    '.....
    
    Macro1 = "123"      '要回傳的值在 VBA 中是要以該 function 的名稱的變數為回傳值.
    
End Function
如此一來該 Macro1 才有回傳的能力, 在 delphi 中的呼叫傳回方式如下:
procedure TForm1.Button1Click(Sender: TObject);
var
  excel: Variant;
  a: string;
begin
  excel := CreateOleObject('excel.application');
  excel.WorkBooks.Open('c:\1.xls');
  a := VarToStr(excel.Run('Module1.Macro1'));  //就是直接取回即可
  ShowMessage(a);                              //show出的結果就是 '123'
  excel.Visible := true;
  excel.Quit;
  excel := Unassigned;
end;
timhuang
尊榮會員


發表:78
回覆:1815
積分:1608
註冊:2002-07-15

發送簡訊給我
#8 引用回覆 回覆 發表時間:2003-06-02 21:39:29 IP:61.221.xxx.xxx 未訂閱
那就只能利用 call by reference 的方式了, 在 excel 的 macro 必須像這樣:    
Function Macro1(ByRef d As String, ByRef k As String)
    
    'xxxx
    '.....
    d = "222"
    k = "333"
    Macro1 = "123"
    
End Function
在 delphi 中就可以利用傳如的變數來進行傳回值, 如同 delphi 的 var 一般!
procedure TForm1.Button1Click(Sender: TObject);
var
  excel: Variant;
  a, b, c: string;
begin
  excel := CreateOleObject('excel.application');
  excel.WorkBooks.Open('c:\1.xls');
  excel.Visible := true;
  a := VarToStr(excel.Run('Module1.Macro1',b,c));  //a 是回傳值, b是傳入給 macro 回傳的參數
  ShowMessage(a);                              //show出的結果就是 '123'
  ShowMessage(b);                              //show出的結果就是 '222'
  ShowMessage(c);                              //show出的結果就是 '333'
  excel.Quit;
  excel := Unassigned;
end;
要更多個變數以此類推..
moko
一般會員


發表:31
回覆:34
積分:13
註冊:2002-09-20

發送簡訊給我
#9 引用回覆 回覆 發表時間:2003-06-04 00:23:07 IP:61.230.xxx.xxx 未訂閱
再次感謝pgdennis和timhuang對於操控
系統時間:2024-05-20 7:12:03
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!