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.
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.
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
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
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 !???
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 !???
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.
Đầ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 !