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,140
Giới tính
Nam
Nghề nghiệp
Giáo viên, CEO tại Bluesofts
Lần chỉnh sửa cuối:
Các anh cho em hỏi xíu nhé, mình sử dụng SQL mo Por kết nối qua mạng có ảnh hưởng gì không ta hichic, tự nhiên bình thường không sao Test cái SQL hôm sau nhà mạng xuống nói sửa gì em không biết nữa :confused::confused::confused::confused:, mà hình như kiểm tra thì phải :rolleyes::rolleyes::rolleyes::rolleyes::rolleyes::rolleyes: (hay là trùng hợp ta)
 
Upvote 0
Các anh cho em hỏi xíu nhé, mình sử dụng SQL mo Por kết nối qua mạng có ảnh hưởng gì không ta hichic, tự nhiên bình thường không sao Test cái SQL hôm sau nhà mạng xuống nói sửa gì em không biết nữa :confused::confused::confused::confused:, mà hình như kiểm tra thì phải :rolleyes::rolleyes::rolleyes::rolleyes::rolleyes::rolleyes: (hay là trùng hợp ta)
Chắc là trùng hợp thôi bạn ạ. Port 1433 phải mở để chạy SQL Serve.
 
Upvote 0
Các anh cho em hỏi xíu nhé, mình sử dụng SQL mo Por kết nối qua mạng có ảnh hưởng gì không ta hichic, tự nhiên bình thường không sao Test cái SQL hôm sau nhà mạng xuống nói sửa gì em không biết nữa :confused::confused::confused::confused:, mà hình như kiểm tra thì phải :rolleyes::rolleyes::rolleyes::rolleyes::rolleyes::rolleyes: (hay là trùng hợp ta)
yếu vía thấy cái bóng nghĩ con ma nên giật mình thui mà :p:p:p:p
 
Upvote 0
;);););););););) không phải yếu vía tự Mạng mình có biết gì đâu...... với lại thấy NV bưu điện vào xẹt xẹt 5 phút xong.;););););););););)
 
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
Anh Mạnh !
Anh cho em hỏi chút, Em Download File của Anh về giải nén thì chạy ngon, nhưng khi Em Build lại dự án của Anh và dùng VBLibrary (64bit) vừa mới build thì báo lỗi. Không biết có phải phần mềm của Em Version thấp hơn hay thế nào không biết nữa, Anh kiểm tra giúp Em với. Em đang dùng Win10 và Office 64bit.

Thanks !
 

File đính kèm

  • Loi2.gif
    Loi2.gif
    31.7 KB · Đọc: 9
  • Soft.gif
    Soft.gif
    19.8 KB · Đọc: 9
Lần chỉnh sửa cuối:
Upvote 0
Anh Mạnh !
Anh cho em hỏi chút, Em Download File của Anh về giải nén thì chạy ngon, nhưng khi Em Build lại dự án của Anh và dùng VBLibrary (64bit) vừa mới build thì báo lỗi. Không biết có phải phần mềm của Em Version thấp hơn hay thế nào không biết nữa, Anh kiểm tra giúp Em với. Em đang dùng Win10 và Office 64bit.

Cảm ơn !
thấy bạn cài bản XE2 là build 64bit ok đó ... mình suy đoán là bạn làm sai cái chi đó thôi
Kiển tra lại từng cung đoạn xem sao !!!
Thử lại dòng sau xem sao
Mã:
DataRange = "Data_Nhap"
 
Lần chỉnh sửa cuối:
Upvote 0
Nhờ các Bạn chỉ dùm Mình
trên VB6 khi mình tạo File DLL mình có lưu các thông tin vào đó khi ta dê chuột vào file DLL thì nó nổi lên cái thông tin ta lưu đó lên

Còn trên Delphi mình làm hoài không được ... có tìm trên Google mà nó hướng dẫn kiểu chi vậy làm cũng ko được
vậy Úp bài nhờ các Bạn chỉ dùm cách làm trên Delphi ...
Xin cảm ơn
Hình ảnh mình làm trên VB6 như sau ... sau khi make sang DLL rồi thì dê chuột vào File DLL nó nổi lên thông tin
vb6.PNG
 
Upvote 0
Trong Delphi cho phép dùng For Each nhưng tùy tình huống. Tổng thể bạn dùng cách như sau

Mã:
var Sh:  OleVariant;
      I: Integer;
begin         
    for I:= 1 to Worksheets.Count do
    begin
       sh := Worksheets[I];
       If Sh.CodeName <> 'Sheet6' Then
       begin 
          //Sheet6.Visible := True; ==> Trong Delphi không dùng được đối tượng VBA tự sinh như Sheet6, lệnh này bạn phải làm theo cách khác.
          Sh.Visible := 2;
       end;
    end;
end;
Chào Anh Tuân !
Để học Delphi và áp dụng vào Excel mình, nhờ Anh chuyển giúp em code VBA sang DLL file sau với. Code ở Delphi và các khai báo ở file Excel như thế nào để em có cái nhìn rỏ ràng hơn.

Cảm ơn Anh !
 

File đính kèm

  • Test Excel.xlsb
    14.9 KB · Đọc: 7
Upvote 0
Nhờ các Bạn chỉ dùm Mình
trên VB6 khi mình tạo File DLL mình có lưu các thông tin vào đó khi ta dê chuột vào file DLL thì nó nổi lên cái thông tin ta lưu đó lên

Còn trên Delphi mình làm hoài không được ... có tìm trên Google mà nó hướng dẫn kiểu chi vậy làm cũng ko được
vậy Úp bài nhờ các Bạn chỉ dùm cách làm trên Delphi ...
Xin cảm ơn
Hình ảnh mình làm trên VB6 như sau ... sau khi make sang DLL rồi thì dê chuột vào File DLL nó nổi lên thông tin
View attachment 207618

Trong chuỗi bài dạy của tôi về Lập trình Delphi cơ bản có nói tới việc thiết lập thông tin Project/DLL
https://www.giaiphapexcel.com/diend...-trình-delphi-cơ-bản-từ-bluesofts-net.138736/
Bài đã được tự động gộp:

Chào Anh Tuân !
Để học Delphi và áp dụng vào Excel mình, nhờ Anh chuyển giúp em code VBA sang DLL file sau với. Code ở Delphi và các khai báo ở file Excel như thế nào để em có cái nhìn rỏ ràng hơn.

Cảm ơn Anh !

Học Delphi bạn làm đc nhiều việc cao cấp lắm, những gì làm đc trong VBA chỉ làm phần rất nhỏ. Bạn muốn học thì nên theo từng bài dạy cơ bản này đã rồi sau này tự tìm hiểu thêm. Bạn xem series video tôi hướng dẫn Lập trình Delphi cơ bản tại đây.
https://www.giaiphapexcel.com/diend...-trình-delphi-cơ-bản-từ-bluesofts-net.138736/
Bài đã được tự động gộp:

Chào Anh Tuân !
Để học Delphi và áp dụng vào Excel mình, nhờ Anh chuyển giúp em code VBA sang DLL file sau với. Code ở Delphi và các khai báo ở file Excel như thế nào để em có cái nhìn rỏ ràng hơn.

Cảm ơn Anh !

Về cách tạo DLL tôi đã có video cơ bản ở trên, muốn làm nhiều tình huống bạn hãy bắt đầu từ học ngôn ngữ, ít nhất theo các bài tôi hướng dẫn cơ bản trước sẽ có kiến thức để tự học. Code VBA của bạn tôi đã chuyển thành Delphi

Code VBA:
Mã:
Public Function Test()
Dim ws As Worksheet
Dim sSheetName As String
Dim Last As Long
Dim Lastvalue As String

For Each ws In Worksheets
If ws.Name <> "Sheet1" And ws.Name <> "Sheet2" Then
sSheetName = ws.Name
Last = ws.[B65536].End(xlUp).Row
Lastvalue = ws.Range("B" & Last).Value
MsgBox (sSheetName)
MsgBox (Last)
MsgBox (Lastvalue)
End If
Next ws
End Function

Code Delphi

Mã:
function Test(): OleVariant;
var
  App, ws: OleVariant;
  sSheetName,Lastvalue: String;
  Last: Longint;
  I: Integer;
begin
  //App phai dc truyen vao tu Excel
  for I := 1 to App.Worksheets.Count do
  begin
    ws := App.Worksheets[I];
    if (ws.Name <> 'Sheet1') and (ws.Name <> 'Sheet2') then
    begin
      sSheetName := ws.Name;
      Last := ws.Range['B65536'].End[xlUp].Row;
      Lastvalue := ws.Range['B' + IntToStr(Last)].Value;
      ShowMessage(sSheetName);
      ShowMessage(IntToStr(Last));
      ShowMessage(Lastvalue);
    end;
  end;

end;
 
Lần chỉnh sửa cuối:
Upvote 0
Trong chuỗi bài dạy của tôi về Lập trình Delphi cơ bản có nói tới việc thiết lập thông tin Project/DLL
https://www.giaiphapexcel.com/diendan/threads/hướng-dẫn-lập-trình-delphi-cơ-bản-từ-bluesofts-net.138736/
Bài đã được tự động gộp:



Học Delphi bạn làm đc nhiều việc cao cấp lắm, những gì làm đc trong VBA chỉ làm phần rất nhỏ. Bạn muốn học thì nên theo từng bài dạy cơ bản này đã rồi sau này tự tìm hiểu thêm. Bạn xem series video tôi hướng dẫn Lập trình Delphi cơ bản tại đây.
https://www.giaiphapexcel.com/diend...-trình-delphi-cơ-bản-từ-bluesofts-net.138736/
Bài đã được tự động gộp:



Về cách tạo DLL tôi đã có video cơ bản ở trên, muốn làm nhiều tình huống bạn hãy bắt đầu từ học ngôn ngữ, ít nhất theo các bài tôi hướng dẫn cơ bản trước sẽ có kiến thức để tự học. Code VBA của bạn tôi đã chuyển thành Delphi

Code VBA:
Mã:
Public Function Test()
Dim ws As Worksheet
Dim sSheetName As String
Dim Last As Long
Dim Lastvalue As String

For Each ws In Worksheets
If ws.Name <> "Sheet1" And ws.Name <> "Sheet2" Then
sSheetName = ws.Name
Last = ws.[B65536].End(xlUp).Row
Lastvalue = ws.Range("B" & Last).Value
MsgBox (sSheetName)
MsgBox (Last)
MsgBox (Lastvalue)
End If
Next ws
End Function

Code Delphi

Mã:
function Test(): OleVariant;
var
  App, ws: OleVariant;
  sSheetName,Lastvalue: String;
  Last: Longint;
  I: Integer;
begin
  //App phai dc truyen vao tu Excel
  for I := 1 to App.Worksheets.Count do
  begin
    ws := App.Worksheets[I];
    if (ws.Name <> 'Sheet1') and (ws.Name <> 'Sheet2') then
    begin
      sSheetName := ws.Name;
      Last := ws.Range['B65536'].End[xlUp].Row;
      Lastvalue := ws.Range['B' + IntToStr(Last)].Value;
      ShowMessage(sSheetName);
      ShowMessage(IntToStr(Last));
      ShowMessage(Lastvalue);
    end;
  end;

end;
Vì không phải dân chuyên nên mới vậy mong Anh thông cảm. Em sẽ cố gắng học căn bản, được đến đâu hay đến đó.

Cảm ơn Anh !
 
Lần chỉnh sửa cuối:
Upvote 0
Trong chuỗi bài dạy của tôi về Lập trình Delphi cơ bản có nói tới việc thiết lập thông tin Project/DLL
https://www.giaiphapexcel.com/diendan/threads/hướng-dẫn-lập-trình-delphi-cơ-bản-từ-bluesofts-net.138736/
Cho mình hỏi chút sao File DLL do mình viết bằng Delphi đó từ Excel không check Tools/References/*.DLL được vậy hay phải thực hiện thêm việc gì nữa
 
Upvote 0
Cho mình hỏi chút sao File DLL do mình viết bằng Delphi đó từ Excel không check Tools/References/*.DLL được vậy hay phải thực hiện thêm việc gì nữa

DLL bạn làm theo Video của tôi là loại Standard DLL - chuẩn API đấy nên không phải đăng ký. VB6 tạo DLL là loại Active DLL nên mới phải đăng ký.
 
Upvote 0
DLL bạn làm theo Video của tôi là loại Standard DLL - chuẩn API đấy nên không phải đăng ký. VB6 tạo DLL là loại Active DLL nên mới phải đăng ký.
đúng là vậy nhưng sao từ Excel mình check Tools/References/*.DLL đến file đó nó báo lỗi
Còn File Atools mình lại check bình thường vậy nên mới thắc mắc chút ?!
 
Upvote 0
Nguyễn Duy Tuân
Anh cho em hỏi cái này chúc xíu, sao cái Form child của em khi mở lên thay dổi dữ liệu sao các Control nó cứ Đơ Đơ, phải Refresh hay Update no mới hiện dự liệu ????
 
Upvote 0
đúng là vậy nhưng sao từ Excel mình check Tools/References/*.DLL đến file đó nó báo lỗi
Còn File Atools mình lại check bình thường vậy nên mới thắc mắc chút ?!

DLL của A-Tools mình viết đồng thời hai dạng: Hàm API và ActiveX để xây dựng các Class đối tượng vì thế nó có bộ hàm để tiếp nhận Regsvr32 và Reference.... Các bạn chỉ gọi hàm thì không cần phải Regsvr (vụ này khá phiền phwucs khi mang DLL sang một máy tính mà quyền user của Windows không phải là Admin.
Bài đã được tự động gộp:

Nguyễn Duy Tuân
Anh cho em hỏi cái này chúc xíu, sao cái Form child của em khi mở lên thay dổi dữ liệu sao các Control nó cứ Đơ Đơ, phải Refresh hay Update no mới hiện dự liệu ????

Bạn đưa ví dụ cụ thể, có video hoặc code ngắn mình nhìn mới biết đc.
 
Upvote 0
DLL của A-Tools mình viết đồng thời hai dạng: Hàm API và ActiveX để xây dựng các Class đối tượng vì thế nó có bộ hàm để tiếp nhận Regsvr32 và Reference.... Các bạn chỉ gọi hàm thì không cần phải Regsvr (vụ này khá phiền phwucs khi mang DLL sang một máy tính mà quyền user của Windows không phải là Admin.
Bài đã được tự động gộp:



Bạn đưa ví dụ cụ thể, có video hoặc code ngắn mình nhìn mới biết đc.
Em tạo 1 cái sArrBG và lấy Data từ TADOQuery và em đưa dữ liệu vào List bằng sArrBG Variant
Mã:
  edt_TS.Text := sArrBG[1, Index];
  edt_DVT.Text := sArrBG[3, Index];
LoiRefes.jpg
Khi em nhấn vào List 1 thì List 2 và list 3 sẽ kết nối với SQL để lấy dữ liệu. Sau đó khi nhấn vào List 2 dữ liệu sẽ đưa lên Text box 1-8.
Khi đưa lên Textbox no không lỗi gì hết nó vẫn nhận dữ liệu em đưa vào tuy nhiênn phải thêm edt_DVT.Refresh; từng cái Textbox thì nó mới hiện cái dữ liệu em đưa lên.
 
Upvote 0
Em tạo 1 cái sArrBG và lấy Data từ TADOQuery và em đưa dữ liệu vào List bằng sArrBG Variant
Mã:
  edt_TS.Text := sArrBG[1, Index];
  edt_DVT.Text := sArrBG[3, Index];
View attachment 207820
Khi em nhấn vào List 1 thì List 2 và list 3 sẽ kết nối với SQL để lấy dữ liệu. Sau đó khi nhấn vào List 2 dữ liệu sẽ đưa lên Text box 1-8.
Khi đưa lên Textbox no không lỗi gì hết nó vẫn nhận dữ liệu em đưa vào tuy nhiênn phải thêm edt_DVT.Refresh; từng cái Textbox thì nó mới hiện cái dữ liệu em đưa lên.

Textbox của bạn kiểu/tên component là gì?
 
Upvote 0
Code Delphi

Mã:
function Test(): OleVariant;
var
  App, ws: OleVariant;
  sSheetName,Lastvalue: String;
  Last: Longint;
  I: Integer;
begin
  //App phai dc truyen vao tu Excel
  for I := 1 to App.Worksheets.Count do
  begin
    ws := App.Worksheets[I];
    if (ws.Name <> 'Sheet1') and (ws.Name <> 'Sheet2') then
    begin
      sSheetName := ws.Name;
      Last := ws.Range['B65536'].End[xlUp].Row;
      Lastvalue := ws.Range['B' + IntToStr(Last)].Value;
      ShowMessage(sSheetName);
      ShowMessage(IntToStr(Last));
      ShowMessage(Lastvalue);
    end;
  end;

end;
[/QUOTE]

Anh Tuân cho Em hỏi tí !
- Câu lệnh Last := ws.Range['B65536'].End[xlUp].Row; này khi Debug bị báo lỗi chắc là do Last: Longint nên Delphi không hiểu, Em sữa mà chưa được (Em tạm thời bỏ qua để build thử).
- Sau khi Build DLL em khai báo trong VBA:
Declare PtrSafe Function Test Lib "GetSheet.dll" () As Variant
Sub Main_ShName()
Call Test
End Sub
Nhưng khi chạy thì báo lỗi. Em nghỉ do bị lõi truyền App
//App phai dc truyen vao tu Excel
for I := 1 to App.Worksheets.Count do
...
Nhở Anh xem lại giúp Em với.
Cảm ơn Anh !
 
Upvote 0
Code Delphi

Mã:
function Test(): OleVariant;
var
  App, ws: OleVariant;
  sSheetName,Lastvalue: String;
  Last: Longint;
  I: Integer;
begin
  //App phai dc truyen vao tu Excel
  for I := 1 to OleVariant(App).Worksheets.Count do
  begin
    ws := App.Worksheets[I];
    if (ws.Name <> 'Sheet1') and (ws.Name <> 'Sheet2') then
    begin
      sSheetName := ws.Name;
      Last := ws.Range['B65536'].End[xlUp].Row;
      Lastvalue := ws.Range['B' + IntToStr(Last)].Value;
      ShowMessage(sSheetName);
      ShowMessage(IntToStr(Last));
      ShowMessage(Lastvalue);
    end;
  end;

end;

Anh Tuân cho Em hỏi tí !
- Câu lệnh Last := ws.Range['B65536'].End[xlUp].Row; này khi Debug bị báo lỗi chắc là do Last: Longint nên Delphi không hiểu, Em sữa mà chưa được (Em tạm thời bỏ qua để build thử).
- Sau khi Build DLL em khai báo trong VBA:
Declare PtrSafe Function Test Lib "GetSheet.dll" () As Variant
Sub Main_ShName()
Call Test
End Sub
Nhưng khi chạy thì báo lỗi. Em nghỉ do bị lõi truyền App
//App phai dc truyen vao tu Excel
for I := 1 to App.Worksheets.Count do
...
Nhở Anh xem lại giúp Em với.
Cảm ơn Anh ![/QUOTE]

Bạn phải sửa code hàm trong Delphi để nó đón nhập Application từ VBA (bên ngoài) là
Mã:
function Test(App: IDispatch): OleVariant; stdcall;
var
  App, ws: OleVariant;
  sSheetName,Lastvalue: String;
  Last: Longint;
  I: Integer;
begin
  //App phai dc truyen vao tu Excel
  for I := 1 to OleVariant(App).Worksheets.Count do
  begin
    ws := App.Worksheets[I];
    if (ws.Name <> 'Sheet1') and (ws.Name <> 'Sheet2') then
    begin
      sSheetName := ws.Name;
      Last := ws.Range['B65536'].End[xlUp].Row;
      Lastvalue := ws.Range['B' + IntToStr(Last)].Value;
      ShowMessage(sSheetName);
      ShowMessage(IntToStr(Last));
      ShowMessage(Lastvalue);
    end;
  end;

end;

Trong VBA khai báo hàm là
'Nếu Office 64 bit
Declare PtrSafe Function Test Lib "GetSheet.dll" (App As Application) As Variant


'Nếu Office 32 bit
Declare Function Test Lib "GetSheet.dll" (App As Application) As Variant
Bài đã được tự động gộp:

Cái Tedit chuan cua delphi anh

Vậy phải xem code bạn viết trong sự kiện nào của List2 và bạn gán dữ liệu thế nào? Mình làm Delphi 11 năm nay chưa gặp vấn đề này bao giờ :D
 
Upvote 0
Web KT
Back
Top Bottom