AI muốn lập trình DLL cho Excel và các loại bằng Delphi thì xem video này nhé!

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Được nhưng nó tối. Moitj add-in sẽ có nhiều form làm nhiều phần việc, các form đều dùng đến FExcelApp nên biến này nên nằm ở một unit riêng chứ không khai báo trong một form nào sẽ sáng phạm vi.
chịu sáng tới giờ mò chưa ra cách khai báo sử dụng cho nhiều Form khi có nhu cầu Show Form lên là check Sheetnam và gán xuống Cells OK
 

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,472
Được thích
14,483
Điểm
1,910
Nơi ở
Tp.HCM

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,226
Được thích
4,825
Điểm
560
Không biết Em làm sai cái gì hay khai báo thiếu cái gì khi Em tạo 1 cái Form mới Em bỏ nó chạy khi Excel Load chỉ thực hiện khi bấm trên Menu mà nó không có chạy và không báo lỗi

Anh chỉ dùm Em khai báo lại , viết lại code sao mà sử dụng chung cho nhiều cái Form khi em gọi nó trên menu Excel

Code trong TDelphiAddIn1.OnConnection
Mã:
procedure TDelphiAddIn1.OnConnection(const Application: IDispatch;
  ConnectMode: ext_ConnectMode; const AddInInst: IDispatch;
  var custom: PSafeArray);
begin
  supports(Application, ExcelApplication)//Thiếu hay sai cái gì ở khúc này
end;
1. Bạn không đọc kỹ bài 1104 của tôi.
2. Nếu bạn tìm và xem supports thì sẽ thấy thiếu cái gì.
Code trên Form không chạy mà cũng ko báo lỗi
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
Cảm ơn Anh
Báo lỗi gì nữa bạn? Bạn đọc code mà không không hiểu à? FExcelApp = nil, vậy Assigned(FExcelApp) = FALSE, vậy thì cụm code trong IF không được thực hiện. Báo lỗi gì ở đây?

Tôi cho vd. trong VBA cho gần với bạn.
Mã:
Sub test()
Dim a As Double, rng As Range
    If Not rng Is Nothing Then
        a = 3 / 0
        MsgBox "Ngay mai em di"
    End If
End Sub
Bạn có thấy code trong cụm IF thực hiện không? Rõ ràng không vì không thấy thông báo "Ngay mai em di". Có thấy báo lỗi không, vì có phép chia cho số 0. Rõ ràng là không. Tại sao? Bởi rng = Nothing nên biểu thức (Not rng Is Nothing) trả về FALSE và cụm IF không được thực hiện. Báo lỗi gì ở đây?
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,226
Được thích
4,825
Điểm
560
Mạnh đang kẹt code trên Form mỗi lần nó Show ra mà ko chạy code ...
Mạnh tạo 1 cái Form xong Từ Menu Ribbon Excel bấm nó Show lên mỗi lần khi có nhu cầu mà khai báo sao nó không có chạy code sau:
Mã:
procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
Toàn bộ code trên Form
Mã:
interface

uses
  System.Win.ComObj,
  Vcl.Buttons,
  Winapi.Windows, Winapi.Messages,
  System.SysUtils, System.Variants,
  System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms,
  Vcl.Dialogs, Excel2010, Vcl.OleServer,
  Vcl.ComCtrls, Vcl.StdCtrls,
  Vcl.DBCtrls, Vcl.ExtCtrls;

type
  TForm1 = class(TForm)
    OpenDialog1: TOpenDialog;
    SpeedButton1: TSpeedButton;
    DBRadioGroup1: TDBRadioGroup;
    DBListBox1: TDBListBox;
    Edit1: TEdit;
    GetRange: TButton;
    Label1: TLabel;
    procedure SpeedButton1Click(Sender: TObject);
    procedure GetRangeClick(Sender: TObject);
  private
    { Private declarations }
    FExcelApp: TExcelApplication; // Uses Excel2010
  public
    { Public declarations }
    //FExcelApp: ExcelApplication; // TExcelApplication; khai báo sử dụng ExcelApp
  end;

  { var
    Form1: TForm1; code Delphi tao ra }
  { Khai bao cac bien su dung Cho Form }
procedure ShowForm;
var
  Form1: TForm1;
  f: TForm1; // Su dung Form

implementation

{$R *.dfm}

procedure ShowForm;
begin
  f := TForm1.Create(nil);
  try
    // f.Show; //.ShowModal;
    f.ShowModal;
  finally
    f.free
  end;
end;

procedure TForm1.GetRangeClick(Sender: TObject);
var
  sh: _WorksheetDisp;
begin
  if Assigned(FExcelApp) then
  begin
    sh := _WorksheetDisp(FExcelApp.ActiveSheet);
    sh.Cells._Default[1, 1].Value := 'Kiều Mạnh';
    ShowMessage(sh.name);
  end;
end;
Chỉnh sửa dùm Mạnh làm sao mỗi khi bấm Form Show lên là xài code Check Sheetname Ok
Ở bài 1104 tôi chỉ rõ cho bạn nơi cần chuyển FExcelApp
Và FExcelApp chuyển ra chỗ mới trong Unit1:
...
var

Form1: TForm1;
FExcelApp: ExcelApplication;
Tất nhiên không khai báo FExcelApp ở Unit1 mà ở unit khác cũng được. Và tất nhiên phải khai báo trong phần interface thì biến mới được"nhìn thấy" từ các unit khác. Khai báo ở phần implementation thì chỉ dùng được trong unit mà biến được khai báo mà thôi.

Nếu bạn đọc kỹ bài 1104 thì một loạt bài sau đó trong chủ đề này là không cần thiết.
Không ai chỉ bảo chi tiết cho bạn cho tới tận khi tôi chỉ ra cho bạn. Tôi là người chỉ bảo cho bạn. Nhưng bạn không chịu đoc kỹ và làm theo. Để rồi đẻ ra hàng loạt bài không cần thiết.


Mà đã có khai báo sẵn Form1: TForm1. Vậy thì khai báo f: TForm1 để làm gì?
 
Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
1. Bạn không đọc kỹ bài 1104 của tôi.
2. Nếu bạn tìm và xem supports thì sẽ thấy thiếu cái gì.

Báo lỗi gì nữa bạn? Bạn đọc code mà không không hiểu à? FExcelApp = nil, vậy Assigned(FExcelApp) = FALSE, vậy thì cụm code trong IF không được thực hiện. Báo lỗi gì ở đây?

Tôi cho vd. trong VBA cho gần với bạn.
Mã:
Sub test()
Dim a As Double, rng As Range
    If Not rng Is Nothing Then
        a = 3 / 0
        MsgBox "Ngay mai em di"
    End If
End Sub
Bạn có thấy code trong cụm IF thực hiện không? Rõ ràng không vì không thấy thông báo "Ngay mai em di". Có thấy báo lỗi không, vì có phép chia cho số 0. Rõ ràng là không. Tại sao? Bởi rng = Nothing nên biểu thức (Not rng Is Nothing) trả về FALSE và cụm IF không được thực hiện. Báo lỗi gì ở đây?
Khổ lắm Em đọc tới xong lại đọc lùi xong đọc từ dưới lên trên ...
Trình của Em còn kém nên chưa có hiểu đó Anh !!!

Với lại tự mò học là chính nên khúc biết khúc ko ... nên vẫn đang chịu thua Anh à
Ngày Qua Anh chỉ cái đó thì Ok Rồi ... Giờ Em muốn tạo nhiều cái Form và mở nó lên khi cần trên Menu Excel chạy nó mà không biết viết sao đó Anh

Em mò hoài 1 ngày nào đó sẻ ra thôi ... nhưng rất lâu đó ... Anh giúp Em chút thì sẻ rất nhanh
 
Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
VD như code sau xxxx Em cứ nghĩ như trên VBA thích cho chỗ nào trả được ... Mình viết đúng sao Delphi nó cứ keo sai ... Tìm hoài ko thấy vô tình copy lên trên thì nó ok... xong Em lại thử copy xuông dưới xem sao thì Delphi nó la lên đó Anh ...
Mã:
procedure TCoMultipleUIThreadsDemo.SQLServer(const Control: IDispatch);
begin
  xxxx
end;

procedure xxxx
Cuối cùng hóa ra Dephi nó bắt phải có trên xong mới có dưới là vậy .... thật mà hài ghê đó -0-0-0-
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,226
Được thích
4,825
Điểm
560
Khổ lắm Em đọc tới xong lại đọc lùi xong đọc từ dưới lên trên ...
Trình của Em còn kém nên chưa có hiểu đó Anh !!!

Với lại tự mò học là chính nên khúc biết khúc ko ... nên vẫn đang chịu thua Anh à
Ngày Qua Anh chỉ cái đó thì Ok Rồi ... Giờ Em muốn tạo nhiều cái Form và mở nó lên khi cần trên Menu Excel chạy nó mà không biết viết sao đó Anh

Em mò hoài 1 ngày nào đó sẻ ra thôi ... nhưng rất lâu đó ... Anh giúp Em chút thì sẻ rất nhanh
Tôi không hiểu ý bạn. Ở bài 1101 thì Form1 được tạo ra trong OnConnection (do FExcelApp cần dùng trong SUPPORTS - bài 1104, mà FExcelApp lại là trường trong class TFrom1 như code của bạn)
Mã:
Form1 := TForm1.Create(nil);
và được hiển thị trong OnStartupComplete
Mã:
Form1.Show;
Nếu như ở bài tiếp theo 1004 FExcelApp được khai báo như biến toàn cục thì cả tạo Form1 và hiển thị nó đều có thể hoặc làm ở OnStartupComplete, hoặc làm khi chọn menu.

Bây giờ bạn muốn tạo và hiển thị khi chọn menu thì 2 việc trên làm khi chọn menu thôi. Nhưng muốn tiếp theo tương tác với bảng tính Excel thì phải có đối tượng Application. Với mục đích này thì ta dùng FExcelApp và code SUPPORTS(...) trong OnConnection như bài 1101. Khi server COM của bạn kết nối với server Excel thì Application: IDispatch trong OnConnection chính là đối tượng Application. Chỉ cần ghi nhớ nó vào FExcelApp để dùng về sau. Bởi cho tới tận khi hết kết nối thì FExcelApp luôn luôn là đối tượng Application.

Bạn nói nhiều cái bạn không biết, nhưng những cái bạn không biết nó lại là kiến thức cơ bản. Tìm kiếm (Find ..., Find in Files ...), khai báo các unit, tầm vực của biến, tự thêm các unit cần thiết ... là Delphi cơ bản. Server COM là Delphi nâng cao, thậm chí nâng rất cao. Bạn làm server COM mà vẫn chưa nắm vững Delphi cơ bản?

Thôi, tôi dừng ở đây. Những thông tin bạn cần tôi đã cung cấp trong các bài của mình. Chỉ cần đọc kỹ và làm theo. Mà từ các bài viết của bạn thì tôi thấy bạn không đọc kỹ các bài của tôi và làm theo.
 
Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Ở bài 1101 thì Form1 ... là code nguyên Mẫu gốc của tây Em đưa lên cho HLMT tham khảo đó ... chứ không phải ý em muôn cái Form nó load khi mở Excel
Ý Em là tạo nhiều Form xong Từ menu Excel Gọi nó lên Khi cần thôi ... Em đang kẹt khai báo Sử dụng sao cho Từng Form mở nó lên khi cần xong thoát hoặc mở lại
 

batman1

Thành viên gạo cội
Tham gia ngày
8 Tháng chín 2014
Bài viết
3,226
Được thích
4,825
Điểm
560
Ở bài 1101 thì Form1 ... là code nguyên Mẫu gốc của tây Em đưa lên cho HLMT tham khảo đó ... chứ không phải ý em muôn cái Form nó load khi mở Excel
Thì chính vì thế mà khi đưa code tôi nhấn mạnh là đó chỉ là ví dụ. Bạn phải biết biến tấu, chứ tôi làm sao có thể đoán ý hiện tại và tương lai của bạn được. Lôgíc chỉ có một. Không làm trong OnStartupComplete thì làm khi chọn menu. Tùy theo nhu cầu của mình mà biến tấu thôi.

Trong VBA tôi cho ví dụ gọi Sub A() trong UserForm_Initialize, còn bạn muốn gọi trong CommandButton1_Click() thì sao? Thì gọi trong CommandButton1_Click và trong UserForm_Initialize không gọi chứ sao.

Mà thôi, tôi đã nói là tôi dừng rồi.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Thì chính vì thế mà khi đưa code tôi nhấn mạnh là đó chỉ là ví dụ. Bạn phải biết biến tấu, chứ tôi làm sao có thể đoán ý hiện tại và tương lai của bạn được. Lôgíc chỉ có một. Không làm trong OnStartupComplete thì làm khi chọn menu. Tùy theo nhu cầu của mình mà biến tấu thôi.

Trong VBA tôi cho ví dụ gọi Sub A() trong UserForm_Initialize, còn bạn muốn gọi trong CommandButton1_Click() thì sao? Thì gọi trong CommandButton1_Click và trong UserForm_Initialize không gọi chứ sao.

Mà thôi, tôi đã nói là tôi dừng rồi.
Cảm Ơn Anh Nhiều
Em mới làm xong Rùi ... Em chậm tiếp thu chút à chứ ko phải là ko đọc kỹ bài của Anh và ko đọc help.... Help cà chua lắm nếu cứ đọc help mà ai cũng học được thì mấy tay đứng bục giảng thất nghiệp hết :D

Em mò cái Hàm supports Anh viết xem nó là cái chi thì Em mới Biết đó

Vậy là logis em lại biết thêm Xài Hàm supports ... thật lòng mà nói VBA Em viết đủ thứ xong Anh hỏi Căn bản là Em tịt đó
Sang Delphi cũng thế vì em có được học hành bài bản chi mô .... Vóc diết xong mới hệ thống lại

và ngày xưa rất xưa Em còn ở Hà Nội ... cái tay giáo sư nó nói Lý luận khái quát từ thực tiễn mà ra ... và thực tiễn là nơi kiểm nghiệm lại cái lý luận đó ... Nó là 1 cặp phạm trù cơ bản của phép duy vật biện chứng ... -0-0-0-
 
Lần chỉnh sửa cuối:

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Vậy là đã Xong Phần Form ... lại tiếp phần khác ... khó khăn lại nhờ các Bạn chỉ tiếp
Video sau Mới là cái Mạnh cần cho Viết Add -Ins COM Delphi cho Excel
Nó truyền tham số ExcelApp vào ngay khi mở Excel nên rất nhanh cảm giác như ngay trên Excel ... Code mã máy Nữa ko phải qua tay Phiên dịch ... đoán là sẻ nhanh hơn Code ngay trên Excel quá .... ( nếu phán sai bỏ qua he )

Eo ui vậy là Mạnh bước vào ngưỡng cửa COM COM Delphi viết Add-Ins cho Excel tạm ok rồi sao ??? -0-0-0-
 

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,472
Được thích
14,483
Điểm
1,910
Nơi ở
Tp.HCM
Vậy là đã Xong Phần Form ... lại tiếp phần khác ... khó khăn lại nhờ các Bạn chỉ tiếp
Video sau Mới là cái Mạnh cần cho Viết Add -Ins COM Delphi cho Excel
Nó truyền tham số ExcelApp vào ngay khi mở Excel nên rất nhanh cảm giác như ngay trên Excel ... Code mã máy Nữa ko phải qua tay Phiên dịch ... đoán là sẻ nhanh hơn Code ngay trên Excel quá .... ( nếu phán sai bỏ qua he )

Eo ui vậy là Mạnh bước vào ngưỡng cửa COM COM Delphi viết Add-Ins cho Excel tạm ok rồi sao ??? -0-0-0-
Form đằng form, còn ứng dụng Excel đằng ứng dụng Excel vậy anh?
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Form đằng form, còn ứng dụng Excel đằng ứng dụng Excel vậy anh?
chưa hiểu kịp nói gì ... chi tiết chút

Nó là Add-ins COM đó thích nhập bất cứ File Excel nào mở lên nó lấy ActiveSheet của File đó xong nhập liệu vào có như vậy mới viết SQL lấy dữ liệu gán lên Range ok được chứ
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
File sau là bản Test thử của Mạnh ... COM Add-ins sử dụng cả Menu Ribbon Excel Luôn đó
To @giaiphap .... cái này viết Add-Ins hay đó Nó chỉ có 1 File DLL duy nhất và khi viết thích Build x32 or x64 trong 1 nốt nhạc
Mạnh Úp 2 bản Ai xài Office x32 thì Add COM x32
Chạy Excel.EXE chế độ Run As khi đó Windows hỏi thì chọn Yes xong Vào COM Excel Add nó vào
Untitled.png
 

File đính kèm

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Nếu đã chạy COM add-in tbif hãy gán biến Excel vào tham số Application trong sự kiện OnConnection nhé. Sau này không phải Create hay get Object gì cả.
Quậy diết mấy ngày hôm nay mới ngộ ra câu nói của bạn ... Nếu bạn nào mới nhập Môn Delphi mà hiểu được câu nói này chắc hack não cả năm quá
Chính xác là thế mọi cái lấy từ cái dòng tô đậm thì các Object từ Excel truyền vào Delphi như nhau nên code trên Delphi sẻ nhanh hơn trên VBA ... Vì VBA qua dịch xong mới chạy còn Delphi mã máy chạy ngay lập tức ( Mạnh phán đại thế hên trúng ... trật bỏ qua he )
Cảm ơn rất nhiều
 

giaiphap

==(^o^)==
Tham gia ngày
12 Tháng ba 2007
Bài viết
5,145
Được thích
4,716
Điểm
860
File sau là bản Test thử của Mạnh ... COM Add-ins sử dụng cả Menu Ribbon Excel Luôn đó
To @giaiphap .... cái này viết Add-Ins hay đó Nó chỉ có 1 File DLL duy nhất và khi viết thích Build x32 or x64 trong 1 nốt nhạc
Mạnh Úp 2 bản Ai xài Office x32 thì Add COM x32
Chạy Excel.EXE chế độ Run As khi đó Windows hỏi thì chọn Yes xong Vào COM Excel Add nó vào
View attachment 239862
Tôi vẫn đang nghiên cứu C#, viết Add-Ins cũng thấy OK. Hiện tại vẫn phát triển tốt, hiện tại là tự mò nhưng cũng cảm thấy hiểu nhiều về nó rồi. Hầu như là những cái tiện ích VNTools của tôi hoàn toàn chuyển được sang C# rồi. Thấy ái Delphi này ít tài liệu nghiên cứu quá nên chạy mất dép, nhưng những bài viết trong chủ đề này vẫn tò mò muốn xem, thấy bác mò dữ quá.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
các Bạn cho Mình hỏi chút trong VBA mình sử dụng Hàm Right ... Thì trong Delphi Mình sử dụng hàm Gì tương đương như thế ???
Mình có tìm hiểu thấy có mấy hàm của Delphi như: RightStr, AnsiRightStr ... Mình có thử sao nó báo lỗi hay Mình thiếu Uses gì
Mong Các bạn chỉ dùm :D
 

Hai Lúa Miền Tây

❆❆❆❆❆❆❆❆
Thành viên BQT
Administrator
Tham gia ngày
18 Tháng ba 2008
Bài viết
7,472
Được thích
14,483
Điểm
1,910
Nơi ở
Tp.HCM
các Bạn cho Mình hỏi chút trong VBA mình sử dụng Hàm Right ... Thì trong Delphi Mình sử dụng hàm Gì tương đương như thế ???
Mình có tìm hiểu thấy có mấy hàm của Delphi như: RightStr, AnsiRightStr ... Mình có thử sao nó báo lỗi hay Mình thiếu Uses gì
Mong Các bạn chỉ dùm :D
Anh dùng thử hàm SubString nhé.
 

Kiều Mạnh

Thành viên gạo cội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,918
Được thích
2,719
Điểm
560
Nơi ở
IIIIIIIIIIIIIIIII
Anh dùng thử hàm SubString nhé.
Mai rảnh thử xem sao
Mã:
program Project1;
{$APPTYPE CONSOLE}

var
  strA, strB, strC : String;

begin
  strA := '0123456789';
  strB := strA.SubString(5);
  strC := strA.SubString(5, 2);

  Console.WriteLine('strA = ' + strA);
  Console.WriteLine('strB = ' + strB);
  Console.WriteLine('strC = ' + strC);

  Console.ReadLine;
end.
   strA = 0123456789
   strB = 56789
   strC = 56
 
Top Bottom