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:
Mình thì lâu lâu rảnh cũng hay mở Dephi lên vọc mấy hàm đơn giản viết thấy chạy ok đó ... tuy nhiên một số code phức tạp viết nó báo lỗi sai hết à
quen viết trên Excel hay VB6 chạy mấy vòng For next thấy đơn giản qua đó lóng ngóng như gà mắc tắc vậy ... giáng lâu lâu vọc chơi 5 năm sau rồi cũng sẻ biết cơ bản à

Không biết có Bạn nào yêu thích Delphi nữa không vô đây nêu vấn đề ta phát động phong trào học Delphi viết thư Viện *.dll cho Excel đi hehe
 
Upvote 0
Mình thì lâu lâu rảnh cũng hay mở Dephi lên vọc mấy hàm đơn giản viết thấy chạy ok đó ... tuy nhiên một số code phức tạp viết nó báo lỗi sai hết à
quen viết trên Excel hay VB6 chạy mấy vòng For next thấy đơn giản qua đó lóng ngóng như gà mắc tắc vậy ... giáng lâu lâu vọc chơi 5 năm sau rồi cũng sẻ biết cơ bản à

Không biết có Bạn nào yêu thích Delphi nữa không vô đây nêu vấn đề ta phát động phong trào học Delphi viết thư Viện *.dll cho Excel đi hehe

Nếu các bạn đã biết một ngôn ngữ rồi thì học ngôn ngữ khác sẽ dễ hơn nhiều. Theo kinh nghiệm cứ học theo trình tự nhưng liên kết kiến thức giữa 2 bên.

1. Cấu trúc của một thủ tục mẹ - Program
2. Cách viết một dòng lệnh, khối lệnh
3. Cách viêt hàm, thủ tục, các tham số nếu có thì khai báo ntn?
4. Các kiểu dữ liệu và cách khai báo hằng số và biến
5. Cách viết khối lệnh IF Then, For, Do While
7. Cách gọi Form, tạo và giải phóng bộ nhớ.

Các nội dung trên mới sang kiến thức cách làm việc với đối tượng COM - Chính là làm việc với các ứng dụng ngoài như Excel, Word,...
 
Upvote 0
@Nguyễn Duy Tuân Cho mình hỏi chút
Sao Bản Delphi của Mình tìm cách Add Target Platforms vào hoài mà không thấy hay bản Delphi 2010 này nó không hổ trợ nhỉ

Xin cảm ơn
Capture.PNG
 
Upvote 0
Từ Delphi XE2 mới cho phép biên dịch 64 bit nhé.
 
Upvote 0
Chào các bác em mới làm quen với Delphi nên nhiều bỡ ngỡ rất mong sự chỉ giáo của mọi người.
Em đang thử hàm kiểm tra Sheet đã tồn tại hay chưa, trong VBA thi ổn nhưng chưa biết xử lý trong Delphi như thế nào.
Đây là Code bằng VBA:
Mã:
Function CheckIfSheetExists(SheetName As String) As Boolean
    Dim WS as Worksheets
      CheckIfSheetExists = False
      For Each WS In Worksheets
        If SheetName = WS.name Then
          CheckIfSheetExists = True
          Exit Function
        End If
      Next WS
End Function
Và đây là code bằng Delphi mà em đang làm dang dở chưa hoàn thành:
Mã:
Uses
    ComObj;

Function CheckIfSheetExists(Var n: String): Boolean;
var
    Ex: OleVariant;
    WS: OleVariant;
begin
    Ex:= GetActiveOleObject('Excel.Application');
    WS:= Ex.Worksheet;
    Result:= False;

       For WS in Ex.WorkSheets do
          begin
          If n = WS.Name Then
            begin
                Result:= True; 
                Exit;
            end;
          end;
end;
Các bác cho em hỏi Với đoạn code trên thì phải khai báo biến như thế nào, và sửa lại code như thế nào để hàm chạy đúng.
 
Upvote 0
To Hieu011
Thấy Bạn cũng yêu thích Delphi và đang bắt đầu tập tành như mình .... Mình mấy tuần nay chỉ đọc và tìm trên Internet thấy có 2 tài liệu theo mình là tạm hay Úp lên đây cho bạn tham khảo và bạn nào đó xét thấy đọc chơi thì đọc .... mong có thêm vài bạn nữa cùng tham gia học Delphi cho nó có 1 chút khí thế

Link gốc Delphi Tips Manager
http://delphi.xcjc.net/viewthread.php?tid=49613
File To úp lên đây ko được bạn vô đó mà tải he .... nếu ai đó xóa Link này vì lý do chi đó ... thì mình úp lên Media cho he
và 1 File *PDF là các code mẫu rất cơ bản
 

File đính kèm

  • Using Databases in Delphi.pdf
    113.5 KB · Đọc: 156
Upvote 0
Chào các bác em mới làm quen với Delphi nên nhiều bỡ ngỡ rất mong sự chỉ giáo của mọi người.
Em đang thử hàm kiểm tra Sheet đã tồn tại hay chưa, trong VBA thi ổn nhưng chưa biết xử lý trong Delphi như thế nào.
Đây là Code bằng VBA:
Mã:
Function CheckIfSheetExists(SheetName As String) As Boolean
    Dim WS as Worksheets
      CheckIfSheetExists = False
      For Each WS In Worksheets
        If SheetName = WS.name Then
          CheckIfSheetExists = True
          Exit Function
        End If
      Next WS
End Function

Các bác cho em hỏi Với đoạn code trên thì phải khai báo biến như thế nào, và sửa lại code như thế nào để hàm chạy đúng.

Code sửa theo Delphi như sau:
Khi viết hàm hay procedure cho Delphi để xử lý Excel, bạn luôn truyền tham số Object mẹ cho nó để trong code xử lý nó hoặc thằng con. Không bao giờ trong hàm hay thủ tục con lại đi nhận Excel.Application -> Code này chỉ dành cho thủ tục đầu tiên hoặc hàm trong DLL gửi nó từ VBA vào.

Mã:
Uses
    ComObj;

Function CheckIfSheetExists(Workbook: OleVariant; shName: String): Boolean;
var
    I: Integer;
begin
 Result:= False;
       For I := 1 to Workbook.Sheets.Count do
       begin
          If Workbook.Sheets[I].Name = shName Then
          begin
                Result:= True;
                Break; //  hoặc dùng Exit (Break là chỉ thoát khỏi vòng lặp; Exit là thoát khỏi hàm luôn;
          end;
       end;
end;
 
Upvote 0
Code sửa theo Delphi như sau:
Khi viết hàm hay procedure cho Delphi để xử lý Excel, bạn luôn truyền tham số Object mẹ cho nó để trong code xử lý nó hoặc thằng con. Không bao giờ trong hàm hay thủ tục con lại đi nhận Excel.Application -> Code này chỉ dành cho thủ tục đầu tiên hoặc hàm trong DLL gửi nó từ VBA vào.

Mã:
Uses
    ComObj;

Function CheckIfSheetExists(Workbook: OleVariant; shName: String): Boolean;
var
    I: Integer;
begin
Result:= False;
       For I := 1 to Workbook.Sheets.Count do
       begin
          If Workbook.Sheets[I].Name = shName Then
          begin
                Result:= True;
                Break; //  hoặc dùng Exit (Break là chỉ thoát khỏi vòng lặp; Exit là thoát khỏi hàm luôn;
          end;
       end;
end;
Trong .Net không dùng vòng lặp nào mà cũng có thể trả về kết quả như trên đó anh.
 
Upvote 0
Code sửa theo Delphi như sau:
Khi viết hàm hay procedure cho Delphi để xử lý Excel, bạn luôn truyền tham số Object mẹ cho nó để trong code xử lý nó hoặc thằng con. Không bao giờ trong hàm hay thủ tục con lại đi nhận Excel.Application -> Code này chỉ dành cho thủ tục đầu tiên hoặc hàm trong DLL gửi nó từ VBA vào.

Mã:
Uses
    ComObj;

Function CheckIfSheetExists(Workbook: OleVariant; shName: String): Boolean;
var
    I: Integer;
begin
 Result:= False;
       For I := 1 to Workbook.Sheets.Count do
       begin
          If Workbook.Sheets[I].Name = shName Then
          begin
                Result:= True;
                Break; //  hoặc dùng Exit (Break là chỉ thoát khỏi vòng lặp; Exit là thoát khỏi hàm luôn;
          end;
       end;
end;
Trong trường hợp mình viết Code ADO trong File *.dll của Delphi để lấy dữ liệu từ File Excel hay Access thì mình cũng phải thực hiện như bạn nói
"bạn luôn truyền tham số Object mẹ cho nó để trong code xử lý nó hoặc thằng con" ... hay sao Bạn
Xin cảm ơn
 
Upvote 0
Trong trường hợp mình viết Code ADO trong File *.dll của Delphi để lấy dữ liệu từ File Excel hay Access thì mình cũng phải thực hiện như bạn nói
"bạn luôn truyền tham số Object mẹ cho nó để trong code xử lý nó hoặc thằng con" ... hay sao Bạn
Xin cảm ơn

Khi dùng ADO để lấy dữ liệu
lúc đó không phụ thuộc vào Excel.Application. SQL làm việc trên Database Engine. Excel là cần Excel ODBC Driver (cái này có sẵn trong Windows hoặc khi cài Office). Nên khi dùng ADO bạn không quan tâm Excel có mở hay hay không, không cần truyền object nào của Excel cả, trừ khi bạn cần truyền Range để nó nhận kết quả như là MyRng.CopyFromRecordset(rst).

Viết code ở môi trường bên ngoài tác động vào ứng dụng ngoài (không phải SQL nhé) như Excel thì buộc DLL hay EXE đó phải nhận điều khiển Application của ứng dụng ngoài đó. CHính là đối tượng Applciation. Từ đây mới đi đến các ngõ ngách của ứng dụng đó.
Bài đã được tự động gộp:

Có thể dùng hàm StrComp để so sánh đó anh, em nghĩ về cơ bản có thể dùng được.

Không được đâu. StrComp chỉ là hàm để so sánh chuỗi thôi. Còn kiểm tra một sheet nào đó có tồn tại hay không vẫn phải dùng vòng lặp để duyệt danh sách, trong mỗi lần duyệt thì kiểm tra sự tồn tại của tên sheet. Chỉ có một cách khách là dùng bẫy lỗi nhưng cách này hơi ẩu, đó là:

Mã:
Function CheckIfSheetExists(Workbook: OleVariant; shName: String): Boolean;
var
 shObj: OleVariant;
begin
 try
     shObj := Workbook.Sheets[shName]; //nếu lỗi thì code sẽ nhảy vào nhánh except
    Result := True; //nếu không lỗi dòng code này sẽ chạy
 except
     Result:= False; //nếu lỗi
 end;
end;
 
Lần chỉnh sửa cuối:
Upvote 0
Khi dùng ADO để lấy dữ liệu
lúc đó không phụ thuộc vào Excel.Application. SQL làm việc trên Database Engine. Excel là cần Excel ODBC Driver (cái này có sẵn trong Windows hoặc khi cài Office). Nên khi dùng ADO bạn không quan tâm Excel có mở hay hay không, không cần truyền object nào của Excel cả, trừ khi bạn cần truyền Range để nó nhận kết quả như là MyRng.CopyFromRecordset(rst).

Viết code ở môi trường bên ngoài tác động vào ứng dụng ngoài (không phải SQL nhé) như Excel thì buộc DLL hay EXE đó phải nhận điều khiển Application của ứng dụng ngoài đó. CHính là đối tượng Applciation. Từ đây mới đi đến các ngõ ngách của ứng dụng đó.
Mình mới bắt đầu tập tành học Delphi thấy cũng triều tượng quá ... Nếu được Bạn cho Mình xin 1 code mẫu Viết trong *.dll xong từ Excel gọi hàm truyền tham số vào lấy dữ liệu từ file khác là Excel hay TableName Access cũng được ... xong gán kết quả lên Range Excel

Thực tế như vậy thì mình mới học được ... vì có học qua trường lớp hay khóa lập trình nào đâu nghe lý thuyết triều tượng là ngáo ngơ à hihi

Kiến thức code két biết được chút chút cơ bản là học từ GPE

Xin cảm ơn Bạn rất nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Khi dùng ADO để lấy dữ liệu
lúc đó không phụ thuộc vào Excel.Application. SQL làm việc trên Database Engine. Excel là cần Excel ODBC Driver (cái này có sẵn trong Windows hoặc khi cài Office). Nên khi dùng ADO bạn không quan tâm Excel có mở hay hay không, không cần truyền object nào của Excel cả, trừ khi bạn cần truyền Range để nó nhận kết quả như là MyRng.CopyFromRecordset(rst).

Viết code ở môi trường bên ngoài tác động vào ứng dụng ngoài (không phải SQL nhé) như Excel thì buộc DLL hay EXE đó phải nhận điều khiển Application của ứng dụng ngoài đó. CHính là đối tượng Applciation. Từ đây mới đi đến các ngõ ngách của ứng dụng đó.
Bài đã được tự động gộp:



Không được đâu. StrComp chỉ là hàm để so sánh chuỗi thôi. Còn kiểm tra một sheet nào đó có tồn tại hay không vẫn phải dùng vòng lặp để duyệt danh sách, trong mỗi lần duyệt thì kiểm tra sự tồn tại của tên sheet. Chỉ có một cách khách là dùng bẫy lỗi nhưng cách này hơi ẩu, đó là:

Mã:
Function CheckIfSheetExists(Workbook: OleVariant; shName: String): Boolean;
var
shObj: OleVariant;
begin
try
     shObj := Workbook.Sheets[shName]; //nếu lỗi thì code sẽ nhảy vào nhánh except
    Result := True; //nếu không lỗi dòng code này sẽ chạy
except
     Result:= False; //nếu lỗi
end;
end;
Trong .Net em dùng thì cũng tạm ổn anh.
Mã:
CheckIfSheetExists = (StrComp(shName, Workbook.Sheets(sName).name, vbTextCompare) = 0)
 
Upvote 0
Thấy bây giờ học C# mới là ngon nhất (C# + JavaScript)
Thử xem rồi... ghiền
Em đoán là anh đang học và biết ít nhiều rồi ... Anh mở thớt mới nêu vấn đề cho em học với ... Em khi rảnh là mê nghiên cứu vì 1 ngày làm việc với máy tính từ 6h sáng To 10h đêm ... có lúc lu xu bu có lúc ko có việc ngồi buồn ngủ nên nghiên cứu và học lập trình thấy có ích
 
Upvote 0
Mình mới bắt đầu tập tành học Delphi thấy cũng triều tượng quá ... Nếu được Bạn cho Mình xin 1 code mẫu Viết trong *.dll xong từ Excel gọi hàm lấy dữ liệu từ file khác là Excel hay TableName Access cũng được ... xong gán kết quả lên Range Excel

Thực tế như vậy thì mình mới học được ... vì có học qua trường lớp hay khóa lập trình nào đâu nghe lý thuyết triều tượng là ngáo ngơ à hihi

Kiến thức code két biết được chút chút cơ bản là học từ GPE

Xin cảm ơn Bạn rất nhiều

Delphi hay .NET không như VBA. Phạm vi can thiệp vào hệ thống ứng dụng rất rộng, mênh mông: lập trình mạng Client - Server, ứng dụng quản trị database (các phần mềm có kết nối CSDL), lập trình Service, Website, DLL (standard dll, activex dll), activex (ocx), Windows API, iOS, Android, Linux, .... Vì thế nếu học mò mẫm kiểu VBA là thấy rất khó. Cần thiết phải học theo một cuốn sách nào đó để lấy cái căn bản, ngôn ngữ của nó là Object Pascal. Việc chọn một kiểu ứng dụng theo đuổi là quan trọng, sau này tiến tiếp. Vì mỗi loại ứng dụng lại có mở kiến thức đi theo. Lập trình DLL để tương tác vào ứng dụng ngoài là vừa dễ vừa rất khó.

Yêu cầu của bạn rất đơn giản với mình , nhưng lại rất khó với người mới học Delphi vì nó bao gồm kiến thức: DLL, ADO. Vậy nên bạn hãy học tưng bước như sau

1. Hãy làm ví dụ lập trình trên VCL Form Application. Trong form này bạn hãy kéo thả các component để lập trình ví dụ hiển thị kết quả một recordset lên DBGrid.
Các component kéo vào Form là: TADOConnection, TADOQuery, TDBGrid
(Phần này bạn search goole theo từ khóa: "ADO in Delphi", "ADO + Excel + Delphi"
2. Làm ví dụ khác không dùng kéo thả, viết code để làm như ví dụ 1 ở trên. Chỉ khi làm được việc này bạn sẽ làm được DLL
3. Lấy kết quả của ví dụ 2 đưa vào DLL giống video tôi hướng dẫn. Đến đây tôi sẽ hướng dẫn bạn chi tiết để ra được DLL.
Bài đã được tự động gộp:

Thấy bây giờ học C# mới là ngon nhất (C# + JavaScript)
Thử xem rồi... ghiền

Trước khi chọn Delphi em đã có gần 2 năm nghiên cứu C#, khả năng sẵn sàng viết một phần mềm hoành tráng trên C# với kết hợp các component DevExpress, hay đủ các hãng khác để có giao diện đẹp. Nói chung tuy vào mục tiêu làm ứng dụng mà ta chọn ngôn ngữ, nhưng Delphi là lựa chọn cuối cùng của em vì nó đáp ứng tất cả các tiêu chuẩn từ lập trình lõi hệ thống API đến lớp ứng dụng cho End user. Với xu thế ứng dụng đa nền tảng thì Delphi giúp ta chỉ học một ngôn ngữ Object Pascal để build cho các nền tảng Windows, MAC OS, Android, Linux. Điều nữa là IoT là lĩnh vực Delphi hướng đến.

Đây là ví dụ mình làm chơi chơi về lập trình mobile cho iPhone. Các bạn xem nhé
Bài đã được tự động gộp:

Trong .Net em dùng thì cũng tạm ổn anh.
Mã:
CheckIfSheetExists = (StrComp(shName, Workbook.Sheets(sName).name, vbTextCompare) = 0)

Đây chính cách để Excel tạo lỗi giống ví dụ về Try...Except mình nói đó.
 
Lần chỉnh sửa cuối:
Upvote 0
Trình độ anh Tuân thì tự học món gì cũng nhanh. Từ VBA, VB6 mà chuyển hẳn sang Delphi mà chả mấy bỡ ngỡ gì :)
 
Upvote 0
Web KT
Back
Top Bottom