Lấy dữ liệu từ file đang đóng ( có password ) bằng ADO

Liên hệ QC

bigbabol89

Thành viên thường trực
Tham gia
15/10/12
Bài viết
224
Được thích
34
Chào các anh chị,
Em có sưu tầm được code ở trên diễn đàn của anh HaiLuaMienTay, tuy nhiên, file excel nguồn của em có set password ( em biết pass ) nên chạy nó bị lỗi ạ. ( nếu chạy file bỏ password đi thì không sao )
Em tra google cũng không biết sửa, anh chị giúp em với ạ.
Em cám ơn ạ
1579602768636.png
Mã:
Sub TongHop()
    Dim cnn As Object, lsSQL As String, lrs As Object ', Fname
    Dim Fso As Object, Link As String ', shNameNguon, i As Long
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    'shNameNguon = Array("aaa")
    Application.ScreenUpdating = False

    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Filters.Add "Microsoft Excel Files", "*.xls; *.xlsx; *.xlsb; *.xlsm", 1
        If .Show = -1 Then
            Link = .InitialFileName
        Else
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
       
        'For Each Fname In .SelectedItems
         
            With cnn
                If Val(Application.Version) < 12 Then
                    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                                      & "Data Source=" & Fname & ";Extended Properties=""Excel 8.0;HDR=No"";"
                Else
           '    Fname = .SelectedItems
                    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                                      & "Data Source=" & Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) & ";Extended Properties=""Excel 12.0;HDR=No"";"
                End If
                .Open
           
            'For i = 0 To UBound(shNameNguon)
         
                lsSQL = "SELECT * FROM [OT$A2:AC65536]"
                lrs.Open lsSQL, cnn, 3, 1
                Sheets("Sheet1").Range("A2:AC65536").ClearContents
                Sheets("Sheet1").Range("A2").CopyFromRecordset lrs
                lrs.Close
            'Next
            End With
        'Next
    End With

    Application.ScreenUpdating = True
    cnn.Close
    Set lrs = Nothing
    Set cnn = Nothing
End Sub
 
Lần chỉnh sửa cuối:
Chào các anh chị,
Em có sưu tầm được code ở trên diễn đàn của anh HaiLuaMienTay, tuy nhiên, file excel nguồn của em có set password nên chạy nó bị lỗi ạ. ( nếu chạy file bỏ password đi thì không sao )
Em tra google cũng không biết sửa, anh chị giúp em với ạ.
Em cám ơn ạ
View attachment 231361
Mã:
Sub TongHop()
    Dim cnn As Object, lsSQL As String, lrs As Object ', Fname
    Dim Fso As Object, Link As String ', shNameNguon, i As Long
    Set Fso = CreateObject("Scripting.FileSystemObject")
    Set cnn = CreateObject("ADODB.Connection")
    Set lrs = CreateObject("ADODB.Recordset")
    'shNameNguon = Array("aaa")
    Application.ScreenUpdating = False

    With Application.FileDialog(msoFileDialogFilePicker)
        .AllowMultiSelect = False
        .Filters.Add "Microsoft Excel Files", "*.xls; *.xlsx; *.xlsb; *.xlsm", 1
        If .Show = -1 Then
            Link = .InitialFileName
        Else
            MsgBox "Ban da khong chon tong hop", vbInformation, "Thông Báo"
            Exit Sub
        End If
       
        'For Each Fname In .SelectedItems
         
            With cnn
                If Val(Application.Version) < 12 Then
                    .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" _
                                      & "Data Source=" & Fname & ";Extended Properties=""Excel 8.0;HDR=No"";"
                Else
           '    Fname = .SelectedItems
                    .ConnectionString = "Provider=Microsoft.ACE.OLEDB.12.0;" _
                                      & "Data Source=" & Application.FileDialog(msoFileDialogFilePicker).SelectedItems(1) & ";Extended Properties=""Excel 12.0;HDR=No"";"
                End If
                .Open
           
            'For i = 0 To UBound(shNameNguon)
         
                lsSQL = "SELECT * FROM [OT$A2:AC65536]"
                lrs.Open lsSQL, cnn, 3, 1
                Sheets("Sheet1").Range("A2:AC65536").ClearContents
                Sheets("Sheet1").Range("A2").CopyFromRecordset lrs
                lrs.Close
            'Next
            End With
        'Next
    End With

    Application.ScreenUpdating = True
    cnn.Close
    Set lrs = Nothing
    Set cnn = Nothing
End Sub
Cái này , nếu không nhớ nhầm, thì gần đây có topic đã đưa lên
- file có password mở file, thì cần phải có password
- cần mở ngầm để mở theo password đã có (nếu đã mở ngầm thì có khi sao cần ADO nữa, tất nhiên dùng ADO vẫn được)
---> tìm lại topic đó lại và xem
 
Em có sưu tầm được code ở trên diễn đàn của anh HaiLuaMienTay, tuy nhiên, file excel nguồn của em có set password ( em biết pass ) nên chạy nó bị lỗi ạ. ( nếu chạy file bỏ password đi thì không sao )

- Không có chuỗi kết nối ADO dành riêng cho file Excel có đặt mật khẩu nhé bạn. Chỉ có thể thực hiện kết nối thông qua một thủ thuật là mở ngầm file Excel có mật khẩu lên để bạn nhập mật khẩu vào sau đó ẩn file đi, sau đó dùng chuỗi kết nối như bạn đang làm.
- Ví dụ code mở file Excel và ẩn đi: dùng ngay luôn trên cái phiên Excel đang làm việc hiện hành (Excel instance) để mở Workbook khác.

Mã:
Sub OpenWbkNotShow()
    Application.ScreenUpdating = False
    Workbooks.Open "C:\Temp\Test.xlsx"
    Windows("Test.xlsx").Visible = False
    Application.ScreenUpdating = True
End Sub
 
- Không có chuỗi kết nối ADO dành riêng cho file Excel có đặt mật khẩu nhé bạn. Chỉ có thể thực hiện kết nối thông qua một thủ thuật là mở ngầm file Excel có mật khẩu lên để bạn nhập mật khẩu vào sau đó ẩn file đi, sau đó dùng chuỗi kết nối như bạn đang làm.
- Ví dụ code mở file Excel và ẩn đi: dùng ngay luôn trên cái phiên Excel đang làm việc hiện hành (Excel instance) để mở Workbook khác.

Mã:
Sub OpenWbkNotShow()
    Application.ScreenUpdating = False
    Workbooks.Open "C:\Temp\Test.xlsx"
    Windows("Test.xlsx").Visible = False
    Application.ScreenUpdating = True
End Sub
Cho em hỏi ngu cái nếu có pass thì ADO có mở được không anh.Cái này em chưa test nên không biết à.Mà em nhớ là dùng ADO để mở Access có cả phần mật khẩu mà anh.
 
Cho em hỏi ngu cái nếu có pass thì ADO có mở được không anh.Cái này em chưa test nên không biết à.Mà em nhớ là dùng ADO để mở Access có cả phần mật khẩu mà anh.

Đối với Access, SQL Server..(nói chung là các hệ quản trị CSDL) thì ngay trong chuỗi kết nối có luôn tham số Password. Riêng Excel nó không phải là hệ quản trị CSDL nên không làm được.
Sau khi mở ngầm file Excel nguồn và nhập password thì kết nối ADO, xử lý như bình thường thôi bạn.
 
Vụ này đã giải thích mấy lần rồi. Chịu khó lục ra mà đọc.
File Excel có password là đã được mã hoá. ADO không thể đọc file đã mã hoá. Người ta đi vòng bằng cách mở file - đương nhiên là với password. Khi ấy, sẽ có một phiên bản đã giải mã trong bộ nhớ. ADO sẽ đọc phiên bản này.
 
Đối với Access, SQL Server..(nói chung là các hệ quản trị CSDL) thì ngay trong chuỗi kết nối có luôn tham số Password. Riêng Excel nó không phải là hệ quản trị CSDL nên không làm được.
Sau khi mở ngầm file Excel nguồn và nhập password thì kết nối ADO, xử lý như bình thường thôi bạn.
Vụ này đã giải thích mấy lần rồi. Chịu khó lục ra mà đọc.
File Excel có password là đã được mã hoá. ADO không thể đọc file đã mã hoá. Người ta đi vòng bằng cách mở file - đương nhiên là với password. Khi ấy, sẽ có một phiên bản đã giải mã trong bộ nhớ. ADO sẽ đọc phiên bản này.
Vâng cảm ơn 2 anh nhé.
 
Web KT
Back
Top Bottom