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,649
Được thích
10,138
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Nhờ Các Bạn chỉ cho Mạnh Học 1 chút

1/ trên Form Delphi Mình tạo 1 Cái Button xong chèn code sau vào thì nó chạy tốt
Có nghĩa mình gán vào cái Label2 = Kiều Mạnh

Mã:
procedure TSQLDataOffice.GetSheetNameClick(Sender: TObject);
begin
  Label2.Caption:= 'Kiều Mạnh';
//TestLabe1 //Lỗi code không có chạy
end;

2/ Vậy trong 1 Unit khác không thuộc Unit của Form Mình có Uses Unit1( Unit1 của Form )
xong mình khai báo như sau nó không có chạy code mà còn báo Lỗi
Mã:
procedure TestLabe1;
var
  Label2: TLabel;
  Label3: TLabel;
begin
  Label2.Caption := 'Kiều Mạnh';
end;

3/ Mình thử tiếp như sau cũng không có chạy code mà còn báo lỗi
Mã:
procedure TestLabe2(Label2: TLabel);
begin
  Label2.Caption := 'Kiều Mạnh';
end;

Vậy nhờ các Bạn chỉ dùm Mạnh từ 1 Unit khác không phải Unit của Form mà khai báo sử dụng như mục 2 và 3 mà chạy code tốt
Xin cảm ơn
 
Lần chỉnh sửa cuối:
Upvote 0
vậy là Mạnh đã làm xong hoàn chỉnh SQL cho Office theo mấy gợi ý của Bạn @huuduy.duy

1/ Xử lý lỗi người dùng gõ sai Range trên Form xong ( cà chua thật )
2/ Tốc độ truy xuất dữ liệu khá nhanh ... Tùy chọn các Cột Or Filedname cũng thế ... xài ADO quá đơn giản chỉ tích chọn là xong
3/ Có thời gian Mạnh sẻ bổ sung thêm nhiều tùy chọn nữa
4/ Khi nhấn Copy SQL thì nó đã lưu trong Clipboard xong muốn dán nó vào đâu thì thuộc về Bạn
...
Chuyển qua Viết SQL Server Ms ... xong qua TCPIP ( TCPIP cái này hên và xui ) ....
Trình code Delphi thấy tiến bộ thêm 1 chút ... xài Hàm + Sub móc nhau lằng nhằng mỳ tôm luôn -0-0-0-
Cảm Ơn các Bạn đã chỉ Mạnh học Delphi .... ko ngờ được luôn là chưa xài Form Delphi bao giờ chỉ có 1 to 2 tuần mà làm đủ thứ trên Form Delphi

OK.png

Bản hoàn thiện 90% Ai iU tải về mà xài
 

File đính kèm

  • SQLForDataOffice.rar
    1.7 MB · Đọc: 26
Lần chỉnh sửa cuối:
Upvote 0
Mạnh không viết Virus trong DLL của Delphi ... thế mà khi check Virus Total nó cứ keo có Virus
Úp bài hỏi trang Delphi Developer thì có tay tây phán tào lao và hầu như hiểu sai hết có mấy câu gần đúng

Tay_bố láo.PNG


Cuối cùng Mạnh đã biết tại sao mà nó báo có Virus mà mình không có Viết Virus ... Oan gia đã được tự giải đáp ...
Lưu lên đây làm kỷ niệm mò code

Nó cứ báo có Virus sau khi check Virus Total ... một số AV dị ứng sẻ xóa file đó mà nó không phải là virus quả thực mấy cái AV tào lao thật ... kiểu như BKV Free của Anh quãng he

Báo Virus.png
 
Upvote 0
Mọi người cho hỏi vì sao truyền biến chuỗi từ VBA (String) sang Delphi (ShortString) bị cắt mất một ký tự đầu tiên. Mình đã xử lý bằng cách cho thêm một khoảng trắng vào đầu chuỗi nhưng thấy không hay lắm.
[ lại thêm một người "lao vào" Delphi, hihi ]
 
Upvote 0
Mọi người cho hỏi vì sao truyền biến chuỗi từ VBA (String) sang Delphi (ShortString) bị cắt mất một ký tự đầu tiên. Mình đã xử lý bằng cách cho thêm một khoảng trắng vào đầu chuỗi nhưng thấy không hay lắm.
[ lại thêm một người "lao vào" Delphi, hihi ]

Kiểu ShortString Delphi dành độ rộng tối đa chỉ 255 ký tự, ký tự đầu tiên nó chứa độ rộng của chuỗi nó chứa. Bạn nên dùng kiểu String trong Delphi nếu không có lý do đặc biệt.
 
Upvote 0
Kiểu ShortString Delphi dành độ rộng tối đa chỉ 255 ký tự, ký tự đầu tiên nó chứa độ rộng của chuỗi nó chứa. Bạn nên dùng kiểu String trong Delphi nếu không có lý do đặc biệt.
Mình cũng thích String nhưng máy mình bị lỗi gì đó, nếu dùng string thì tiếng Việt có dấu trong Excel biến thành tiếng Nhật trong ShowMessage Delphi (khi copy từ code VBA sang Word cũng bị tương tự). Với lại khi tạo một chương trình mới, Delphi cũng ghi chú vậy mà: "... To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters."
 
Upvote 0
Mình cũng thích String nhưng máy mình bị lỗi gì đó, nếu dùng string thì tiếng Việt có dấu trong Excel biến thành tiếng Nhật trong ShowMessage Delphi (khi copy từ code VBA sang Word cũng bị tương tự). Với lại khi tạo một chương trình mới, Delphi cũng ghi chú vậy mà: "... To avoid using BORLNDMM.DLL, pass string information using PChar or ShortString parameters."
xem lài bài thớt này khoãng trang 30 to 45 gì đó là làm Ok ... cái méc xịt bốc của mình ý
 
Upvote 0
Truyền WideString (BSTR) qua lại cho đơn giản. WideString là string ở tầng Windows, cấp phát = SysAllocStringXXX, giải phóng = SysFreeString.
VBA và Delphi không quản lý memory của các WideString. Windows quản lý,ông dll gì đó làm, cache alloc/free, quên rầu :D
 
Upvote 0
Truyền WideString (BSTR) qua lại cho đơn giản. WideString là string ở tầng Windows, cấp phát = SysAllocStringXXX, giải phóng = SysFreeString.
VBA và Delphi không quản lý memory của các WideString. Windows quản lý,ông dll gì đó làm, cache alloc/free, quên rầu :D
Cảm ơn các bạn, vụ này mình xử lý được rồi.

Mình hỏi thêm các bạn vấn đề khác: Lúc đầu mình viết hàm trong dll bằng VB6, do không sử dụng được trên Excel64 nên mình mới tự học để chuyển qua Dephi.
Mình tạo dll (API - để thay đổi đường dẫn chứa file dll mà không cần Reg). Mình Build thử ra hai loại là 64bit và 32bit, nhưng loại 64bit không chạy được trên Windows 64, trong khi loại dll 32 thì chạy tốt trên Windows 64. Nếu vậy thì cũng như dll của VB6 chớ chưa hơn được, hic!
 
Upvote 0
Cảm ơn các bạn, vụ này mình xử lý được rồi.

Mình hỏi thêm các bạn vấn đề khác: Lúc đầu mình viết hàm trong dll bằng VB6, do không sử dụng được trên Excel64 nên mình mới tự học để
dòng này trên GPE này từ trước tới nay nói chưa có đúng ... xem lại các bài Mạnh Úp trên GPE tải về test thử xem chạy tốt trên Officex32 và x64 trên duy nhất có 1 file

Tại bạn chưa biết làm cho nó sử dụng được trên Officex64 chứ ko phải là ko sử dụng được nhé
nó rất đơn giản bản thân VB6 nó có luôn mà ít ai biết thế thôi

 
Upvote 0
dòng này trên GPE này từ trước tới nay nói chưa có đúng ... xem lại các bài Mạnh Úp trên GPE tải về test thử xem chạy tốt trên Officex32 và x64 trên duy nhất có 1 file

Tại bạn chưa biết làm cho nó sử dụng được trên Officex64 chứ ko phải là ko sử dụng được nhé
nó rất đơn giản bản thân VB6 nó có luôn mà ít ai biết thế thôi

1. Bạn chỉ ra cách để mình học với
2. Hàm trong dll (VB6) không thể sử dụng kiểu API ?
 
Upvote 0
1. Bạn chỉ ra cách để mình học với
2. Hàm trong dll (VB6) không thể sử dụng kiểu API ?
Thì cứ thử sức mò xem sao nó dễ lắm như ăn kẹo mút vậy thôi
đang tính viết xong cái SQL Server xong thì lập 1 thớt mới hướng dẫn các bạn GPE cách dùng cho Officex64 đấy
Trong khi chờ đợi hãy thử mò đi xem sao nha ...
mà qua Delphi đi nó hay hơn VB6 nhiều mà còn luyến tiếc chi huyền thoại vb6 1 thời vang bóng ???!!!
 
Upvote 0
Đây là video hướng dẫn cách tạo DLL trên Delphi nhưng sử dụng trong VBA, Excel. Đây là phương pháp lập trình chuyên nghiệp nhưng không phải là khó. Giúp bạn bảo mật code của phần mềm tốt hơn.
em chào thầy, đầu tiên em chúc thầy có một buổi tối vui vẻ bên gia đình và người thân! thầy cho em hỏi vài chỗ nhé thầy
Ý 1: em mới bập bọe với Delphi, hôm nay ngồi làm theo clip tại bài 1 của thầy và gõ theo như này
1599309643631.png
Sau khi Build ra thư mục này
1599309690488.png
và em copy MyDLL.dll vào thư mục
1599309729614.png
Sau đó em vào Excel và khai báo như này
1599309766425.png
Trên Sheet em gõ như này và ra kết quả như này! vậy em làm sai chỗ nào mà không ra được kết quả ạ
1599309822155.png1599309834699.png
Mong sớm nhận được trợ giúp từ thầy hoặc các bạn, các anh, các chị nào biết chỉ em với. cái này còn không được sao em quậy banh chành Excel đc nữa. hu....hu.....

Ý 2:
em có lưu file Excel tại đường dẫn này
1599310052081.png
em được một sư huynh chỉ code như này để load MyDLL.dll vào SysWOW64 luôn, không cần copy thủ công nữa
1599310161711.png
nhưng khi chạy Auto_Open thì lỗi
1599310206904.png
 
Upvote 0
em chào thầy, đầu tiên em chúc thầy có một buổi tối vui vẻ bên gia đình và người thân! thầy cho em hỏi vài chỗ nhé thầy
Ý 1: em mới bập bọe với Delphi, hôm nay ngồi làm theo clip tại bài 1 của thầy và gõ theo như này
View attachment 244921
Sau khi Build ra thư mục này
View attachment 244922
và em copy MyDLL.dll vào thư mục
View attachment 244923
Sau đó em vào Excel và khai báo như này
View attachment 244924
Trên Sheet em gõ như này và ra kết quả như này! vậy em làm sai chỗ nào mà không ra được kết quả ạ
View attachment 244925View attachment 244926
Mong sớm nhận được trợ giúp từ thầy hoặc các bạn, các anh, các chị nào biết chỉ em với. cái này còn không được sao em quậy banh chành Excel đc nữa. hu....hu.....

Ý 2:
em có lưu file Excel tại đường dẫn này
View attachment 244927
em được một sư huynh chỉ code như này để load MyDLL.dll vào SysWOW64 luôn, không cần copy thủ công nữa
View attachment 244928
nhưng khi chạy Auto_Open thì lỗi
View attachment 244929
tham khảo xem sao nhé

Thử xem
Mã:
#If VBA7 And Win64 Then
    Declare PtrSafe Function GetSumDLL Lib "MyDLL.dll" (ByVal a As Double, ByVal b As Double) As Double
#Else
    Rem Declare Function GetSumDLL Lib "MyDLL.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
#End If


Public Function MySum(ByVal x As Double, ByVal y As Double) As Double
    MySum = GetSumDLL(x, y)
End Function
1/ MySum
Capture.PNG

2/ GetSumDLL
Capture2.PNG
 
Lần chỉnh sửa cuối:
Upvote 0
tham khảo xem sao nhé

Thử xem
Mã:
#If VBA7 And Win64 Then
    Declare PtrSafe Function GetSumDLL Lib "MyDLL.dll" (ByVal a As Double, ByVal b As Double) As Double
#Else
    Rem Declare Function GetSumDLL Lib "MyDLL.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
#End If


Public Function MySum(ByVal x As Double, ByVal y As Double) As Double
    MySum = GetSumDLL(x, y)
End Function
1/ MySum
View attachment 244939

2/ GetSumDLL
View attachment 244940

Bạn bỉ “And Win64” đi nhé.
Bài đã được tự động gộp:

em chào thầy, đầu tiên em chúc thầy có một buổi tối vui vẻ bên gia đình và người thân! thầy cho em hỏi vài chỗ nhé thầy
Ý 1: em mới bập bọe với Delphi, hôm nay ngồi làm theo clip tại bài 1 của thầy và gõ theo như này
View attachment 244921
Sau khi Build ra thư mục này
View attachment 244922
và em copy MyDLL.dll vào thư mục
View attachment 244923
Sau đó em vào Excel và khai báo như này
View attachment 244924
Trên Sheet em gõ như này và ra kết quả như này! vậy em làm sai chỗ nào mà không ra được kết quả ạ
View attachment 244925View attachment 244926
Mong sớm nhận được trợ giúp từ thầy hoặc các bạn, các anh, các chị nào biết chỉ em với. cái này còn không được sao em quậy banh chành Excel đc nữa. hu....hu.....

Ý 2:
em có lưu file Excel tại đường dẫn này
View attachment 244927
em được một sư huynh chỉ code như này để load MyDLL.dll vào SysWOW64 luôn, không cần copy thủ công nữa
View attachment 244928
nhưng khi chạy Auto_Open thì lỗi
View attachment 244929

LoadLibrary trả về số Long 8 byte trên Office 64-bit vù thế bạn cần đổi Long thành LongPtr, dùng kỹ thuật #If VBA7 Then để điều hướng VBA với các phiên bản Office. Về ý tưởng của bạn “không cần copy bằng tay” là sai.
 
Lần chỉnh sửa cuối:
Upvote 0
tham khảo xem sao nhé

Thử xem
Mã:
#If VBA7 And Win64 Then
    Declare PtrSafe Function GetSumDLL Lib "MyDLL.dll" (ByVal a As Double, ByVal b As Double) As Double
#Else
    Rem Declare Function GetSumDLL Lib "MyDLL.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
#End If


Public Function MySum(ByVal x As Double, ByVal y As Double) As Double
    MySum = GetSumDLL(x, y)
End Function
1/ MySum
View attachment 244939

2/ GetSumDLL
View attachment 244940
Nhưng trong clip đâu cần thông qua hàm trung gian như vậy a.
 
Upvote 0
Bạn bỉ “And Win64” đi nhé.
Bài đã được tự động gộp:



LoadLibrary trả về số Long 8 bit trên Office 64-bit vù thế bạn cần đổi Long thành LongPtr, dùng kỹ thuật #If VBA7 Then để điều hướng VBA với các phiên bản Office. Về ý tưởng của bạn “không cần copy bằng tay” là sai.
Cho mình hỏi chút là sao khi mình thay dổi đối Số Hàm Mysum trên Cells A1 thì Excel nó đơ xong thoát luôn
1599366698629.png
 
Upvote 0
Nhưng trong clip đâu cần thông qua hàm trung gian như vậy a.

Tôi có bói gì đến LoadLibrary đâu. Cả link bạn trích dẫn cũng không liên quan gì.
Bài đã được tự động gộp:

Cho mình hỏi chút là sao khi mình thay dổi đối Số Hàm Mysum trên Cells A1 thì Excel nó đơ xong thoát luôn
View attachment 244942

Bạn mở code delphi và khai báo trên VBA xem nào.
 
Upvote 0
Bạn mở code delphi và khai báo trên VBA xem nào.
Code Trên Delphi
Mã:
library MyDLL;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
  System.SysUtils,
  System.Classes;

{$R *.res}

Function GetSumDLL(a, b: double): double; stdcall;
begin
  Result := a + b;
end;

exports
  GetSumDLL;

begin

end.

Code Trên VBA
Mã:
Declare PtrSafe Function GetSumDLL Lib "MyDLL.dll" (ByVal a As Double, ByVal b As Double) As Double

Public Function MySum(ByVal x As Double, ByVal y As Double) As Double
    MySum = GetSumDLL(x, y)
End Function
 
Upvote 0
Web KT
Back
Top Bottom