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:
Ủng hộ tinh thần ham học hỏi thích khám phá cái mới của bác Kieu manh, cảm ơn sự kiên nhẫn và tận tình chỉ dẫn của bác Tuân. Theo dõi sự trao đổi sôi nỗi trên diễn đàn về Delphi do bác Tuân khởi xướng, em nghĩ thời gian tới Delphi sẽ được nhiều thành viên biết đến nhiều hơn và có thế dùng nó viết những chương trình ứng dụng chạy trên nền Excel.
 
Upvote 0
Thực ra mình khá bận với công việc hiện tại. Việc làm tư liệu Delphi mất khá nhiều thời gian để dùng câu từ giải thích dễ hiểu, cũng cố thu xếp lắm mình với tạo được cái video hướng dẫn kỹ bài 1 về học Delphi căn bản. Bài học này giúp các bạn biết tạo lập môi trường ban đầu để biên dịch ra chương trình đầu tiên cho mình 'Hello Delphi!". Loạt video về hoạc Delphi tôi muốn xây dựng free để đáp ứng bước học cơ bản nhất để từ đó người Việt biết đến và ứng dụng cho đúng cía mình muốn. Và khuyến khích các bạn cần đọc lại ngôn ngữ Object Pascal.
Với những bạn đã lập trình VBA thì lưu ý là: ngôn ngữ chúng ta lập trình chính là VB - Visual Basic. Việc ta lập trình trong VBA chỉ là dùng ngôn ngữ để can thiệp vào các Object của ứng dụng như Workbook, Worksheet, Range...
Với Delphi cũng thế. Ngôn ngữ là Object Pascal, dùng trong Delphi để điều khiển và tạo ra các Object mà thôi. Vậy nên cần học ngô ngữ Pascal mới làm được Delphi.
Làm tiếp bài 2 đi anh, đang hóng. Thấy các câu lệnh nó gần tương đương với Pascal nên em nghĩ nghiên cứu cái này chắc được.
 
Upvote 0
Delphi thì hợp với những người quen với Pascal từ đầu
Delphi hiện ít được phổ biến - không rõ do thương mại, hay do bản chất của nó
 
Upvote 0
Cuối cùng Mình phải sửa code lại vầy nó Chạy rất nhanh ... thử 65536 dòng nó bay cái vèo
Code cũ
Mã:
qry.SQL.Text := sSQL;
Code mới thay thế
Mã:
qry.SQL.Text :=  'SELECT * FROM' + sSQL;

Với Mình ADO chỉ quan tâm 4 cái sau:
1/ Tạo kết nối với các CSDL
2/ Lấy dữ Liệu lên
3/ Ghi dữ liệu xuông
4/ lấy dữ liệu cho vào Mãng ... xong từ đó Cộng, trừ, nhân chia trong mãng .... Còn thuần ADO là thua mà ko dại gì lao vô đó mệt lăm
....
Cảm Ơn Bạn đã chỉ dẫn
Bác @kieu manh cho tôi hỏi lệnh này là sao đây?
Mã:
DataRange = "Data_Nhap$"
Chổ Data_Nhap$ là gì vậy? Tên sheet hay Name?
Tôi áp dụng thử cách của bác toàn báo lỗi và khởi động lại excel không. @kieu manh có thể up source code và file Data luôn để mình tham khảo với. Sửa tới luôi vẫn bị tắt Excel.
 
Upvote 0
Cũng xin nói lại với các bạn lần nữa về đặc điểm phần mềm, thư viện (dll, ocx,..) biên dịch và thông dịch.
Phần mềm hay thư viện (dll, ocx,..) được biên dịch là ra mã máy. Nó được chuyển cho hệ điều hành chạy ngay. Vì thế tốc độ là siêu nhanh. Các phần mềm mà tôi biết để biên dịch là C, C++, Delphi, Swift (của Apple lập trình cho iOS). Phân phối sản phẩm: bạn chỉ mang đúng các file bạn tạo đi ra máy khác là chạy (trong trường hợp bạn không tham chiếu đến thư viện ngoài những cái đã có của HĐH).

Phần mềm hay thư viện (dll, ocx,..) được thông dịch là được trình biên dịch ra mã trung gian, để chạy phần mềm và thư viên loại này hệ điều hành (Windows, Linux,...) phải chạy ngầm một ứng dụng ngầm khác đón nhận thằng thông dịch này rồi mới thực thi. Về mặt vật lý các bạn nhận thấy có sự chuyển giao hai công đoạn. Các trình biên dịch cũng như ngôn ngữ thường thấy cho loại này là: VB6, VBA, Java, C#.NET, VB.NET...*.NET, VFP, Python, Ruby,... Nên cùng một thuật toán khi viết hàm hay ứng dụng thì phần mềm hay thư viện viết dạng này thì tốc độ bao giờ cũng chậm. Phân phối sản phẩm: bạn phải cài trình thông dịch cho ứng dụng của bạn. Ví dụ phải cài Framework.NET, thư viện VB6 là msvbvm60.dll, Java thì phải cài JVM (Java virtual machine). Hệ điều hành đôi khi hỗ trợ cài sẵn những thứ này, nhưng không phải chính xác với phiên bản mà ứng dụng bạn biên dịch yêu cầu (Ví dụ trong hệ điều hành đã tự cài .NET 2.0 nhưng ứng dụng của bạn lại cần .NET 3.5,...) . Ưu điểm rõ nhất với trình thông dịch phần lớn chúng đều dễ lập trình hơn so với C, C++. Nhưng với Delphi lại không phải so sánh dễ hay khó vì Delphi được viết rất dễ hiểu với ngôn ngữ dạy đại trà trong các trường học là Pascal. Đoạn sau nói sẽ nói về ý này nữa.

Việc chọn ngôn ngữ gì để viết sẽ phụ thuộc vào mục đích phân phối của dụng và nhân sự triển khai. Năng lực học và tư liệu hỗ trợ là quan trọng nhưng đôi khi khía cạnh nhìn nhận khá chủ quan. Ví dụ khi tôi chọn Delphi thì thấy rất dễ vì tôi đã học Pascal và tài liệu tôi có thể đọc được tiếng Anh, tiếng Việt cũng có nhưng phần lớn để học căn bản. Nhưng tôi chắc chắn dù bạn chọn ngôn ngữ gì thì bạn không thể không học tiếng Anh để tìm tư liệu trên thế giới. Mỗi ngày học một vài từ thì bạn sẽ có vốn thôi - Theo dạng dịch hiểu. Tài liệu tìm ở đâu? Rất rất nhiều:
https://stackoverflow.com
http://docwiki.embarcadero.com
...
Và điều quan trọng sau khi đã có căn bản, chúng ta hãy xem các ví dụ trọng bộ cài đặt của các phần mềm lập trình. Hãy chạy rồi quan sát, cắt đoạn để thí nghiệm.

Bây giờ nói về dễ và khó, hỗ trợ nhiều hay ít từ hệ thống. Ngày nay các hãng phát triển công nghệ họ đều hỗ trợ rất nhiều các tool, component, thư viện để bạn làm. .NET hay Delphi, Java đều có tất cả. Có người hỏi tôi, em thấy VSTO là của Microsoft có thể lập trình cho Excel hay Office dễ dàng hơn vì đó là cùng một lò. Cái này đúng một vế. Tại sao tôi lại làm được tất cả mọi thứ với Excel và Office với Delphi dù nó khác lò (XLL, OCX, DLL, Add-in, ...)? Câu trả lời là mọi công nghệ tạo ra nó đều phải đạt chuẩn theo hệ điều hành, nó đều có nguyên tắc giao tiếp với nhau. Hiểu đơn giản mọi thiết bị muốn cắm vào nhau thì đều có cổng USB (ví dụ vậy). Nó phải có chuẩn giao tiếp. Trong lập trình thì nó là API, COM, Automation,...

Có người cũng tâm đắc khen soạn thảo code trên .NET nhẹ và mượt. Đúng là rất tuyệt. Tôi đã làm quen với .NET từ Visual Studio 2003 nên rất hiểu. Và ngay bản thân trong .NET thì C# bao giờ cũng ngon nghẻ hơn các thứ khác. Có thể coi C# là ngôn ngữ chuẩn của .NET (cha đẻ của .NET cũng là cha đẻ Delphi. Delphi là anh trai cùng cha khác mẹ). Vấn đề này chỉ quan trọng với người mới học, còn những người đã quen rồi thì họ sẽ biết cài các tool để hỗ trợ hoặc tự tạo ra. Thực tế để làm một phần mềm thì ngôn ngữ lập trình chỉ là sơ cấp để tạo ra các object, thủ tục , hàm con, phục vụ cho các thủ tục chính thừa kế gọi nó. Nếu ai đã lập trình hoàn chỉnh một phần mềm nhìn lại code, trong hàm hay thủ tục chính, chỉ thấy các hàm và thủ tục con bạn đã tạo trong thư viện của bạn. Công việc nói hơi thô là copy và paste là nhiều. Thời gian chủ yếu dành cho tư duy về nghiệp vụ, giải thuật chứ không phải lúc code.
Bây giờ cho tôi sẽ show cho các bạn một nền tảng lập trình phần mềm mà tôi tạo ra từ Delphi để các lập trình viên viết phần mềm không phải code từ con số không. Công nghệ này tôi viết dành cho công ty tôi chuyên sản xuất phần mềm nhanh gọn và đồng nhất, đội lập trình dễ kiểm soát vì cùng thống nhất với kiến trúc chung.

Nội dùng chia sẻ trên tôi chỉ chia sẻ đôi chút về kiến thức mình có để các bạn thêm hiểu về lập trình đa môi trường cũng như vấn đề chọn công cụ lập trình. Và tôi nhấn mạnh lại, mỗi ngôn ngữ lập trình đều có ưu điểm riêng, việc chọn nó để làm sản phẩm cũng do nhu cầu phân phối. Còn dễ hay khó, học ở đâu thì không phải vấn đề đáng bàn nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
Cũng xin nói lại với các bạn lần nữa về đặc điểm phần mềm, thư viện (dll, ocx,..) biên dịch và thông dịch.
Phần mềm hay thư viện (dll, ocx,..) được biên dịch là ra mã máy. Nó được chuyển cho hệ điều hành chạy ngay. Vì thế tốc độ là siêu nhanh. Các phần mềm mà tôi biết để biên dịch là C, C++, Delphi, Swift (của Apple lập trình cho iOS). Phân phối sản phẩm: bạn chỉ mang đúng các file bạn tạo đi ra máy khác là chạy (trong trường hợp bạn không tham chiếu đến thư viện ngoài những cái đã có của HĐH).

.....
.

Đa số các ngôn ngữ lập trình đều dịch ra mã máy, như VB gốc của VBA cũng vậy
Chỉ có diễn đàn này vì sử dụng VBA hỗ trợ excel chỉ là góc nhỏ (ứng dụng áp cho các phần mềm offices), nên thông dịch chỉ chạy khi chạy code - dẫn đến nhiều người hiểu nhầm: cứ nghĩ giấu code, hay mã hóa này nọ (mà cần hiểu bản chất chỉ là scripts cần chi giấu hay mã hóa làm chi)
 
Upvote 0
Bác @kieu manh cho tôi hỏi lệnh này là sao đây?
Mã:
DataRange = "Data_Nhap$"
Chổ Data_Nhap$ là gì vậy? Tên sheet hay Name?
Tôi áp dụng thử cách của bác toàn báo lỗi và khởi động lại excel không. @kieu manh có thể up source code và file Data luôn để mình tham khảo với. Sửa tới luôi vẫn bị tắt Excel.

Một trong các lỗi lằng nhằng là do bạn Mạnh làm sai câu lệnh SQL thôi, ví code sửa theo bạn ấy là không chuẩn.

Toàn bộ code như sau:
Delphi
Mã:
unit Unit2;

interface

uses
  System.SysUtils,
  Data.DB, Data.Win.ADODB;

implementation

function RunSQLToRange(sFullName, sSQL: OleVariant;  Range: OleVariant): Longint; stdcall;
var
  cnn: TADOConnection;
  qry: TADOQuery;
begin
  cnn := TADOConnection.Create(nil);
  try
    cnn.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + sFullName +
                                       ';Extended Properties="Excel 12.0 Xml;HDR=YES";';
    cnn.Connected := True;
    qry := TADOQuery.Create(nil);
    try
      qry.Connection := cnn;
      qry.SQL.Text := sSQL;
      qry.Open;
      Result := Range.CopyFromRecordset(qry.Recordset); //copy data from recordset to Excel range
    finally
      qry.Free;
    end;
  finally
    cnn.Free;
  end;

end;

exports
   RunSQLToRange;

end.

VBA là:

Mã:
Declare Function RunSQLToRange Lib "MyDLL.dll" (ByVal sFullName As Variant, _
                                                ByVal sSQL As Variant, _
                                                ByVal Rng As Variant) As Long
                               

Sub TestADO()
    RunSQLToRange "C:\A-Tools\DATA_DEMO\Example.xls", _
                    "SELECT * FROM KHO", ActiveCell
End Sub
"SELECT * FROM KHO" là câu lệnh SQL. KHO là tên được Define trong vùng dữ liệu của bảng tính.
Bài đã được tự động gộp:

Đa số các ngôn ngữ lập trình đều dịch ra mã máy, như VB gốc của VBA cũng vậy
Chỉ có diễn đàn này vì sử dụng VBA hỗ trợ excel chỉ là góc nhỏ (ứng dụng áp cho các phần mềm offices), nên thông dịch chỉ chạy khi chạy code - dẫn đến nhiều người hiểu nhầm: cứ nghĩ giấu code, hay mã hóa này nọ (mà cần hiểu bản chất chỉ là scripts cần chi giấu hay mã hóa làm chi)

Có ý nghĩa chứ bạn. Thằng VBA thì nhìn cả gan ruột. Thằng biên dịch thì nếu có dịch ngược cũng là dạng ASM hoặc những mã loằng ngoằng.. Bạn thử show code trong các phần mềm đã biên dịch xem thấy gì không? Không nói về crack, patch thì những giải thuật đều mã hóa rồi.
 
Lần chỉnh sửa cuối:
Upvote 0
Bác @kieu manh cho tôi hỏi lệnh này là sao đây?
Mã:
DataRange = "Data_Nhap$"
Chổ Data_Nhap$ là gì vậy? Tên sheet hay Name?
Tôi áp dụng thử cách của bác toàn báo lỗi và khởi động lại excel không. @kieu manh có thể up source code và file Data luôn để mình tham khảo với. Sửa tới luôi vẫn bị tắt Excel.
đang kẹt chút mai úp cho nhé ... đang viết thêm hàm lấy vào Mãng mà lỗi tè le ... xong úp hết cho ta cùng nghiên cứu cho vui he
 
Upvote 0
To @giaiphap
Hôm qua kẹt quá nay mới rảnh chút úp cho he

Mô tả sở qua như sau:
1/ Mạnh xài Windows10_x64 + Office2016_x32

2/ Mạnh có Build Thành 2 bản một bản cho Officex32 và 1 bản cho Officex64

3/ Trên máy mạnh thì nó chạy được file *.dll trong Folder Win32 còn File trong Folder Win64 là lỗi code ... Vì vậy khẳng định Officex32 thì chỉ chạy *.dll Win32

4/ Phiền Bạn nào có xài Officex64 tải về chạy thử File trong Folder Win64 xem nó có chạy tốt ko nhé

5/ Trong File Excel có ghi chi tiết trong đó Mình làm Load File *.dll trong Folder Build nó cho tiện khi build xong mở file Excel lên test code luôn khỏi mất công copy file vào C:\Windows\System32\ *.dll ... Nếu sau này làm thành thư viên rồi thì copy vô đó xóa hết code cho gọn

6/ Có 1 hàm Linktinh đó mục đích là mình thử xem cái *.dll kia nó có chạy hay ko chứ hàm đó ko có giá trị chi cả he :p:D

7/ File VBLibrary.dpr là code đó he ... Chuột Phải\Edit nó mà coi

8/ Tài liệu mạnh có đầy yêu khúc nào mai mốt rảnh coi lại xem cái nào thuận tiện nhất cho người mới nhập môn mạnh úp cho

Cứ từ từ thong thả ta chinh phục nó ... có nhiều tay giáo sư làm 10 mấy năm chưa ra 1 cái đề TÀI khoa học mà mình mới bắt đầu lo chi

9/ Làm phiền @befaint có Officex64 chạy test dùm code trong Folder Win64 và ngược lại xem sao

Học mà chơi ... chơi mà học .... vui vẻ khí thế là tốt
 

File đính kèm

  • Delphi Code.rar
    5.4 MB · Đọc: 110
Lần chỉnh sửa cuối:
Upvote 0
Các bác cho em nhờ vả và hỏi han một chút nhé!
Em có thử một đoạn code trên Delphi dùng để nhân bản sheet trong Excel. Nó chạy trên file .xlsx thì ổn nhưng chạy với file .xlsm thì chậm quá.

Em gửi file nhờ các bác test thử và bác nào biết thì giải thích giúp em nguyên nhân của sự khác nhau này với. (Các bác tải file về và giải nén mở file Excel trước rồi chạy fille FromExcel_p nhé.)
Cảm ơn các bác đã quan tâm.
 

File đính kèm

  • TestExcel.rar
    1.6 MB · Đọc: 41
Lần chỉnh sửa cuối:
Upvote 0
Làm tiếp bài 2 đi anh, đang hóng. Thấy các câu lệnh nó gần tương đương với Pascal nên em nghĩ nghiên cứu cái này chắc được.

Mình để "Bài 1" thì đã có ý làm "Bài 2" :) . Chỉ vì số vất vả phải lo nhiều việc khác nên phải gián đoạn một thời gian (hy vọng không lâu).
 
Upvote 0
Một trong các lỗi lằng nhằng là do bạn Mạnh làm sai câu lệnh SQL thôi, ví code sửa theo bạn ấy là không chuẩn.

Toàn bộ code như sau:
Delphi
Mã:
unit Unit2;

interface

uses
  System.SysUtils,
  Data.DB, Data.Win.ADODB;

implementation

function RunSQLToRange(sFullName, sSQL: OleVariant;  Range: OleVariant): Longint; stdcall;
var
  cnn: TADOConnection;
  qry: TADOQuery;
begin
  cnn := TADOConnection.Create(nil);
  try
    cnn.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + sFullName +
                                       ';Extended Properties="Excel 12.0 Xml;HDR=YES";';
    cnn.Connected := True;
    qry := TADOQuery.Create(nil);
    try
      qry.Connection := cnn;
      qry.SQL.Text := sSQL;
      qry.Open;
      Result := Range.CopyFromRecordset(qry.Recordset); //copy data from recordset to Excel range
    finally
      qry.Free;
    end;
  finally
    cnn.Free;
  end;

end;

exports
   RunSQLToRange;

end.

VBA là:

Mã:
Declare Function RunSQLToRange Lib "MyDLL.dll" (ByVal sFullName As Variant, _
                                                ByVal sSQL As Variant, _
                                                ByVal Rng As Variant) As Long
                             

Sub TestADO()
    RunSQLToRange "C:\A-Tools\DATA_DEMO\Example.xls", _
                    "SELECT * FROM KHO", ActiveCell
End Sub
"SELECT * FROM KHO" là câu lệnh SQL. KHO là tên được Define trong vùng dữ liệu của bảng tính.
Bài đã được tự động gộp:



Có ý nghĩa chứ bạn. Thằng VBA thì nhìn cả gan ruột. Thằng biên dịch thì nếu có dịch ngược cũng là dạng ASM hoặc những mã loằng ngoằng.. Bạn thử show code trong các phần mềm đã biên dịch xem thấy gì không? Không nói về crack, patch thì những giải thuật đều mã hóa rồi.
Nó báo lỗi ngay dòng này nè anh.
To @giaiphap
Hôm qua kẹt quá nay mới rảnh chút úp cho he

Mô tả sở qua như sau:
1/ Mạnh xài Windows10_x64 + Office2016_x32

2/ Mạnh có Build Thành 2 bản một bản cho Officex32 và 1 bản cho Officex64

3/ Trên máy mạnh thì nó chạy được file *.dll trong Folder Win32 còn File trong Folder Win64 là lỗi code ... Vì vậy khẳng định Officex32 thì chỉ chạy *.dll Win32

4/ Phiền Bạn nào có xài Officex64 tải về chạy thử File trong Folder Win64 xem nó có chạy tốt ko nhé

5/ Trong File Excel có ghi chi tiết trong đó Mình làm Load File *.dll trong Folder Build nó cho tiện khi build xong mở file Excel lên test code luôn khỏi mất công copy file vào C:\Windows\System32\ *.dll ... Nếu sau này làm thành thư viên rồi thì copy vô đó xóa hết code cho gọn

6/ Có 1 hàm Linktinh đó mục đích là mình thử xem cái *.dll kia nó có chạy hay ko chứ hàm đó ko có giá trị chi cả he :p:D

7/ File VBLibrary.dpr là code đó he ... Chuột Phải\Edit nó mà coi

8/ Tài liệu mạnh có đầy yêu khúc nào mai mốt rảnh coi lại xem cái nào thuận tiện nhất cho người mới nhập môn mạnh úp cho

Cứ từ từ thong thả ta chinh phục nó ... có nhiều tay giáo sư làm 10 mấy năm chưa ra 1 cái đề TÀI khoa học mà mình mới bắt đầu lo chi

9/ Làm phiền @befaint có Officex64 chạy test dùm code trong Folder Win64 và ngược lại xem sao

Học mà chơi ... chơi mà học .... vui vẻ khí thế là tốt
Mình sử dụng Win 7 32bit và Office 2013 32bit chạy ngon @kieu manh ơi.

Các bác cho em nhờ vả và hỏi han một chút nhé!
Em có thử một đoạn code trên Delphi dùng để nhân bản sheet trong Excel. Nó chạy trên file .xlsx thì ổn nhưng chạy với file .xlsm thì chậm quá.

Em gửi file nhờ các bác test thử và bác nào biết thì giải thích giúp em nguyên nhân của sự khác nhau này với. (Các bác tải file về và giải nén mở file Excel trước rồi chạy fille FromExcel_p nhé.)
Cảm ơn các bác đã quan tâm.
File của bạn báo lỗi thế này.
Hinh.png
Sao bạn không chia sẻ code luôn như @kieu manh vậy đó.
 
Upvote 0
Mình tìm được nguồn video hướng dẫn về Delphi

Các bạn mới học Delphi hoặc còn chưa biết Class, Form, IF là gì thì xem video này chỉ để cho vui chứ không học được gì đâu nhé. Độp một cái vừa xem các loại control, cả database thì chỉ có tẩu hỏa nhập ma mất :). Ngay cả cách đặt tên các controls trên form còn sai nguyên tắc rồi.
Bài đã được tự động gộp:

Nó báo lỗi ngay dòng này nè anh.

Code mình share là lấy nguyên từ DLL của mình đã biên dịch đó. Sai có thể bạn copy cả chữ "unit2" vào code ?. Bạn chỉ copy code ở mục USES và toàn bộ hàm thôi.
 
Upvote 0
[QUOTE="giaiphap, post: 880553, member: 5752"
File của bạn báo lỗi thế này.
View attachment 203865
Sao bạn không chia sẻ code luôn như @kieu manh vậy đó.[/QUOTE]
Nó báo lỗi vậy có thể là do bác chưa mở file Excel "Vidu 1A.xlsx" hoặc "Vidu 1B.xlsm", Chương trình chỉ chạy với 2 file này. Về code thì em đang viết còn dang dở lắm, khi nào thấy ổn thì sẽ chia sẻ ngay thôi, em không muốn úp nhiều file chưa hoàn chỉnh làm rác diễn đàn.
 
Lần chỉnh sửa cuối:
Upvote 0
To @giaiphap Từ code @Nguyễn Duy Tuân cho đó ta học tùy biến 1 chút he ?!

1/ Viết thêm code vô đó cho nó kiểm tra nếu Excel 2003 thì chạy khúc này Else chạy 2016 chẳng hạn
2/ Sử dụng phức thức Getrows lấy dữ liệu vào mãng
3/ Ghi dữ liêu xuống ...

Qua 3 mục trên xong cơ bản đã xài ADO tạm ok rồi đó he

Khai báo lấy Ver như sau
Mã:
Var
  Conn: TADOConnection;
  qry: TADOQuery;
  Excel: OLEVariant;
  ExcelVersion: string;
begin
Excel := CreateOLEObject('EXCEL.Application');
ExcelVersion := Excel.version

Xong khó khăn cái chi ta hỏi tiếp he .... Mạnh ko biết là hỏi thẳng tưng à :p:D
 
Upvote 0
To @giaiphap Từ code @Nguyễn Duy Tuân cho đó ta học tùy biến 1 chút he ?!

1/ Viết thêm code vô đó cho nó kiểm tra nếu Excel 2003 thì chạy khúc này Else chạy 2016 chẳng hạn
2/ Sử dụng phức thức Getrows lấy dữ liệu vào mãng
3/ Ghi dữ liêu xuống ...

Qua 3 mục trên xong cơ bản đã xài ADO tạm ok rồi đó he

Khai báo lấy Ver như sau
Mã:
Var
  Conn: TADOConnection;
  qry: TADOQuery;
  Excel: OLEVariant;
  ExcelVersion: string;
begin
Excel := CreateOLEObject('EXCEL.Application');
ExcelVersion := Excel.version

Xong khó khăn cái chi ta hỏi tiếp he .... Mạnh ko biết là hỏi thẳng tưng à :p:D
Code của bác và của @Nguyễn Duy Tuân ở #47 chạy đều ngon, còn bài này bổ xung thêm kiểm tra phiên bản Excel nửa là tốt quá rồi. Nhưng những đoạn code này chủ yếu để xem cho thấy nó hoạt động ra sao thôi, chứ mới nghiên cứu nó mà xem nhiều quá hơi bị khó thậm chí code của ở #47 mò cả buổi nó mới chạy được do đưa vào ứng dụng báo lỗi mãi không chạy được.
 
Upvote 0
Code của bác và của @Nguyễn Duy Tuân ở #47 chạy đều ngon, còn bài này bổ xung thêm kiểm tra phiên bản Excel nửa là tốt quá rồi. Nhưng những đoạn code này chủ yếu để xem cho thấy nó hoạt động ra sao thôi, chứ mới nghiên cứu nó mà xem nhiều quá hơi bị khó thậm chí code của ở #47 mò cả buổi nó mới chạy được do đưa vào ứng dụng báo lỗi mãi không chạy được.

Bạn xem video bài trên cùng của mình, sau đó copt đoạn code của mình vào gồm 2 phần copy:
1. DELHI. Khai báo ở mục USES
Mã:
uses
  System.SysUtils,
  Data.DB, Data.Win.ADODB;
2. DELPHI. Copy toàn bộ code của hàm chạy SQL từ file Excel đổ vào sheet từ Recordset
Mã:
function RunSQLToRange(sFullName, sSQL: OleVariant;  Range: OleVariant): Longint; stdcall;
var
  cnn: TADOConnection;
  qry: TADOQuery;
begin
  cnn := TADOConnection.Create(nil);
  try
    cnn.ConnectionString := 'Provider=Microsoft.ACE.OLEDB.12.0;Data Source=' + sFullName +
                                       ';Extended Properties="Excel 12.0 Xml;HDR=YES";';
    cnn.Connected := True;
    qry := TADOQuery.Create(nil);
    try
      qry.Connection := cnn;
      qry.SQL.Text := sSQL;
      qry.Open;
      Result := Range.CopyFromRecordset(qry.Recordset); //copy data from recordset to Excel range
    finally
      qry.Free;
    end;
  finally
    cnn.Free;
  end;

end;

3. DELPHI. Nhánh EXPORTS thêm khai báo tên hàm
Mã:
exports
   RunSQLToRange;
Lưu ý nếu trong DLL có nhiều hàm cần xuất ra bên ngoài (API) thì liệt kê danh sách bằng dấu phảy (,)

4. Biên dịch như trong video (theo 32 hoặc 64-bit) , copy DLL vào đúng thư mục hệ thống. Trong file Excel khai báo hàm API của DLL đã biên dịch và test code
Mã:
Declare Function RunSQLToRange Lib "MyDLL.dll" (ByVal sFullName As Variant, _
                                                ByVal sSQL As Variant, _
                                                ByVal Rng As Variant) As Long
                             

Sub TestADO()
    RunSQLToRange "C:\A-Tools\DATA_DEMO\Example.xls", _
                    "SELECT * FROM KHO", ActiveCell
End Sub

Nếu bạn làm được toàn bộ việc này chắc chắn tinh thần sẽ thăng hoa gấp 100 lần :).
 
Upvote 1
Web KT
Back
Top Bottom