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

Liên hệ QC

Nguyễn Duy Tuân

Nghị Hách
Thành viên danh dự
Tham gia
13/6/06
Bài viết
4,652
Được thích
10,142
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Xin lỗi giờ mới có Thời gian phản hồi lại bạn
Mã:
function UniMsgbox(const Message1: String; const TimeOut: integer=64; const Format: integer=3): OleVariant;
var
    Title: String;
    Msg: OleVariant;
begin
    Title := 'Phng'+' Nam'+' Telecom';
   Msg:= CreateOleObject('Wscript.shell');
   Result := Msg.PopUp(Message1, TimeOut, Title, Format);
end;
procedure TForm1.Button27Click(Sender: TObject);
begin
UniMsgbox('Nguyễn Thị Thanh Thủy',3,1) ;
end;
Arr no la String
mạnh chuyển Fdate, Edate: String;
Còn hàm chuyển đổi
(DateTimeToStr((Edate)));
(StrToDateTime((Edate)));
 
Upvote 0
Arr no la String
mạnh chuyển Fdate, Edate: String;
Còn hàm chuyển đổi
(DateTimeToStr((Edate)));
(StrToDateTime((Edate)));
2 dòng sau sửa lại sao mạnh sửa khi Build nó báo lỗi
Mã:
If sArr[i, ColDate] >= Fdate Then  begin
         If sArr[i, ColDate] <= Edate Then begin
 
Upvote 0
2 dòng sau sửa lại sao mạnh sửa khi Build nó báo lỗi
Mã:
If sArr[i, ColDate] >= Fdate Then  begin
         If sArr[i, ColDate] <= Edate Then begin
mình dâu có sữa gì đâu chỉ đổi date thành String phia khai báo rồi chạy
FilterDate1dArray(E.Range['A2:I65536'].Value, E.Range['I1'].Value, E.Range['I2'].Value, 9, E.Range['K3']) //''Tham số 9 là cột ngay/thang/nam
Mã:
procedure FilterDate1dArray(sArr: OleVariant; Fdate, Edate: String;
                            ColDate: Longint; Range: OleVariant); stdcall;
var
    Arr     : OleVariant;
    i,j,k     : longint;
    lcols,lRows : longint;
begin
    k := 0;
    lRows := VarArrayHighBound(sArr, 1);  //So dong ko xac dinh
    lCols := VarArrayHighBound(sArr, 2);  //So Cot  ko Xac dinh
    Arr := VarArrayCreate([1, lRows , 1, lcols],varVariant);
    for i := 1 to lRows do begin
       If (sArr[i, ColDate]) >= (Fdate) Then  begin
         If (sArr[i, ColDate]) <= (Edate) Then begin
            k := k + 1;
            For j := 1 To lcols do begin
               Arr[k, j] := sArr[i, j];
            End;
         End;
       End;
    End;
    if k <> 0 then begin
       Range.Resize[k, lcols]:=Arr;  //gan ket Qua Len Range Theo Mang Arr
    end;
End;

Chach mạnh cho mình cái File của mạnh Test thửUntitled2.jpg
 
Lần chỉnh sửa cuối:
Upvote 0
mình dâu có sữa gì đâu chỉ đổi date thành String phia khai báo rồi chạy
FilterDate1dArray(E.Range['A2:I65536'].Value, E.Range['I1'].Value, E.Range['I2'].Value, 9, E.Range['K3']) //''Tham số 9 là cột ngay/thang/nam
Mã:
procedure FilterDate1dArray(sArr: OleVariant; Fdate, Edate: String;
                            ColDate: Longint; Range: OleVariant); stdcall;
var
    Arr     : OleVariant;
    i,j,k     : longint;
    lcols,lRows : longint;
begin
    k := 0;
    lRows := VarArrayHighBound(sArr, 1);  //So dong ko xac dinh
    lCols := VarArrayHighBound(sArr, 2);  //So Cot  ko Xac dinh
    Arr := VarArrayCreate([1, lRows , 1, lcols],varVariant);
    for i := 1 to lRows do begin
       If (sArr[i, ColDate]) >= (Fdate) Then  begin
         If (sArr[i, ColDate]) <= (Edate) Then begin
            k := k + 1;
            For j := 1 To lcols do begin
               Arr[k, j] := sArr[i, j];
            End;
         End;
       End;
    End;
    if k <> 0 then begin
       Range.Resize[k, lcols]:=Arr;  //gan ket Qua Len Range Theo Mang Arr
    end;
End;

Chach mạnh cho mình cái File của mạnh Test thửView attachment 204853
Chạy tốt chứ Bạn
Ko hiểu sao Mạnh mới sửa TDateTime sang string chạy code nó đơ luôn
 
Lần chỉnh sửa cuối:
Upvote 0

File đính kèm

  • VBLibrary.rar
    3 MB · Đọc: 19
Lần chỉnh sửa cuối:
Upvote 0
của mình mỗi lần chạy phải đăng ký
Để mỗi lần chạy ko phải đăng ký ta làm như sau:

1/ Copy File *.dll vô Windows\System32\*.dll ===> Windowsx32

2/ Copy File *.dll vô Windows\SysWOW64 \*.dll ===> Windowsx64

3/ Nêu ko làm theo mục 1 & 2 thì ta làm như sau cho tiện gọn khi ta test code sẻ rất nhanh khỏi phải mất công copy sau mỗi lần Build File *.dll

- Tao 1 File Excel copy vô thư mục (Build Delphi) ... TenFolder\Win32\Debug\*.dll ===> Officex32
- Tao 1 File Excel copy vô thư mục (Build Delphi) ... TenFolder\Win64\Debug\*.dll ===> Officex64

4/ Xong Copy code sau vào 1 Module Excel .... làm như vậy mỗi lần Build xong muốn test code thì khỏi mất công làm như mục 1 & 2 nữa
Ta chỉ việc mở File Excel đó lên chạy code thui còn mấy hàm API kia nó làm nhiệm vụ load *dll hàm trong đó cho rồi

5/ Nếu ta Build tiếp thì nên thoát File Excel đi cả build vì khi đó Excel vẫn còn kết nối với *.dll .... Nếu để vậy vẫn ok nhưng khi Build ta buộc phải chọn OK của Delphi thì nó mới kết thúc

6/ Lưu ý : Officex32 chỉ chạy file *.dll trong TenFolder\Win32\Debug\*.dll ===> Officex32 ( và ngược lại )
còn máy Windowsx64 hay Windowsx32 gì thì kệ bà nó he ko quan tâm -0-0-0-===\.

Mã:
Private Declare Function FreeLibrary Lib "kernel32" _
                        (ByVal hLibModule As Long) As Long
Private Declare Function LoadLibrary Lib "kernel32" Alias "LoadLibraryA" _
                        (ByVal lpLibFileName$) As Long
Dim hModule As Long
Rem 1/ Cach viet nay Ap dung Cho File *.DLL cung Folder lam don Gian khai bao su dung Ham dai dong
Rem 2/ Ap dung Cho WindowsX32: Copy Vao Windows\System32\VBLibrary.dll
Rem 3/ Ap dung Cho WindowsX64: Copy Vao Windows\SysWOW64\VBLibrary.dll
Rem 4/ Neu thuc hien Muc 2 Or 3 thi xoa het Code trong Module Nay
Rem ==========
Private Function LoadDLL() As Long
    LoadDLL = LoadLibrary(ThisWorkbook.Path & "\VBLibrary.dll")
End Function
Rem ==========
Private Sub FreeDLL(hModule As Long)
    Do Until FreeLibrary(hModule) = 0
    Loop
End Sub
Rem ==========
Public Sub AuTo_Open()
    Rem Load the DLL into memory
    hModule = LoadDLL()
End Sub
Rem ==========
Public Sub Auto_Close()
    Rem Unload the DLL from memory
    Call FreeDLL(hModule)
End Sub
Rem ==========
 
Upvote 0
Các bạn đang bị nhầm lẫn việc đăng ký hoặc không đăng ký DLL. Có 2 loại thư viện:
1. Standard DLL: là loại thư viện chỉ cần khai báo hàm xuất bởi các thư viện đó trong các môi trường lập trình khác là chạy được. Với việc khai báo Declare thì chỉ chạy các function, sub mà thôi, chứ không khởi tạo được Object/ Class do người lâp trình tạo ra. Video bài đầu tiên là loại DLL này.

2. ActiveX DLL/OCX: đây là loại thư viện vừa chứa các hàm tĩnh/static của Standard DLL vừa cho phép chứa các Object/Class của người lập trình tạo ra. Muốn môi trường lập trình khác sử dụng được các Class trong DLL/OCX này thì bắt buộc phải khai báo các lớp Class - Interface tới Registry của Windows, vì thế với loại thư viện và mục đích sử dụng Class nên ta phải đăng ký tới Windows - Registry bởi lệnh REGSVR32...

Trong video bài đầu tiên tôi hướng dẫn, đó là cách làm Starndard DLL, giống với cách Microsoft tạo ra các thư viện cung cấp các hàm API: user32.dll,.... Đây có thể nói là niềm mơ ước của người lập trình VB6, VBA đấy, vì đây là thư viện chuẩn của Windows, mang đi bất kỳ máy tính nào cũng chạy, không cần .NET gì cả, hỗ trợ cả 32, 64 bit, unicode, tốc độ thì nhanh khủng khiếp. XLL bản chất là Standard DLL nhé!
 
Upvote 0
Upvote 0
Bên Delphi dùng tham số OleVariant, VBA, VB6 là Variant thay cho String là được nhé.
Mình mới thử xong nó đơ luôn ... Hàm như sau nhờ Bạn sửa dùm
Mã:
function UniMsgbox(const Message1: String; const TimeOut: integer=64;
           const Format: integer=3): OleVariant; stdcall;
var
    Title    : String;
    Msg        : OleVariant;
begin
    Title := 'Phương'+' Nam'+' Telecom';
    Msg:= CreateOleObject('Wscript.shell');
    Result := Msg.PopUp(Message1, TimeOut, Title, Format);
end;
 
Lần chỉnh sửa cuối:
Upvote 0
Mình mới thử xong nó đơ luôn ... Hàm như sau nhờ Bạn sửa dùm
Mã:
function UniMsgbox(const Message1: OleVariant; const TimeOut: integer=64;
           const Format: integer=3): OleVariant; stdcall;
var
    Title    : String;
    Msg        : OleVariant;
begin
    Title := 'Phương'+' Nam'+' Telecom';
    Msg:= CreateOleObject('Wscript.shell');
    Result := Msg.PopUp(Message1, TimeOut, Title, Format);
end;
Cái này mình thua. File.exe, Active.Dll thì chạy đúng mà sao Standard.DLL nó không thể Get Unicode từ Excel bó tay mò chưa ra chắc phải qua bước convert qua char quá
 
Upvote 0
Mình mới thử xong nó đơ luôn ... Hàm như sau nhờ Bạn sửa dùm
Mã:
function UniMsgbox(const Message1: OleVariant; const TimeOut: integer=64;
           const Format: integer=3): OleVariant; stdcall;
var
    Title    : String;
    Msg        : OleVariant;
begin
    Title := 'Phương'+' Nam'+' Telecom';
    Msg:= CreateOleObject('Wscript.shell');
    Result := Msg.PopUp(Message1, TimeOut, Title, Format);
end;

Bạn thử bỏ "Const" đi ở những khai báo kiểu OleVariant
 
Upvote 0
Web KT
Back
Top Bottom