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:
Code với trả két ... chi phí mất thời gian quá
kể từ ngày biết viết cái Hàm kiểu 365 trên VBA ... sau gần 2 năm mới chuyển nó vào Delphi thành công
ko thể ngờ được nó đơn giản lắm chỉ có trên 10 dòng code thôi ... viết 1 cái Hàm chung nhất gán bất cứ 1 Array nào vào là ok

code ngắn lắm nó như sau.. Trong File có sử dụng code của @ThangCuAnh = Cảm ơn lắm lắm
Mã:
Rem https://youtu.be/XICP6C0yJQc
Declare PtrSafe Function ResizeArrayA Lib "MyLibrary64.dll" (ByVal arr As Variant) As Variant
Rem ==========
Function TransArray(ByVal rngIn As Range) As Variant
    Dim arr As Variant
    arr = rngIn.value
    TransArray = ResizeArrayA(arr)
End Function
Rem ==========
Function GetSQLArray(ByVal aPath As Variant, ByVal SQL As Variant) As Variant
    Dim hr As Long
    Dim arr As Variant, ArrDest As Variant
    Dim VB As New MyLibrary.VBLib                                   ''Check References ...MyLibrary64.dll
    arr = DataBaseToArray(aPath, SQL)
    Rem hr = FastTransArrayDirect(arr, ArrDest)                     ''Su dung ham API
    ArrDest = VB.TransposeArray(arr)                                ''Su dung COM
    If IsArray(ArrDest) Then GetSQLArray = ResizeArrayA(ArrDest)
End Function
Rem ========== Tao 1 mang voi so dong va cot tren Range
Function TaoArr(dong As Long, cot As Long) As Variant
    Rem Cu Phap: =TaoArr(10,10) Tao ra 10 dong x 10 cot
    Dim i As Long, J As Long
    ReDim arr(1 To dong, 1 To cot)
    For i = 1 To dong
        For J = 1 To cot
            arr(i, J) = i & "_" & J
        Next
    Next
    TaoArr = ResizeArrayA(arr)
End Function
Rem ==========
Video Demos
Liên kết: https://youtu.be/XICP6C0yJQc

Nếu không có nội dung bạn viết ở đây cùng video demo trên Youtube tại đó thi chắc tôi không quan tâm hàm của bạn làm gì cả. Điều duy nhất tôi chỉ muốn test nó làm đúng như video đó không mà thôi. Nếu không có hay có sự nhầm lẫn thì ta không nói nữa nhé.
 
Upvote 0
Mạnh cũng dễ thương lắm ... xong là thôi ... nghe lời cái anh kia cũng sẻ bớt bớt lại ... sẻ ko làm tổn thương ai nữa
trừ khi thấy nhột nhột thì cũng ấy thôi :p
 
Upvote 0
Gửi @Nguyễn Duy Tuân .... cái này là thiện ý vui vẻ he .... ko ai hack với hóc ở đây cả

nên làm thành sách và chỉ dẫn cái DLL như sau ... cho công chúng biết và cách sử dụng nó .... nếu thấy bài này thừa thì cho vào thùng RÁC ko sao cả he

1640401902563.png

Tải File đính kèm và xem
 

File đính kèm

  • Atools.rar
    157.5 KB · Đọc: 28
Upvote 0
Gửi @Nguyễn Duy Tuân .... cái này là thiện ý vui vẻ he .... ko ai hack với hóc ở đây cả

nên làm thành sách và chỉ dẫn cái DLL như sau ... cho công chúng biết và cách sử dụng nó .... nếu thấy bài này thừa thì cho vào thùng RÁC ko sao cả he

View attachment 270743

Tải File đính kèm và xem

Tôi cũng muốn viết hướng dẫn chi tiết theo từng thành phần của các class trong addinatools.dll mà chưa làm được, phần cũng là chứ biết tools hỗ trợ. Hiện nay tôi chỉ tranh thủ tạo các clip hỗ trợ qua các ví dụ điển hình thôi còn tài liệu PDF hay viết lên website chưa làm được chi tiết.
Nếu có thể bạn chia sẻ tool để Reference như bạn làm thì việc tôi viết tài liệu sẽ đỡ mất nhiều time hơn.
 
Upvote 0
Các anh cho em hỏi chút về tham số mảng truyền từ VBA sang Delphi.
Bên Delphi em viết hàm TestArray như sau:
Mã:
function TestArray(Arr: array of integer): integer ; stdcall;
    var
        x, Tong : integer;
    begin
      Tong:=0;
        for x:= 0 to length(Arr)-1 do begin
            Tong:=Tong + Arr[x];
        end;
        Result := Tong;
    end;
Tham số của em là mảng số nguyên (Ở đây em làm ví dụ đơn giản để hiểu cách truyền tham số mảng), giờ bên VBA em viết lệnh như sau:
Mã:
Declare Function TestArray Lib "TestDLL.DLL" (ByVal Arr As Variant) As Integer

Public Sub Test()
    MsgBox TestArray(Array(1, 3))
End Sub
Nhưng lại không chạy được, Excel tắt luôn. Vậy code của em truyền như thế nào để delphi hiêu tham số Array, cảm ơn các anh trước.
 
Upvote 0
Chào Anh/Chị và các bạn !
Em đang tập chuyển các đoạn code từ VBA sang delphi. Em có chuyển được 1 vài đoạn code cơ bản, tuy nhiên nếu các đoạn code phức tạp thì khi viết e không kiểm soát hết lỗi, mặc dù Build ra DLL thì delphi vẫn cho thì khi đó viết hàm trên VBA nó đơ excel và thoát excel.
Anh/chị cho em hỏi là có cách nào mình 'test' nhanh code trên delphi trước khi build ra DLL không ạ ? (vì khi e viết trên VBA thì nếu có sai gì thì code tự động báo lỗi và chỉ ngay chỗ dòng sai, khi đó em biết e đang sai và sửa lại, còn từ delphi kéo qua VBA thì e không biết nó sai khúc nào, chỗ nào )
Em cảm ơn ạ !
 
Upvote 0
Chào Anh/Chị và các bạn !
Em đang tập chuyển các đoạn code từ VBA sang delphi. Em có chuyển được 1 vài đoạn code cơ bản, tuy nhiên nếu các đoạn code phức tạp thì khi viết e không kiểm soát hết lỗi, mặc dù Build ra DLL thì delphi vẫn cho thì khi đó viết hàm trên VBA nó đơ excel và thoát excel.
Anh/chị cho em hỏi là có cách nào mình 'test' nhanh code trên delphi trước khi build ra DLL không ạ ? (vì khi e viết trên VBA thì nếu có sai gì thì code tự động báo lỗi và chỉ ngay chỗ dòng sai, khi đó em biết e đang sai và sửa lại, còn từ delphi kéo qua VBA thì e không biết nó sai khúc nào, chỗ nào )
Em cảm ơn ạ !

Bạn học cách debug trong Delphi. Trong Delphi và menu "Run" -> Parameters.... Trong cửa sổ "Debugger" khai báo mục "Host Application", nhập đường dẫn Excel hay ứng dụng sử dụng DLL, ví dụ nhập C:\Program Files (x86)\Microsoft Office\root\Office16\Excel.exe
Từ bây giờ cứ khi muốn debug, bạn hãy đặt Breakpoint tại những dòng lệnh muốn kiểm tra, nhấn F9 để Delphi chạy host application và bạn có thể debug DLL hay thứ gì đó.
 
Upvote 0
Bạn học cách debug trong Delphi. Trong Delphi và menu "Run" -> Parameters.... Trong cửa sổ "Debugger" khai báo mục "Host Application", nhập đường dẫn Excel hay ứng dụng sử dụng DLL, ví dụ nhập C:\Program Files (x86)\Microsoft Office\root\Office16\Excel.exe
Từ bây giờ cứ khi muốn debug, bạn hãy đặt Breakpoint tại những dòng lệnh muốn kiểm tra, nhấn F9 để Delphi chạy host application và bạn có thể debug DLL hay thứ gì đó.
Em cảm ơn anh ạ !
 
Upvote 0

Thế thì khác gì lấy búa tự nện vào mặt ‍‍‍‍‍‍ ‍‍‍‍‍‍ ‍‍‍‍‍‍ trên bàn chân. :D :D

1687573454423.png

1687573418312.png

1687573447381.png

Kiếm đôi dép kê mông xem chương trình nghệ thuật nào.
 
Upvote 0
Upvote 0
viết bằng python và C# đi, giờ này làm gì còn ai dùng delphi nữa
Python bây giờ cũng dùng rất nhiều thư viện của C/C++ rồi, thơm lắm các bác ạ
 
Upvote 0
viết bằng python và C# đi, giờ này làm gì còn ai dùng delphi nữa
Python bây giờ cũng dùng rất nhiều thư viện của C/C++ rồi, thơm lắm các bác ạ

Mỗi ngôn ngữ, công cụ có cái đích của nó, có điểm chung, có điểm riêng, nhu cầu nào thì chọn ngôn ngữ, công cụ đó sao cho phù hợp nhất.
Còn riêng bài này bạn khuyên dùng Python và C# mà không nói mục đích, lý do vì sao thì người đọc khó mà ghi nhận. Bạn cần đưa ra lý do có tính so sánh không dùng Delphi so với Python, C# khi mục đích làm gì đó không?

Tôi nói luôn cho bạn nếu đóng gói thư viện ra DLL biên dịch mã máy, xuất hàm API thì dùng Delphi hay C++ là phù hợp nhất đấy nhé. Vì:
+ Biên dịch hoàn toàn ra mã máy - C# là thông dịch, không phải mã máy, Python có thể tạo nhưng rất phức tạp.
+ DLL, EXE tạo ra từ Delphi là độc lập, không cần cõng theo framework.NET hay bộ thư việc đi cùng nếu nó không liên kết tới một thư việc của bên thứ ba khác.
+ Tốc độ ứng dụng, các hàm trong DLL tạo ra từ Delphi, C++ là rất nhanh.

Chia sẻ thêm thông tin về Delphi: dùng để xây dựng các thư viện , các ứng dụng có giao diện rất dễ làm. Tạo các phần mềm chạy trên các nền tảng Windows, iOS, Android, Linux. Các platforms 32, 64-bit.

 
Lần chỉnh sửa cuối:
Upvote 0
python và C# dễ học, dễ debug hơn delphi, cộng đồng hỗ trợ cũng nhiều hơn
còn nếu viết dạng xử lý văn bản và excel thì nên viết trực tiếp thành ứng dụng, nó khá thuần và dễ chịu cho người viết.
Còn việc chạy trên nhiều nên tảng không còn là vấn đề với py và C# nữa rồi
delphi và C++ chỉ nên dùng khi viết các chương trình lớn
 
Upvote 0
python và C# dễ học, dễ debug hơn delphi, cộng đồng hỗ trợ cũng nhiều hơn
còn nếu viết dạng xử lý văn bản và excel thì nên viết trực tiếp thành ứng dụng, nó khá thuần và dễ chịu cho người viết.
Còn việc chạy trên nhiều nên tảng không còn là vấn đề với py và C# nữa rồi
delphi và C++ chỉ nên dùng khi viết các chương trình lớn

Dễ học vờ debug thì là nhận xét rất chủ quan. Là một công cụ lập trình thì debug là tối thiểu phải có, từ cách đây mấy chục năm Pascal, Delphi 1.0 đã debug rồi. Dễ học thì khó với người này lại dễ với người khác, nguồn tài liệu tiếng Anh thì nhiều vô kể. Và vấn đề dễ học hay không không phải lý do chính để bỏ ngôn ngữ này chọn ngôn ngữ kia mà là học để tạo ra cái gì.
Bạn tham gia vào chủ đề này có biết tôi nói về mục đích xây dựng DLL không? Có ví dụ rõ ràng để ứng dụng chạy trong Excel. Bạn bây giờ lại đổi sang nhận xét “chỉ nên dùng Delphi, C++ đêt tạo phần mềm lớn”. Quay lại nhận xét trước đó của bạn là “chuyển sang Python, C# bây giờ ai học Delphi”. Vậy cái bạn bảo chuyên sang đó làm DLL tốt hơn Delphi ở điểm nào?
 
Upvote 0
@Nguyễn Duy Tuân cho em hỏi là: Có cách nào từ trong hàm viết trên delphi mình gán mảng dữ liệu xuống excel không ạ ?
Em đang đi theo hướng viết hàm trong DLL trả về 1 mảng, rồi cho kết quả đó bằng với 1 mảng trên excel rồi mới dán xuống excel. E gửi đoạn code để a xem ạ . E có tìm hiểu thì thấy khởi tạo object: CreateOleObject('Excel.Application'), nhưng cái hàm ở các trang đầu a viết lấy dữ liệu dùng ADO thì không cần khởi tạo object nó vẫn dán kết quả xuống cells active trên excel. E cảm ơn a !z4459615254634_50c55f237f37d629381e89986ed1aa69.jpg
 
Upvote 0
@Nguyễn Duy Tuân cho em hỏi là: Có cách nào từ trong hàm viết trên delphi mình gán mảng dữ liệu xuống excel không ạ ?
Em đang đi theo hướng viết hàm trong DLL trả về 1 mảng, rồi cho kết quả đó bằng với 1 mảng trên excel rồi mới dán xuống excel. E gửi đoạn code để a xem ạ . E có tìm hiểu thì thấy khởi tạo object: CreateOleObject('Excel.Application'), nhưng cái hàm ở các trang đầu a viết lấy dữ liệu dùng ADO thì không cần khởi tạo object nó vẫn dán kết quả xuống cells active trên excel. E cảm ơn a !View attachment 291905

Không ai dùng CreateOleObject khi viết hàm trong DLL cả bạn nhé. Nếu có chỉ là khởi tạo Excel Application để test mà thôi.
Muốn tạo hàm KiemTraTTNH trả về array trong VBA thì bạn phải làm như sau

function KiemTraTTNH(Vung: OleVariant): OleVariant; stdcall;
begin
//Nếu là mảng 2D thì d1, d2 là vị trí dòng bắt đầu và dòng cuối của mảng; c1, c2 là vị trí cột đầu và cột cuối của mảng
Result := VarArrayCreate([d1, d2, c1, c2], varVariant);
//Nếu mảng 1D thì là: Result := VarArrayCreate([c1, c2], varVariant);
Bây giờ bạn chỉ cần làm việc gán các giá trị cho các phần từ mảng:
for I := d1 to d2 do
for J := c1 to c2 do
begin
Result[I, J] :=giá trị
end;
end;
 
Upvote 0
Dạ, tạo ra kết quả mảng 2D trên delphi thì e đã làm được, ý em là cái hàm mình truyền thêm 1 tham số "dán" kết quả mảng 2D này xuống sheet (ví dụ ô A1 )
function KiemTraTTNH(Vung: OleVariant; Range: OleVariant): OleVariant; stdcall;
.....
Range := Mảng kết quả 2D //ý e chỗ này mình dán cái mảng 2D xuống dưới excel tại vị trí mình truyền tham số trên hàm á anh
.....
End;
Cảm ơn anh !
 
Upvote 0
Web KT
Back
Top Bottom