Set object Workbook trong VB6 cho file Excel đã mở sẵn

Liên hệ QC
và em chính là trong số "đại đại đại đa số" người không biết. Nếu anh biết thì giúp em với - hy vọng anh là người trong số rất rất rất ít người biết ah...
Ngay trên GPE này bạn chưa bao giờ gặp? Thế thì thử nhập vào "Tìm kiếm" từ khóa GetObject xem sao nhé. Tổng cộng 17 trang kết quả, cũ nhất là 16 năm trước.
-------------
Tôi đã giải thích hơn 10 năm trước ở bài #2

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à.

 
Lần chỉnh sửa cuối:
Các bạn lưu ý là code trong bài #21 không phải của tôi hoàn toàn. Dùng kết nối sớm là code của chủ thớt, tôi chỉ giải quyết khâu GetObject / CreateObject.

Bản thân tôi không bao giờ dùng kết nối sớm. Trong những code mà tôi viết từ A đến Z tôi luôn dùng kết nối muộn. Cứ tìm code của batman1 thì thấy. Mà đã thêm reference thì dùng CreateObject để làm gì? Để chơi cho vui à?

Nhưng tôi không dùng kết nối sớm không phải vì 64 hay 100 bit gì cả. Cũng không phải vì 365 hay 1000 gì cả. Đơn giản chỉ vì thêm reference thì nhiều khi người khác mở ra sẽ bị MISSING và họ không biết cách khắc phục.

Thậm chí nếu ai đó trót thêm reference rồi Dim ExcelApp As Excel.Application, nhưng sau đó trong code dùng CreateObject chứ không dùng NEW thì khi cần chỉ phải thay tất cả các kiểu như trên bằng AS OBJECT, và xóa reference là xong. Có chỗ nào phải viết lại cực khổ đâu nhỉ.

--------

Sửa bởi ptm0412
 
Chỉnh sửa lần cuối bởi điều hành viên:
Cám ơn anh.
Nhưng nếu :
Mã:
Set objExcelApp = getObject("D:"\Test.xlsx")
thì bị báo file "Test.xlsx" đang mở và nó chỉ mở tiếp với "Read only"

Tham khảo:

Mã:
Function setXLWorkBook(sWBFilePath As String) As Boolean
On Err GoTo ErrHandler
    Dim appXL As Object, oWb As Object, oWs As Object
    Dim i As Long, sWBName As String
 
    setXLWorkBook = False
 
    'Xac dinh xem co phiên Excel nào dang chay
    On Error Resume Next
    Set appXL = GetObject(, "Excel.Application")
    If Err.Number = 429 Then 'Ung dung Excel chua chay
        Set appXL = CreateObject("Excel.Application")
        Set oWb = appXL.Workbooks.Open(fileName:=sWBFilePath)
        appXL.Visible = True
        setXLWorkBook = True
        Err.Clear
        Exit Function
    End If
 
    'Duyet tat ca cac WB dang mo
    sWBName = Mid(sWBFilePath, InStrRev(sWBFilePath, "\") + 1)
    For i = appXL.Workbooks.Count To 1 Step -1
        If appXL.Workbooks(i).Name = sWBName Then   'tìm thay WB
            Set oWb = appXL.Workbooks(i)
            setXLWorkBook = True
            appXL.Visible = True
            Exit For
        End If
    Next i
    '...
 
    Exit Function
 
ErrHandler:
    setXLWorkBook = False
    MsgBox "Error: " & Err.Number & vbCrLf & "Err Content:" & Err.Description
    Set appXL = Nothing
 
End Function

Mà sao bạn không nâng cấp xài luôn VSTO hay C# viết add-in cho tương thích với các phiên bản Windows, Office mới. Xài VB6 với các thư viện xưa cũ, rồi phải tìm cách luồn lách code các kiểu để nó chạy trên các phiên bản mà chưa chắc ổn định, code thì phải nhiều hơn, tốc độ xử lý cũng chắc chắn bị ảnh hưởng. Làm dạng ngâm cứu chơi cho vui thì được.
 
Lần chỉnh sửa cuối:
Tôi đã gởi cảnh báo đến nick @Kiều Mạnh do hành động công kích người khác bằng lời lẽ không phù hợp, sau đó tự ý xóa bài.
 
Bản thân tôi không bao giờ dùng kết nối sớm.
Dạ, Con cũng giống bác nè... toàn dùng kết nối muộn!
Tham khảo:

Mã:
Function setXLWorkBook(sWBFilePath As String) As Boolean
On Err GoTo ErrHandler
    Dim appXL As Object, oWb As Object, oWs As Object
    Dim i As Long, sWBName As String
 
    setXLWorkBook = False
 
    'Xac dinh xem co phiên Excel nào dang chay
    On Error Resume Next
    Set appXL = GetObject(, "Excel.Application")
    If Err.Number = 429 Then 'Ung dung Excel chua chay
        Set appXL = CreateObject("Excel.Application")
        Set oWb = appXL.Workbooks.Open(fileName:=sWBFilePath)
        appXL.Visible = True
        setXLWorkBook = True
        Err.Clear
        Exit Function
    End If
 
    'Duyet tat ca cac WB dang mo
    sWBName = Mid(sWBFilePath, InStrRev(sWBFilePath, "\") + 1)
    For i = appXL.Workbooks.Count To 1 Step -1
        If appXL.Workbooks(i).Name = sWBName Then   'tìm thay WB
            Set oWb = appXL.Workbooks(i)
            setXLWorkBook = True
            appXL.Visible = True
            Exit For
        End If
    Next i
    '...
 
    Exit Function
 
ErrHandler:
    setXLWorkBook = False
    MsgBox "Error: " & Err.Number & vbCrLf & "Err Content:" & Err.Description
    Set appXL = Nothing
 
End Function

Mà sao bạn không nâng cấp xài luôn VSTO hay C# viết add-in cho tương thích với các phiên bản Windows, Office mới. Xài VB6 với các thư viện xưa cũ, rồi phải tìm cách luồn lách code các kiểu để nó chạy trên các phiên bản mà chưa chắc ổn định, code thì phải nhiều hơn, tốc độ xử lý cũng chắc chắn bị ảnh hưởng. Làm dạng ngâm cứu chơi cho vui thì được.
Cám ơn @ongke0711 nhiều. Để em nghiên cứu ah.
Thông cảm vì đam mê nên em là học "lóm" và mài mò khắp nơi mấy cái code thôi, và quen với VB nên cứ thế mần ah.
 
Tôi đã gởi cảnh báo đến nick @Kiều Mạnh do hành động công kích người khác bằng lời lẽ không phù hợp, sau đó tự ý xóa bài.
Anh nói sai rồi ... bài số 22 ko công kích hay nói gì ai cả .... mà chỉ nói kết nối check thư viện Excel kết nối sớm hay muôn mà thôi
có nói nếu làm như số 21 thì sử dụng được trên Office 32 bit ... còn trên Office 365 - 64 bít thì viết lại ko check thư viện Excel

vậy cứ cho là đổ thừa cho tự ý xóa bài đi ko sao cả ... vậy hỏi anh 1 câu thôi
bài số 23 lời lẻ vậy thì keo là sao cho đúng ????!!!! hãy công tâm mà nói 1 câu thôi
cảm ơn anh
 
Ngay trên GPE này bạn chưa bao giờ gặp? Thế thì thử nhập vào "Tìm kiếm" từ khóa GetObject xem sao nhé. Tổng cộng 17 trang kết quả, cũ nhất là 16 năm trước.
-------------
Tôi đã giải thích hơn 10 năm trước ở bài #2
Dạ, con cám ơn Bác, con đang đọc bài ah
 
Anh nói sai rồi ... bài số 22 ko công kích hay nói gì ai cả .... mà chỉ nói kết nối check thư viện Excel kết nối sớm hay muôn mà thôi
có nói nếu làm như số 21 thì sử dụng được trên Office 32 bit ... còn trên Office 365 - 64 bít thì viết lại ko check thư viện Excel

vậy cứ cho là đổ thừa cho tự ý xóa bài đi ko sao cả ... vậy hỏi anh 1 câu thôi
bài số 23 lời lẻ vậy thì keo là sao cho đúng ????!!!! hãy công tâm mà nói 1 câu thôi
cảm ơn anh
Tôi đọc được lịch sử sửa xóa 2 bài của bạn (chứ không phải 1), Trong đó có nội dung đúng như bạn nói kèm theo 2 câu cuối ( ó đ...ớp). Câu cuối mới là không phù hợp.
Bài 23 phản ứng đối với câu đó là đúng vì bị xúc phạm, tôi cũng xóa ngay bây giờ.
 
Tôi đọc được lịch sử sửa xóa 2 bài của bạn (chứ không phải 1), Trong đó có nội dung đúng như bạn nói kèm theo 2 câu cuối ( ó đ...ớp). Câu cuối mới là không phù hợp.
Bài 23 phản ứng đối với câu đó là đúng vì bị xúc phạm, tôi cũng xóa ngay bây giờ.
có 21 xong 22 xong tới 23 nó phải tuần tự như vậy ... mà thôi ... úp cái hình sau cho anh xem lại
xong phiền anh xóa dùm luôn cho sạch ... lời lẻ đó để đấy mà xem dc hay sao
tại tôi có nhắc tới cái bài số 21 nên mới xóa đi ... qua đây rút kinh nghiệm cạch ra ko bao giờ nhắc tới thế thôi

1650773729915.png

bài này a để cũng dc mà xóa cũng ko sao ... vì ko cần thiết chỉ nhắc lại anh một chút nó có tuần tự từ bài 21 xong qua 22 ... còn cai câu kia là bài số 24 đấy

Thôi ko nói lại nữa ... Cảm ơn Anh
 
Tham khảo:

Mã:
Function setXLWorkBook(sWBFilePath As String) As Boolean
On Err GoTo ErrHandler
    Dim appXL As Object, oWb As Object, oWs As Object
    Dim i As Long, sWBName As String
 
    setXLWorkBook = False
 
    'Xac dinh xem co phiên Excel nào dang chay
    On Error Resume Next
    Set appXL = GetObject(, "Excel.Application")
    If Err.Number = 429 Then 'Ung dung Excel chua chay
        Set appXL = CreateObject("Excel.Application")
        Set oWb = appXL.Workbooks.Open(fileName:=sWBFilePath)
        appXL.Visible = True
        setXLWorkBook = True
        Err.Clear
        Exit Function
    End If
 
    'Duyet tat ca cac WB dang mo
    sWBName = Mid(sWBFilePath, InStrRev(sWBFilePath, "\") + 1)
    For i = appXL.Workbooks.Count To 1 Step -1
        If appXL.Workbooks(i).Name = sWBName Then   'tìm thay WB
            Set oWb = appXL.Workbooks(i)
            setXLWorkBook = True
            appXL.Visible = True
            Exit For
        End If
    Next i
    '...
 
    Exit Function
 
ErrHandler:
    setXLWorkBook = False
    MsgBox "Error: " & Err.Number & vbCrLf & "Err Content:" & Err.Description
    Set appXL = Nothing
 
End Function

Mà sao bạn không nâng cấp xài luôn VSTO hay C# viết add-in cho tương thích với các phiên bản Windows, Office mới. Xài VB6 với các thư viện xưa cũ, rồi phải tìm cách luồn lách code các kiểu để nó chạy trên các phiên bản mà chưa chắc ổn định, code thì phải nhiều hơn, tốc độ xử lý cũng chắc chắn bị ảnh hưởng. Làm dạng ngâm cứu chơi cho vui thì được.
anh @ongke0711 ơi, em chạy thử cái code rồi...
Nhưng sao dòng này Set appXL = GetObject(, "Excel.Application") nó lúc nào cũng không bắt được (tức appXL= nothing)
Em thử open file Test.xlsx trực tiếp hoặc em mở app Excel lên rồi mới vào Open file (FIle -> Open) vẫn có error =492... tức là app Excel chưa mở ... và em thử mở nhiều file Excel lên cũng có kết quả là chưa mở excel lên?
Không biết e có thiếu cái gì không nữa... làm từ sáng tời giờ... bị lú luôn rồi...
Cám ơn anh
 
có 21 xong 22 xong tới 23 nó phải tuần tự như vậy ... mà thôi ... úp cái hình sau cho anh xem lại
xong phiền anh xóa dùm luôn cho sạch ... lời lẻ đó để đấy mà xem dc hay sao
Bài 22 tôi không xóa vì có giải thích kết nối sớm hay muộn, tuy vậy tôi sẽ edit để xóa bỏ 1 câu phản ứng.
 
anh @ongke0711 ơi, em chạy thử cái code rồi...
Nhưng sao dòng này Set appXL = GetObject(, "Excel.Application") nó lúc nào cũng không bắt được (tức appXL= nothing)
Em thử open file Test.xlsx trực tiếp hoặc em mở app Excel lên rồi mới vào Open file (FIle -> Open) vẫn có error =492... tức là app Excel chưa mở ... và em thử mở nhiều file Excel lên cũng có kết quả là chưa mở excel lên?
Không biết e có thiếu cái gì không nữa... làm từ sáng tời giờ... bị lú luôn rồi...
Cám ơn anh
Bạn chạy file đính kèm xem thử, demo đơn giản. Tôi có thay đổi code so với bài trước. Code cũ thì khi chạy trên Excel, Access thì chạy đúng còn với VB6 thì lại khác nên phải điều chỉnh lại chút.
Có một lưu ý mà khi tôi test code VB6 trong Windows 7 64bit, thì thấy nó không đóng được toàn bộ ứng dụng Excel mà vẫn còn chạy ngầm trong Task manager, nó sẽ ảnh hưởng trong việc kiểm tra các phiên làm việc của Excel. Đối với file demo đính kèm thì tôi không có thực hiện đóng Excel.exe nên chạy không lỗi. Có kiểm tra trên mạng thì thấy cũng nhiều trường hợp bị như vậy, bạn tự ngâm cứu thêm nhé.


Screen Shot 2022-04-24 at 23.03.15.png
 

File đính kèm

  • ConnectExcelWB.rar
    11.7 KB · Đọc: 16
Lần chỉnh sửa cuối:
Bạn chạy file đính kèm xem thử, demo đơn giản. Tôi có thay đổi code so với bài trước. Code cũ thì khi chạy trên Excel, Access thì chạy đúng còn với VB6 thì lại khác nên phải điều chỉnh lại chút.
Có một lưu ý mà khi tôi test code VB6 trong Windows 7 64bit, thì thấy nó không đóng được toàn bộ ứng dụng Excel mà vẫn còn chạy ngầm trong Task manager, nó sẽ ảnh hưởng trong việc kiểm tra các phiên làm việc của Excel. Đối với file demo đính kèm thì tôi không có thực hiện đóng Excel.exe nên chạy không lỗi. Có kiểm tra trên mạng thì thấy cũng nhiều trường hợp bị như vậy, bạn tự ngâm cứu thêm nhé.


View attachment 274962
Cám ơn anh lần nữa tận tình giúp em ah.
Nhưng.... vẫn không được anh ơi!
vấn đề là "Set appXL = GetObject(, "Excel.Application")" không hoạt động được! Có nghĩa là khi e có mở hay không có mở file excel lên thì dòng lệnh ấy nó luôn luôn bị lỗi.
Ah.. anh chạy trên WIn7 được, nhưng em trên Win 10 thì tèo.
Em thử trên máy win10 x64 excel 2016 và cả trên máy win10 x64 Excel 2019 đều không ăn thua! hay là taii5 Win10 nhỉ? giờ em không có máy win7 để ngâm cứu ...
***************
Em mới thử "Set appXL = GetObject(, "AutoCAD.Application")" cũng tèo lúc nào appXL cũng NOTHING hết (dù có mở app lên hay chưa mở app lên!)
 
Lần chỉnh sửa cuối:
Hình như cái getObject có vấn đề với win10 thì phải.
Xem cái này sẽ rõ hơn nè anh @ongke0711
thì ra không chỉ mình bị vậy!! hic hic... cái này bác Bill mần thôi chứ mình botay.canh
 
Hình như cái getObject có vấn đề với win10 thì phải.
Xem cái này sẽ rõ hơn nè anh @ongke0711
thì ra không chỉ mình bị vậy!! hic hic... cái này bác Bill mần thôi chứ mình botay.canh

Tôi chạy bản VB6 Portable (6.3M) trên Windows 11 + Office 2021 64bit vẫn được đó bạn. Chút quay màn hình cho xem.
Có thể phải tinh chỉnh lại cách thức bắt getObject.
 
Tôi chạy bản VB6 Portable (6.3M) trên Windows 11 + Office 2021 64bit vẫn được đó bạn. Chút quay màn hình cho xem.
Có thể phải tinh chỉnh lại cách thức bắt getObject.
Woow... vậy sao ta? hic, e làm mọi cách nghiên cứu mà nó "trơ trơ" ....
 
Woow... vậy sao ta? hic, e làm mọi cách nghiên cứu mà nó "trơ trơ" ....

Xem video nhé.
Với cái vụ getObject này thì cái lỗi 429 nó cũng chỉ xuất hiện khi tôi chạy trong Access, chạy trong VB nó thành 0 hết.
Bản VB6 Portable đính kèm bên dưới. Cơ bản là không làm gì nhiều với VB6 nên chỉ cài sơ để thử nghiệm thôi.
Tôi down từ trang này nên không chịu trách nhiệm về có virus hay không nhé. Tôi cài thì chưa thấy mất gì :D.


 

File đính kèm

  • Visual Basic 6 Portable.zip
    5.8 MB · Đọc: 13
Web KT
Back
Top Bottom