Cách Lấy Dữ Liệu File Đóng Mà Không Sử Dụng ADO, Macro4 Và Workbook.Open (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

Kiều Mạnh

I don't program, I beat code into submission!!!
Tham gia
9/6/12
Bài viết
5,538
Được thích
4,129
Giới tính
Nam
Tình hình là Mình đang nghiên cứu xem có cách nào Lấy dữ liệu File đóng lên File đang Mở Mà không Sử dụng:
1/ ADO
2/ Macro4
3/ Workbook.Open

Ngoài 3 cách trên ra có cách nào khác mà lấy dữ liệu File đóng lên File đang mở mà ko mở File cần lấy lên không >>> .... Nếu Bạn nào biết có Bài viết liên quan hay code được thì xin chỉ dùm

(Ví dụ : Lấy dữ liệu File A lên File B mà không mở File A lên hoàn Toàn ....Nếu sử dụng Workbook.Open lên cho nó vào mãng xong đóng lại ko Tính ..)

Hình như sử dụng CreateObject("Scripting.FileSystemObject") lấy SheetName và vùng dữ liệu xong cho nó vào Arr() được thì phải ....

Không biết nghiên cứu theo hướng này có đúng không nữa ....
Mong các Bạn trợ giúp

Xin cảm ơn
 
Lần chỉnh sửa cuối:
Tôi không sợ những người đàn ông đã tập 10.000 cú đá 1 lần, nhưng tôi sợ người đàn ông đã tập một cú đá 10.000 lần.

mình thấy bằng đó cách ở trên đã là quá đủ để dùng rồi mà .
Nếu anh Kiều Mạnh muốn thêm nữa có thể xem 1 số đoạn Sub có tên là "hello" về việc lấy dữ liệu của file đang đóng xem có khác tí nào không .||||||||||
 
Upvote 0
mình thấy bằng đó cách ở trên đã là quá đủ để dùng rồi mà .
Nếu anh Kiều Mạnh muốn thêm nữa có thể xem 1 số đoạn Sub có tên là "hello" về việc lấy dữ liệu của file đang đóng xem có khác tí nào không .||||||||||
Bài này với Mạnh thấy hơi khó còn với Bạn hiền là chuyện nhỏ ...Mình thấy code đó rồi nhưng muốn úp Bài lên để xem có khai mở thêm cách nào khác mới nữa không đó mà ...Tính mình thích khai phá mới mà

Sub hello có đoạn này Bạn Hiền FormulaArray = FilePath

Mạnh Nhìn thấy Hình cứ muốn ... mà sợ quá ....--=0
 
Upvote 0
Không biết bạn có xếp chung ADO với DAO không nhỉ? Nếu không thì thòi ra thêm 1 em rồi đó. Mà em này còn nhanh hơn cả ADO --=0 chỉ tội là lâu rồi chẳng còn mấy ai đề cập.
 
Upvote 0
Anh em giúp mình đoạn code liên quan với. Ý tưởng là copy dữ liệu từ file đang đóng:
With Cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\data\A.xlsm" & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With

Trước nó là đường dẫn đến file A.xls nhưng mình mới sửa sang A.xlsm mà nó tịt luôn ở chữ ..Open

Mọi người sửa giúp với nhé.
Thanks
 
Upvote 0
Không biết bạn có xếp chung ADO với DAO không nhỉ? Nếu không thì thòi ra thêm 1 em rồi đó. Mà em này còn nhanh hơn cả ADO --=0 chỉ tội là lâu rồi chẳng còn mấy ai đề cập.
Vụ này với khả năng của mình thì ko biết đâu là DAO đâu là ADO nữa ...nghe trên GPE có nói nhiều rồi mà mình cứ thấy 2 mà một 1 mà 2 quá ... --=0+-+-+-+
Xin cảm ơn Bạn
 
Upvote 0
Anh em giúp mình đoạn code liên quan với. Ý tưởng là copy dữ liệu từ file đang đóng:
With Cnn
.ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;" & _
"Data Source=" & ThisWorkbook.Path & "\data\A.xlsm" & _
";Extended Properties=""Excel 8.0;HDR=No;"";"
.Open
End With

Trước nó là đường dẫn đến file A.xls nhưng mình mới sửa sang A.xlsm mà nó tịt luôn ở chữ ..Open

Mọi người sửa giúp với nhé.
Thanks
Office 2003 sang 2007.. hay
Bạn Qua Link sau Bài #3 copy về mà sử dung nha

http://www.giaiphapexcel.com/forum/...VBA-xin-giúp-mình-đc-ko-ạ&p=708195#post708195
 
Lần chỉnh sửa cuối:
Upvote 0
Vụ này với khả năng của mình thì ko biết đâu là DAO đâu là ADO nữa ...nghe trên GPE có nói nhiều rồi mà mình cứ thấy 2 mà một 1 mà 2 quá ... --=0+-+-+-+
Xin cảm ơn Bạn

Theo mình thì ADO rộng hơn, áp dụng linh hoạt cho nhiều loại CSDL; còn DAO thì áp dụng đối với CSDL là Access. Mình cũng đang cần n/cứu về cái này, hóng tin từ các bạn
 
Upvote 0
Theo mình thì ADO rộng hơn, áp dụng linh hoạt cho nhiều loại CSDL; còn DAO thì áp dụng đối với CSDL là Access. Mình cũng đang cần n/cứu về cái này, hóng tin từ các bạn
Trước khi nhắc tới DAO dùng cho Excel thì mình có search trước rồi nên chắc chắn là áp dụng được. Thử search cum từ Excel với DAO ra cả đống --=0. Có ví dụ copy từ mạng luôn
PHP:
Dim DB As DAO.database
Dim RS As DAO.Recordset

FilePath = "\\ojrfscdata1\ojcsfs01\share\Billing Services Planning and Analysis\Greg\"
Obj = "2011 Spec Limits Template.xls"

Set DB = OpenDatabase(FilePath & Obj, False, True, "Excel 8.0;HDR=Yes")
Set RS = DB.OpenRecordset("SELECT * FROM [VA$]")
Với lại nhờ search DAO mới thòi ra thêm là DAO vốn thiết kế riêng cho MS-Office (na tì na triếc gì đó --=0) nên tốc độ thực thi nhanh lắm. Cái này hok biết nên xin phép không đi sâu -\\/.
 
Lần chỉnh sửa cuối:
Upvote 0
Trước khi nhắc tới DAO dùng cho Excel thì mình có search trước rồi nên chắc chắn là áp dụng được. Thử search cum từ Excel với DAO ra cả đống --=0. Có ví dụ copy từ mạng luôn
PHP:
Dim DB As DAO.database
Dim RS As DAO.Recordset

FilePath = "\\ojrfscdata1\ojcsfs01\share\Billing Services Planning and Analysis\Greg\"
Obj = "2011 Spec Limits Template.xls"

Set DB = OpenDatabase(FilePath & Obj, False, True, "Excel 8.0;HDR=Yes")
Set RS = DB.OpenRecordset("SELECT * FROM [VA$]")
Với lại nhờ search DAO mới thòi ra thêm là DAO vốn thiết kế riêng cho MS-Office (na tì na triếc gì đó --=0) nên tốc độ thực thi nhanh lắm. Cái này hok biết nên xin phép không đi sâu -\\/.
Nói chung DAO Với Búa đau đầu quá +-+-+-+....ngồi Tìm Anh Google một lúc thấy cũng mệt quá --=0
 
Upvote 0
Theo như gọi ý của bài #2 và nghiên cứu lại Sub hello Bài #4 Link sau:
http://www.giaiphapexcel.com/forum/...link-dữ-liệu-tự-động-từ-nhiều-file-vào-1-file

Mạnh đã viết lại thành một hàm cho tiện sử dụng vậy Úp lên cho các Bạn tham gia nghiên cứu bổ sung thêm cho nó có khả năng siêu việt nhất

Qua test thử mình thấy:
1/ Lấy dữ liệu từ File đóng lên mà ko cần mở File

2/ Lấy 65536 dòng vẫn lấy tốt nhưng chậm hơn ADO

3/ Không cần phải sử dụng Workbook.Open lên mà lấy vì nếu File lớn mở lên rất chậm

4/ Chạy Hàm gán vào Arr() là mình có thể tùy biến các kiểu

5/ Mình tạo một Sheet Ảo để gán dữ liệu vào đó khi gán vào Arr() xong thì xóa đi cho nhẹ File

6/ Mình có làm 3 Sub mẫu vậy úp lên cho các Bạn test thử

7/ Cái hay của nó là khi lấy dữ liệu một file bất kỳ nếu tên sheet không đúng như khai báo thì nó hiện lên một list cho mà chọn

8/ Các Bạn thử test xem tình hình sao ... Nếu có gì ko ổn ta cùng nhau nghiên cứu tiếp ....Mạnh ngồi ko mà ko nghiên cứu thì buồn ngủ quá ...--=0

Xin cảm ơn Bạn Hiền Bài #2 và Bạn theo link trên rất nhiều đã gợi ý cho Mạnh Nghiên Cứu thêm một giải Pháp hay

Toàn Bộ Code như sau:

Mã:
Public Sub GetDataArray(ByVal strPath$, ByVal SheetName$, ByVal DataRange$, Res())
    On Error GoTo ExitSub '''Written by Kieu Manh - GPE
    Dim FilePath As String, Sht As String
    If Excel4MacroSheets.Count = 0 Then
        Application.Excel4MacroSheets.Add.Name = "Temp"
        Sheets("Temp").Visible = 2
    End If
    With CreateObject("Scripting.FileSystemObject")
        Sht = SheetName & "'!" & DataRange
        FilePath = "='" & .GetParentFolderName(strPath) _
                 & "\[" & .GetFileName(strPath) & "]" & Sht
    End With
    With Sheets("Temp").Range(DataRange)
        .FormulaArray = FilePath
        .Value = .Value
        Res = .Value
        .ClearContents
    End With
ExitSub: ''Xu ly loi Ngoai y muon
End Sub


Public Sub Main1()
    Dim Arr(), Path As String, Sht As String, Data As String
    Path = ThisWorkbook.Path & "\6A1.xls"
    ''Path = ThisWorkbook.Path & "\6A3.xlsb"
    ''Path = Application.GetOpenFilename("Excel Files,*.xl*")
    Sht = "Sheet1"          ''Ten Sheet can lay
    Data = ("A1:J2000")     ''Vung du lieu can lay


    GetDataArray Path, Sht, Data, Arr()
    ActiveSheet.UsedRange.ClearContents
    Range("A1").Resize(UBound(Arr, 1), UBound(Arr, 2)).Value = Arr
End Sub


Public Sub Main2()
    Dim Path As String, Sht As String, Data As String
    Dim dArr(), Arr(), i As Long, j As Long, k As Long
    Path = ThisWorkbook.Path & "\6A1.xls"
    ''Path = ThisWorkbook.Path & "\6A3.xlsb"
    ''Path = Application.GetOpenFilename("Excel Files,*.xl*")
    Sht = "Sheet1"          ''Ten Sheet can lay
    Data = ("A2:J5000")     ''Vung du lieu can lay
    
    GetDataArray Path, Sht, Data, Arr()
    ReDim dArr(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    For i = 1 To UBound(Arr, 1)
        If Arr(i, 1) <> Empty Then
            k = k + 1
            For j = 1 To UBound(Arr, 2)
                dArr(k, j) = Arr(i, j)
            Next
        End If
    Next
    ActiveSheet.UsedRange.ClearContents
    If k > 0 Then Range("A1").Resize(k, UBound(Arr, 2)).Value = dArr
End Sub


Public Sub Main3()
    Dim Path As String, Sht As String, Data As String
    Dim dArr(), Arr(), i As Long, j As Long, k As Long
    Path = ThisWorkbook.Path & "\6A1.xls"
    ''Path = ThisWorkbook.Path & "\6A3.xlsb"
    ''Path = Application.GetOpenFilename("Excel Files,*.xl*")
    Sht = "Sheet1"          ''Ten Sheet can lay
    Data = ("A2:J5000")     ''Vung du lieu can lay
    
    GetDataArray Path, Sht, Data, Arr()
    ReDim dArr(1 To UBound(Arr, 1), 1 To UBound(Arr, 2))
    With CreateObject("scripting.dictionary")
        For i = 1 To UBound(Arr)
            If Not .Exists(Arr(i, 1)) Then
                .Add Arr(i, 1), Arr(i, 2)
            End If
        Next
        ActiveSheet.UsedRange.ClearContents
        Range("A2").Resize(.Count) = Application.Transpose(.keys)
        Range("B2").Resize(.Count) = Application.Transpose(.items)
    End With
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom