Lấy handle của file Excel đang mở dùng VB6

Liên hệ QC

vba_gpe

Thành viên thường trực
Tham gia
15/12/10
Bài viết
296
Được thích
44
Nghề nghiệp
Thất nghiệp
Gửi anh chị
- Em được biết, thông thường, để liên kết với Excel bằng VB6 thì trong VB6 phải tạo ra một Workbook mới thông qua lệnh :
Mã:
Dim OXlApp As Excel.Application
Set OXlApp = CreateObject("Excel.Application")
OXlApp.Workbooks.Add

Hiện nay em đang mở 1 file Excel. Để lấy được handle của Workbook em đang mở muốn VB6 hiểu và thao tác trên workbook đó thì ta làm sao ạ!

***Trường hợp của em: đang mở một addin, muốn dùng VB6 để tắt addin và xóa addin đó ra khỏi danh sách.

Mong chỉ giáo.

Trân trọng.
 
Gửi anh chị
- Em được biết, thông thường, để liên kết với Excel bằng VB6 thì trong VB6 phải tạo ra một Workbook mới thông qua lệnh :
Mã:
Dim OXlApp As Excel.Application
Set OXlApp = CreateObject("Excel.Application")
OXlApp.Workbooks.Add

Hiện nay em đang mở 1 file Excel. Để lấy được handle của Workbook em đang mở muốn VB6 hiểu và thao tác trên workbook đó thì ta làm sao ạ!

***Trường hợp của em: đang mở một addin, muốn dùng VB6 để tắt addin và xóa addin đó ra khỏi danh sách.

Mong chỉ giáo.

Trân trọng.

Cuối cùng thì bạn muốn gì? "Khởi động" server và "tạo ra một Workbook mới", hay "kết nối" với server "đã" được khởi động từ trước và "kết nối" với WorkBook đã có?
Bạn phải hiểu là CreateObject luôn là "khởi động" server mới cho dù đã có hoặc không server nào hoạt động, còn GetObject luôn là "kết nối" với server đang hoạt động - nếu chưa có server đang hoạt động thì sẽ có lỗi. Còn nếu bạn muốn trước hết thử kết nối với server đang hoạt động còn nếu chưa có thì mới khởi động server mới thì trước tiên bạn dùng GetObject, sau đó kiểm tra thấy có lỗi thì gọi CreateObject.
Một khi bạn đã có đối tượng Application trong "nắm tay" rồi thì "tha hồ" mà dùng các thuộc tính và thủ tục của nó thôi. Cũng giống như bạn viết trong Excel VBA mà.
Ví dụ ở dưới chỉ là "viết trên đầu gối", bạn tự bổ sung thêm.
Do bạn muốn kết nối với server đang hoạt động nên phải dùng GetObject
Mã:
Private Sub Command1_Click()
Dim ExcelApp As Excel.Application
Dim book As Excel.Workbook
Dim sheet As Excel.Worksheet
Dim add_ins As Excel.AddIns
Dim add_in As Excel.AddIn
Dim index As Long
Dim msg As String
    Set ExcelApp = GetObject(, "Excel.Application")
    If ExcelApp Is Nothing Then Exit Sub
    ' WorkBook dang hoat dong
    Set book = ExcelApp.ActiveWorkbook
    ' ghi vao sheet thu 2
    book.Sheets(2).range("A12").Value = "Lam bat pho da"
    ' ghi lai bang tinh voi ten khac
    book.SaveAs ("c:\test.xls")
    ' collection addin
    Set add_ins = ExcelApp.AddIns
    ' la5m voi tung addin trong collectiion
    For index = 1 To add_ins.count
        Set add_in = add_ins(index)
        msg = ""
        msg = msg & "FullName: " & add_in.FullName & vbCrLf
        msg = msg & "Name: " & add_in.Name & vbCrLf
        msg = msg & "Path: " & add_in.Path & vbCrLf
        msg = msg & "Installed: " & add_in.Installed
        MsgBox msg
        ' neu la addin "docso.xla" thi tat no di
        If LCase(add_in.Name) = "docso.xla" Then add_in.Installed = False
    Next index
End Sub
 
Lần chỉnh sửa cuối:
Cuối cùng thì bạn muốn gì? "Khởi động" server và "tạo ra một Workbook mới", hay "kết nối" với server "đã" được khởi động từ trước và "kết nối" với WorkBook đã có?
Bạn phải hiểu là CreateObject luôn là "khởi động" server mới cho dù đã có hoặc không server nào hoạt động, còn GetObject luôn là "kết nối" với server đang hoạt động - nếu chưa có server đang hoạt động thì sẽ có lỗi. Còn nếu bạn muốn trước hết thử kết nối với server đang hoạt động còn nếu chưa có thì mới khởi động server mới thì trước tiên bạn dùng GetObject, sau đó kiểm tra thấy có lỗi thì gọi CreateObject.
Một khi bạn đã có đối tượng Application trong "nắm tay" rồi thì "tha hồ" mà dùng các thuộc tính và thủ tục của nó thôi. Cũng giống như bạn viết trong Excel VBA mà.
Ví dụ ở dưới chỉ là "viết trên đầu gối", bạn tự bổ sung thêm.
Do bạn muốn kết nối với server đang hoạt động nên phải dùng GetObject
Mã:
Private Sub Command1_Click()
Dim ExcelApp As Excel.Application
Dim book As Excel.Workbook
Dim sheet As Excel.Worksheet
Dim add_ins As Excel.AddIns
Dim add_in As Excel.AddIn
Dim index As Long
Dim msg As String
    Set ExcelApp = GetObject(, "Excel.Application")
    If ExcelApp Is Nothing Then Exit Sub
    ' WorkBook dang hoat dong
    Set book = ExcelApp.ActiveWorkbook
    ' ghi vao sheet thu 2
    book.Sheets(2).range("A12").Value = "Lam bat pho da"
    ' ghi lai bang tinh voi ten khac
    book.SaveAs ("c:\test.xls")
    ' collection addin
    Set add_ins = ExcelApp.AddIns
    ' la5m voi tung addin trong collectiion
    For index = 1 To add_ins.count
        Set add_in = add_ins(index)
        msg = ""
        msg = msg & "FullName: " & add_in.FullName & vbCrLf
        msg = msg & "Name: " & add_in.Name & vbCrLf
        msg = msg & "Path: " & add_in.Path & vbCrLf
        msg = msg & "Installed: " & add_in.Installed
        MsgBox msg
        ' neu la addin "docso.xla" thi tat no di
        If LCase(add_in.Name) = "docso.xla" Then add_in.Installed = False
    Next index
End Sub
Cảm ơn anh. Mình đã làm được. Còn nhiều vấn đề để liên lạc với anh nhờ anh chỉ giáo thêm.

Trân trọng.
Nếu anh không ngại, anh có thể cho mình xin địa chỉ mail của anh để trao đổi được không! (**A có thể gửi thông tin qua địa chỉ mail: tannhuong@yahoo.com.vn) . Cảm ơn anh nhiều.
 
Lần chỉnh sửa cuối:
ActiveX Component can't create object

Gửi bạn siwtom và anh chị GPE
Mình làm theo cách trên, debug trên VB6 thì Ok
Khi build sang file Dll để đưa vào Excel để thoát addin thì bị lỗi:
"ActiveX Component can't create object"
1. Code của phần đưa vào trong VBA như sau:

Mã:
Sub Close_Addin()
Dim VB6Proj As Project1.ThoatCT
Set VB6Proj = New Project1.
ThoatCTVB6Proj.RemoveAddin
Set VB6Proj = Nothing
End Sub
2. File Dll được biên dịch :
- Tên Project: Project1
- Cấu trúc gồm:
1 ClassModule: ThoatCT
Trong classModule có sub: RemoveAddin
3. Mình đã reference đến file DLL đó rồi nhưng vẫn không xong.
Có một điều là trước khi chạy dùng chức năng Autolist Member của VBA thì thấy cái Project mới thêm vào, khi debug Excel gặp lỗi thì không thấy cái Project đó xuất hiện nữa. Reset lại thì được. Mình thử trên WinXP thì được(Office 2007), trên win 7 (office 2007) thì không được:
Thử làm ví dụ đơn giản tại bài "#6 và #7" của anh Phan Tự Hướng cũng không được: http://www.giaiphapexcel.com/forum/showthread.php?3397-Connect-visual-basic-to-excel

Mong nhận được chỉ giáo của mọi người.
Trân trọng.
 
Gửi bạn siwtom và anh chị GPE
Mình làm theo cách trên, debug trên VB6 thì Ok
Khi build sang file Dll để đưa vào Excel để thoát addin thì bị lỗi:
"ActiveX Component can't create object"
1. Code của phần đưa vào trong VBA như sau:

Mã:
Sub Close_Addin()
Dim VB6Proj As Project1.ThoatCT
Set VB6Proj = New Project1.
ThoatCTVB6Proj.RemoveAddin
Set VB6Proj = Nothing
End Sub
2. File Dll được biên dịch :
- Tên Project: Project1
- Cấu trúc gồm:
1 ClassModule: ThoatCT
Trong classModule có sub: RemoveAddin
3. Mình đã reference đến file DLL đó rồi nhưng vẫn không xong.
Có một điều là trước khi chạy dùng chức năng Autolist Member của VBA thì thấy cái Project mới thêm vào, khi debug Excel gặp lỗi thì không thấy cái Project đó xuất hiện nữa. Reset lại thì được. Mình thử trên WinXP thì được(Office 2007), trên win 7 (office 2007) thì không được:
Thử làm ví dụ đơn giản tại bài "#6 và #7" của anh Phan Tự Hướng cũng không được: http://www.giaiphapexcel.com/forum/showthread.php?3397-Connect-visual-basic-to-excel

Mong nhận được chỉ giáo của mọi người.
Trân trọng.

Nếu code của bạn và của anh Phan Tự Hướng chạy được trên XP nhưng không chạy được trên Win7 thì có nghĩa là vấn đề nằm ở Win7. Mà vấn đề "ActiveX Component can't create object" thì rất rất nhiều người gặp phải, rất rất nhiều code gặp phải. Vậy thì tìm đọc trên mạng. Tôi không dùng Win7 nên không nghiên cứu gì cả.
 
Web KT
Back
Top Bottom