Lấy dữ liệu từ file không mở ?

Liên hệ QC

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,469
Nghề nghiệp
Công chức
Chào các bạn!

Tôi viết code sau để lấy dữ liệu từ một file không mở (File đang đóng thực sự):
Mã:
Sub ImPortDaTa_FileClose()
    Application.ScreenUpdating = 0
    On Error Resume Next
     With ActiveSheet
        Cells.Clear
         With .QueryTables.Add(Connection:=Array("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=[COLOR="red"]D:\DaTa.xls[/COLOR];Jet OLEDB:Engine Type=35"), Destination:=Selection)
            .CommandType = xlCmdTable
            .CommandText = Array("TongHop$")
            .Refresh BackgroundQuery:=False
        End With
        Selection.EntireRow.Delete
        .UsedRange.Columns.AutoFit
    End With
End Sub
Tôi muốn Data Source D:\DaTa.xls được tùy biến khi người dùng chọn file từ Application.FileDialog(1).Show hoặc Application.FileDialog(3).Show).

Thanks !
 
Vụ này hơi căng nha!
Vì theo như anh mô tả thì Sheet1 là SheetCodeName ---> Làm sao mà biết được ShNguon có SheetCodeName là Sheet1 đây?

Vì trong file nguồn mình đã mặc định đặt tên Sheet1(Sheet1) thành Sheet1(ShNguon) hoặc Sheet1(gì đó) vì vậy mình muốn tên sheet trong Array là Sheet1 (SheetCodeName) hoặc là sheet đầu tiên của Wordbook cũng được.

Xin hỏi thêm nếu tôi biết trước Path file nguồn đang đóng là D:\New Folder\Nguon.xls thì code viết như thế nào để lấy được tên của Sheet đầu tiên - Wordsheets(1) tương tự như Msgbox Wordsheets(1).Name đối với file hiện hành.
 
Upvote 0
Chào 2 anh!..Em là thành viên mới của GPE, em có đọc bài viết của 2 anh và down về dùng thử đến phần chọn "lấy dữ liệu" thì hiện ra một bảng chọn có "pass" và một vài thông tin khác, em chọn pass hay không thì chương trình cũng không báo lỗi gì và cũng không thấy dữ liệu gì cả, vậy nhờ 2 anh hướng dẫn giúp. cảm ơn 2 anh.
Mình cũng gặp tình trạng như bạn. nó như hình đâyuntitled.JPG
Nhân tiện các bác cho mình hỏi, nếu mình muốn lựa chọn kiểu file load vào (vd: .mdb, .xlsx...) để cho dễ lựa chọn file cần tìm thì mình thêm đuôi đó vào chỗ nào.
Khi mình load thử file mdb (khi mình thử dùng record) thì nó cop nguyên dữ liệu sang một book khác, như vậy không tiện. Nếu mình muốn cop một số cột(vd trong file mdb đó mà mình định sẵn được tên chẳng hạn) vào ngay một sheet nào đó (được chỉ định) thì phải làm thế nào? Mình mới tìm hiểu về VBA nên hơi gà, mong được học hỏi! Thanks!
 
Lần chỉnh sửa cuối:
Upvote 0
Mình cũng gặp tình trạng như bạn. nó như hình đây
Nhân tiện các bác cho mình hỏi, nếu mình muốn lựa chọn kiểu file load vào (vd: .mdb, .xlsx...) để cho dễ lựa chọn file cần tìm thì mình thêm đuôi đó vào chỗ nào.
Khi mình load thử file mdb (khi mình thử dùng record) thì nó cop nguyên dữ liệu sang một book khác, như vậy không tiện. Nếu mình muốn cop một số cột(vd trong file mdb đó mà mình định sẵn được tên chẳng hạn) vào ngay một sheet nào đó (được chỉ định) thì phải làm thế nào? Mình mới tìm hiểu về VBA nên hơi gà, mong được học hỏi! Thanks!

1. Để lấy dữ liệu từ file có đuôi .xlsx bạn sử dụng Code của Ndu tại #13. Đối với các file có đuôi khác thì bạn thử record Macro xem sao (tôi không có file .mdb để thử).

2. Code này luôn Copy dữ liệu của cả Sheet nguồn (không thể copy theo vùng như bạn mong muốn) vì vậy cột hoặc dòng nào mà ta không muốn lấy thì viết thêm lệnh để xóa nó đi là OK.
 
Upvote 0
he. chào các bác. em thấy đoạn code này khó hiểu quá
With .QueryTables.Add(Connection:=Array("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & fName & ";Jet OLEDB:Engine Type=35"), Destination:=Selection)
nếu em muốn thay đổi tên sheet và vùng cop dữ liệu trong sheet ấy thì làm thế nào vậy.
Thanks!
 
Upvote 0
he. chào các bác. em thấy đoạn code này khó hiểu quá
nếu em muốn thay đổi tên sheet và vùng cop dữ liệu trong sheet ấy thì làm thế nào vậy.
Thanks!

1- fName là đường dẫn của File. Ví dụ file nguồn có đường dẫn là: D:\Tu hoc VBA\FileClose.xls thì Data Source=D:\Tu hoc VBA\FileClose.xls
vì muốn Code chạy được với các đường dẫn khác nhau thì phải đặt fName ="đường dẫn tùy chọn" do đó Data Source=" & fName & " .

2- Muốn đổi tên Sheet thì bạn thay tên ShNguon trong câu lệnh này .CommandText = Array("ShNguon$"). Việc tùy biến tên Sheet trong Array chính là vấn đề hóc búa mà tôi đang bó tay. Còn việc chọn vùng như tôi đã nói ở bài trên là không thể.
 
Upvote 0
1- fName là đường dẫn của File. Ví dụ file nguồn có đường dẫn là: D:\Tu hoc VBA\FileClose.xls thì Data Source=D:\Tu hoc VBA\FileClose.xls
vì muốn Code chạy được với các đường dẫn khác nhau thì phải đặt fName ="đường dẫn tùy chọn" do đó Data Source=" & fName & " .

2- Muốn đổi tên Sheet thì bạn thay tên ShNguon trong câu lệnh này .CommandText = Array("ShNguon$"). Việc tùy biến tên Sheet trong Array chính là vấn đề hóc búa mà tôi đang bó tay. Còn việc chọn vùng như tôi đã nói ở bài trên là không thể.

he. Trước tiên em xin cảm ơn anh đã nhiệt tình giải thích câu hỏi của em, thật sự do em tìm hiểu chưa lâu, lại tự mình mày mò nên có thể nói dòng lệnh trên em hoàn toàn không biết. Về việc chọn vùng copy thì bài toán em đặt ra như thế này: dữ liệu đầu vào em cần lấy nằm trong nhiều tab trong file access, nên em muốn lấy dữ liệu và tập hợp lại trong 1 sheet của excel để chuyển qua bảng tính, nếu không lựa chọn được vùng copy và paste vào một vùng chỉ định thì dữ liệu lấy vào sẽ phải nằm ở nhiều sheet khác nhau vì nếu cùng một sheet thì dữ liệu sẽ đè lẫn nhau (vì dữ liệu copy vào nằm trọn một sheet), như thế sẽ có nhiều sheet nếu có nhiều dữ liệu hơn. Mong các bác cho em lời giải. Thanks!!!
 
Upvote 0
Với cách làm này rất hay, nhưng mỗi làm lấy dữ liệu thì nó lấy toàn bộ sheet, tôi chỉ muốn lấy 1 hoặc một số vùng trên sheet đang đóng và dán vào 1 vùng trên sheet khác (ngoài sheet có cái nút nhấn) thì phải làm thế nào, mong mọi người chỉ giáo.
 
Upvote 0
Với cách làm này rất hay, nhưng mỗi làm lấy dữ liệu thì nó lấy toàn bộ sheet, tôi chỉ muốn lấy 1 hoặc một số vùng trên sheet đang đóng và dán vào 1 vùng trên sheet khác (ngoài sheet có cái nút nhấn) thì phải làm thế nào, mong mọi người chỉ giáo.

Bạn xem lại #23, mục 2.
Việc lấy 1 hoặc một số vùng trên sheet đang đónglấy toàn bộ sheet rồi xóa đi những gì mình không cần là như nhau mà bạn.
 
Upvote 0
Bạn xem lại #23, mục 2.
Việc lấy 1 hoặc một số vùng trên sheet đang đónglấy toàn bộ sheet rồi xóa đi những gì mình không cần là như nhau mà bạn.
Nếu lấy toàn bộ các dữ liệu của sheet rồi xoá các cột không cần thiết đi thì đôi khi không ổn, ví dụ khi mình lấy dữ liệu từ nhiều WB, mỗi WB chỉ lấy 1 vùng thôi rồi đem dán vào sheet tổng hợp. Theo code trên thì cứ nạp cái thứ nhất, đến cái WB thứ 2 nạp vào củng sheet này thì lại bị xoá mất tiêu cái thứ nhất.
Bạn xem lại coi có cách nào tồi ưu hơn không, mình thích cái vụ có thể Browse đến các file trên máy tính chứ không cần là địa chỉ chính xác như 1 số code mình tham khảo được trên diễn đàn.
 
Upvote 0
Nếu lấy toàn bộ các dữ liệu của sheet rồi xoá các cột không cần thiết đi thì đôi khi không ổn, ví dụ khi mình lấy dữ liệu từ nhiều WB, mỗi WB chỉ lấy 1 vùng thôi rồi đem dán vào sheet tổng hợp. Theo code trên thì cứ nạp cái thứ nhất, đến cái WB thứ 2 nạp vào củng sheet này thì lại bị xoá mất tiêu cái thứ nhất.
Bạn xem lại coi có cách nào tồi ưu hơn không, mình thích cái vụ có thể Browse đến các file trên máy tính chứ không cần là địa chỉ chính xác như 1 số code mình tham khảo được trên diễn đàn.

Nếu không tùy biến được tên Sheet trong Array thì phương án này không khả thi đâu, vì mỗi Code chỉ lấy được 1 Sheet thôi bạn ạ !
 
Upvote 0
Vậy là hết cách hả bạn? nếu như mình đặt ra từng trường hợp cụ thể ví dụ: khi mình chọn các WB với các sheet thì mình dựa vào tên của WB, nếu tên WB (cái này thì tự mình gõ vào) là thứ nhất thì copy vùng mình muốn, rồi dán vào vị trí tương ứng do mình quy định trên Sheet của WB cần đưa vào. Nó cứ tuần tự như vậy cho đến hết các sheet mà mình đã chọn lúc ban đầu. Thế thì làm như thế nào đây bạn?
 
Upvote 0
Vậy là hết cách hả bạn? nếu như mình đặt ra từng trường hợp cụ thể ví dụ: khi mình chọn <strong>các WB</strong> với các sheet thì mình <strong>dựa vào tên của WB</strong>, <strong>nếu tên WB</strong> (cái này thì tự mình gõ vào) là thứ nhất thì copy vùng mình muốn, rồi dán vào vị trí tương ứng do mình quy định trên Sheet của WB cần đưa vào. Nó cứ tuần tự như vậy cho đến hết các sheet mà mình đã chọn lúc ban đầu. Thế thì làm như thế nào đây bạn?
 
Upvote 0
Vậy là hết cách hả bạn? nếu như mình đặt ra từng trường hợp cụ thể ví dụ: khi mình chọn các WB với các sheet thì mình dựa vào tên của WB, nếu tên WB (cái này thì tự mình gõ vào) là thứ nhất thì copy vùng mình muốn, rồi dán vào vị trí tương ứng do mình quy định trên Sheet của WB cần đưa vào. Nó cứ tuần tự như vậy cho đến hết các sheet mà mình đã chọn lúc ban đầu. Thế thì làm như thế nào đây bạn?

Bạn xem thử cách chọn 1 vùng bằng cách cho nó vào 1 sheet phụ ( ví dụ có tên là "phu") , rồi muốn lấy vùng nào tùy ý đưa vào sheet tổng hợp , chỉnh code trên và kiểm tra lại xem sao:

With Sheets("phu")
.....
.....
.UsedRange.Columns.AutoFit
arr = .Range("A1:C6").Value
Sheets("TongHop").Range("A1:C6").Value = arr

End With
 
Lần chỉnh sửa cuối:
Upvote 0
Vậy là hết cách hả bạn? nếu như mình đặt ra từng trường hợp cụ thể ví dụ: khi mình chọn các WB với các sheet thì mình dựa vào tên của WB, nếu tên WB (cái này thì tự mình gõ vào) là thứ nhất thì copy vùng mình muốn, rồi dán vào vị trí tương ứng do mình quy định trên Sheet của WB cần đưa vào. Nó cứ tuần tự như vậy cho đến hết các sheet mà mình đã chọn lúc ban đầu. Thế thì làm như thế nào đây bạn?

Vấn đề "Lấy dữ liệu từ File không mở" trong Excel có thể có nhiều cách nhưng tôi mới biết có 2 cách:

Cách 1: "Lấy dữ liệu từ File không mở"
(thực sự không mở) bằng cách viết code theo Record Macro quá trình Import External Data.

Cách 2:
"Lấy dữ liệu từ File không mở" (mở nhưng không nhìn thấy) bằng cách dùng VBA mở file nguồn ra - Copy dữ liệu - rồi đóng file nguồn lại. Nghe thì thấy phức tạp nhưng code rất ngắn gọn và quá trình thực hiện diễn ra rất nhanh người dùng hoàn toàn không nhìn thấy, nếu không xem code thì không thể biết đang dùng cách 1 hay cách 2 (hiện tại tôi vẫn đang sử dụng cách 2).

Mục đích tôi đưa cách 1 lên là để nghiên cứu học hỏi thêm chứ ứng dụng vào thực tế thì e là phức tạp hơn cách 2 (so sánh tốc độ thì tôi chưa thử).

Rất cảm ơn bạn đã quan tâm nhưng hiện tại tôi cũng đang lực bất tòng tâm.
 
Upvote 0
Vấn đề "Lấy dữ liệu từ File không mở" trong Excel có thể có nhiều cách nhưng tôi mới biết có 2 cách:

Cách 1: "Lấy dữ liệu từ File không mở"
(thực sự không mở) bằng cách viết code theo Record Macro quá trình Import External Data.

Cách 2:
"Lấy dữ liệu từ File không mở" (mở nhưng không nhìn thấy) bằng cách dùng VBA mở file nguồn ra - Copy dữ liệu - rồi đóng file nguồn lại. Nghe thì thấy phức tạp nhưng code rất ngắn gọn và quá trình thực hiện diễn ra rất nhanh người dùng hoàn toàn không nhìn thấy, nếu không xem code thì không thể biết đang dùng cách 1 hay cách 2 (hiện tại tôi vẫn đang sử dụng cách 2).

Mục đích tôi đưa cách 1 lên là để nghiên cứu học hỏi thêm chứ ứng dụng vào thực tế thì e là phức tạp hơn cách 2 (so sánh tốc độ thì tôi chưa thử).

Rất cảm ơn bạn đã quan tâm nhưng hiện tại tôi cũng đang lực bất tòng tâm.
Cách 2 tuy đơn giản nhưng sẽ rắc rối khi gặp lỗi không mở được file (tức file nguồn đã bị lỗi ngay khi mở)
Nếu dùng ADO thì dù cho file nguồn có bị lỗi nó cũng lấy dữ liệu được như thường
 
Upvote 0
Cách 2 tuy đơn giản nhưng sẽ rắc rối khi gặp lỗi không mở được file (tức file nguồn đã bị lỗi ngay khi mở)
Nếu dùng ADO thì dù cho file nguồn có bị lỗi nó cũng lấy dữ liệu được như thường

Mình vote 1 phiếu cho quan điểm này, dùng ADO với các câu lệnh SQL phong phú cho ta trích lọc tuỳ ý, thậm chí trong tổng hợp dữ liệu dùng Crosstab còn nhanh hơn cả chép dữ liệu rồi dùng công thức Sumproduct
 
Upvote 0
bác NDU cho mình hỏi một chút, mình đã down file GetData_FromCloseWB_Example của bác về nhưng khi chạy để copy dữ liệu thì không ra kết quả gì hết (mình đã chọn file và chọn sheet trong form). Hơi gà nên mong bác giải thích giúp.
 
Lần chỉnh sửa cuối:
Upvote 0
Hi sao file của bạn chạy tren ex 2010 khi lấy dữ liệu báo lỗi Please enter Ms jet ole DB innitalization
 
Upvote 0
Bạn để ý đoạn code này:
Mã:
With .QueryTables.Add(Connection:=Array("OLEDB;[COLOR=red][B]Provider=Microsoft.Jet.OLEDB.4.0[/B][/COLOR];Data Source=" & FileName & ";Jet OLEDB:Engine Type=35"), Destination:=Selection)
Bạn sửa đoạn này thành vầy xem
Mã:
With .QueryTables.Add(Connection:=Array("OLEDB;[COLOR=red][B]Provider=Microsoft.ACE.OLEDB.12.0[/B][/COLOR];Data Source=" & FileName & ";Jet OLEDB:Engine Type=35"), Destination:=Selection)
Vậy để chạy được trên cả Excel 2003 và Excel 2007 ta có thể sửa Sub ImPortDaTa_FileClose thành vầy:
PHP:
Private Sub ImPortDaTa_FileClose(FileName As String, ShName As String)
  Dim Provider As String
  On Error Resume Next
  With Application
    Provider = IIf(Val(.Version) > 11, "Microsoft.ACE.OLEDB.12.0", "Microsoft.Jet.OLEDB.4.0")
  End With
  With ActiveSheet
    .Cells.Clear
    With .QueryTables.Add(Connection:=Array("OLEDB;Provider=" & Provider & ";Data Source=" & FileName & ";Jet OLEDB:Engine Type=35"), Destination:=Selection)
      .CommandType = xlCmdTable
      .CommandText = Array(ShName & "$")
      .Refresh BackgroundQuery:=False
      .SourceDataFile = FileName
    End With
    Selection.EntireRow.Delete
    .UsedRange.Columns.AutoFit
  End With
End Sub
Bạn thử xem thế nào nhé
Để copy và paste nối tiếp với nhau
VD tôi có arr1 và arr2, arr3 thì code viết như thế nào vậy để nối chúng thành 1
 
Upvote 0
Web KT

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

Back
Top Bottom