Hướng dẫn liên kết giữa Excel với Visual Basic 6.0

Liên hệ QC

PhanTuHuong

VBA & VB.NET for Excel & AutoCad
Thành viên danh dự
Tham gia
13/6/06
Bài viết
7,170
Được thích
24,602
Theo yêu cầu của các thành viên GPE và bổ sung thêm cho Thư viện, tôi xin gửi tài liệu hướng dẫn liên kết giữa Excel với Visual Basic 6.0. Tài liệu này rất có ích cho ai muốn phát triển lập trình trong Excel qua thư viện liên kết động dll và exe. Đây là 1 chương của cuốn sách Lập trình VBA trong Excel.

http://www.giaiphapexcel.com/forum/showthread.php?t=22105

Mời các bạn tải xuống nhé!
 

File đính kèm

  • VB6 voi Excel.rar
    1 MB · Đọc: 25,074
Lần chỉnh sửa cuối:
Theo yêu cầu của các thành viên GPE và bổ sung thêm cho Thư viện, tôi xin gửi tài liệu hướng dẫn liên kết giữa Excel với Visual Basic 6.0. Tài liệu này rất có ích cho ai muốn phát triển lập trình trong Excel qua thư viện liên kết động dll và exe. Đây là 1 chương của cuốn sách Lập trình VBA trong Excel.

http://www.giaiphapexcel.com/forum/showthread.php?t=22105

Mời các bạn tải xuống nhé!
Em đang thử viết Plug in cho phần mềm SAP (CSI) - phần mềm chuyên tính kết cấu , plug in này là một dạng DLL , nó gần khá giống với việc viết DLL từ VB6 cho excel .
Em đã tải file của anh về , trong file anh có sử dụng hàm SetWindowlongA để gán form VB6 thành userform của Excel với tham số HWND_PARENT ,tuy nhiên em thấy trong win7 cosnt HWND_PARENT không còn tồn tại trong hàm setWindowlongA , thay vào đó ta sẽ sử dụng thẳng hàm API function SETPARENT
PHP:
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
không biết ý kiến anh thế nào !
 
Lần chỉnh sửa cuối:
Em đang thử viết Plug in cho phần mềm SAP (CSI) - phần mềm chuyên tính kết cấu , plug in này là một dạng DLL , nó gần khá giống với việc viết DLL từ VB6 cho excel .
Em đã tải file của anh về , trong file anh có sử dụng hàm SetWindowlongA để gán form VB6 thành userform của Excel với tham số HWND_PARENT ,tuy nhiên em thấy trong win7 cosnt HWND_PARENT không còn tồn tại trong hàm setWindowlongA , thay vào đó ta sẽ sử dụng thẳng hàm API function SETPARENT
PHP:
Private Declare Function SetParent Lib "user32" (ByVal hWndChild As Long, ByVal hWndNewParent As Long) As Long
không biết ý kiến anh thế nào !

Tôi chơi lập trình cũng hơi lâu nhưng luôn dùng SetParent (GetParent để đọc).
Bạn không nên dùng GWL_HWNDPARENT. Chú ý là không có cái gọi là HWND_PARENT

Dùng hay không thì tùy bạn thôi nhưng ngay cả Microsoft cũng khuyên nên dùng SetParent

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx
 
Tôi chơi lập trình cũng hơi lâu nhưng luôn dùng SetParent (GetParent để đọc).
Bạn không nên dùng GWL_HWNDPARENT. Chú ý là không có cái gọi là HWND_PARENT

Dùng hay không thì tùy bạn thôi nhưng ngay cả Microsoft cũng khuyên nên dùng SetParent

http://msdn.microsoft.com/en-us/library/windows/desktop/ms633591(v=vs.85).aspx

máy tính ở nhà em dùng excel 64 bits nên không xài được món DLL 32 bits cho excel, em test thử cho 1 số ứng dụng có hỗ trợ plug in bằng DLL em thấy :
*nếu dùng hàm SetParent thì form VB6 luôn hiện hữu (allways on top) so với ứng dụng đang hiện hành còn nếu dùng tham số GWL_HWNDPARENT thì nó không như vậy : click vào cửa nào thì cửa sổ đó nổi lên.
* Một vấn đề nữa em thấy nếu dùng hàm SETPARENT thì code sau của em không chạy khi click vào nút execute :
giả sử ta vẽ 1 form có kích thước ban đầu là 100x100 , trên form có 1 nút command Execute:
Mã:
sub Form_load()
    form1.with = 100
    form.height = 100
end sub
Mã:
Private g%
'----------------
Private Sub Command1_Click()
    Timer1.Enabled = True
    Timer1.Interval = 10
    g = 0
End Sub
'---------------------------
Private Sub Timer1_Timer()
g = g + 5
Form1.Width = Form1.Width + g
If Form1.Width >= 300 Then Timer1.Enabled = False
End Sub

khi 1 chương trình tham chiéu đến file DLL có chưa form này : nếu em sử dụng hàm setparent --> khi click vào nút execute , form không hề nhúch nhích gì cả .Ngược lại nếu dùng hàm setwindowlongA thì form vẫn hoạt động bình thường khi ta click vào nút execute!
* Không biết là do em viết code trong class bị lỗi , hay là do thuộc tính setparent !???

Không biết ý kiến anh thế nào !
 
máy tính ở nhà em dùng excel 64 bits nên không xài được món DLL 32 bits cho excel, em test thử cho 1 số ứng dụng có hỗ trợ plug in bằng DLL em thấy :
*nếu dùng hàm SetParent thì form VB6 luôn hiện hữu (allways on top) so với ứng dụng đang hiện hành còn nếu dùng tham số GWL_HWNDPARENT thì nó không như vậy : click vào cửa nào thì cửa sổ đó nổi lên.
* Một vấn đề nữa em thấy nếu dùng hàm SETPARENT thì code sau của em không chạy khi click vào nút execute :
giả sử ta vẽ 1 form có kích thước ban đầu là 100x100 , trên form có 1 nút command Execute:
Mã:
sub Form_load()
    form1.with = 100
    form.height = 100
end sub
Mã:
Private g%
'----------------
Private Sub Command1_Click()
    Timer1.Enabled = True
    Timer1.Interval = 10
    g = 0
End Sub
'---------------------------
Private Sub Timer1_Timer()
g = g + 5
Form1.Width = Form1.Width + g
If Form1.Width >= 300 Then Timer1.Enabled = False
End Sub

khi 1 chương trình tham chiéu đến file DLL có chưa form này : nếu em sử dụng hàm setparent --> khi click vào nút execute , form không hề nhúch nhích gì cả .Ngược lại nếu dùng hàm setwindowlongA thì form vẫn hoạt động bình thường khi ta click vào nút execute!
* Không biết là do em viết code trong class bị lỗi , hay là do thuộc tính setparent !???

Không biết ý kiến anh thế nào !

Gì thì cũng phải mục sở thị chứ nói suông khó đoán lắm.
Tôi chả có nhu cầu làm những chuyện này, cũng chả phải làm plug in.

Tôi không hiểu câu

nếu dùng hàm SetParent thì form VB6 luôn hiện hữu (allways on top) so với ứng dụng đang hiện hành còn nếu dùng tham số GWL_HWNDPARENT thì nó không như vậy : click vào cửa nào thì cửa sổ đó nổi lên.

Bởi bản chất của mối liên hệ giữa "Child - Parent" là child luôn "nằm trên" Parent. Nói chính xác thì child được vẽ "trên nền" Parent. Vì thế dịch chuyển Parent thì child "đi theo". Nhìn thấy child thì ắt phải nhìn thấy Parent. Nếu có 1 window khác vd. trong system thì khi click vào thì nó "nổi lên". Parent "chìm xuống" không nhìn thấy nữa thì child cũng đi theo, tức "chìm xuống" không nhìn thấy nữa. Không có chuyện Parent "biến mất" mà child lại nằm tơ hơ trên "đỉnh". Vì Child được "vẽ" trên nền Parent, và Parent, cũng như mọi cửa sổ khác trong system, được "vẽ" trên desktop.

Tôi không hiểu "thì nó không như vậy : click vào cửa nào thì cửa sổ đó nổi lên" nghĩa cụ thể là gì.
 
Gì thì cũng phải mục sở thị chứ nói suông khó đoán lắm.
Tôi chả có nhu cầu làm những chuyện này, cũng chả phải làm plug in.

Tôi không hiểu câu



Bởi bản chất của mối liên hệ giữa "Child - Parent" là child luôn "nằm trên" Parent. Nói chính xác thì child được vẽ "trên nền" Parent. Vì thế dịch chuyển Parent thì child "đi theo". Nhìn thấy child thì ắt phải nhìn thấy Parent. Nếu có 1 window khác vd. trong system thì khi click vào thì nó "nổi lên". Parent "chìm xuống" không nhìn thấy nữa thì child cũng đi theo, tức "chìm xuống" không nhìn thấy nữa. Không có chuyện Parent "biến mất" mà child lại nằm tơ hơ trên "đỉnh". Vì Child được "vẽ" trên nền Parent, và Parent, cũng như mọi cửa sổ khác trong system, được "vẽ" trên desktop.

Tôi không hiểu "thì nó không như vậy : click vào cửa nào thì cửa sổ đó nổi lên" nghĩa cụ thể là gì.

Đầu tiên em xin cảm ơn anh đã xem và trả lời bài viết của em!

Em đã kiểm tra và test trên excel thì mọi thứ ok theo đúng cách anh miêu tả quan hệ "Child và Parent", có lẽ lỗi nằm ở phần mềm và cách em sử dụng hàm API của phầm mềm SAP!
một lần nữa cảm ơn anh Switom !
 
Web KT

Bài viết mới nhất

Back
Top Bottom