Lấy dữ liệu từ file không mở ? (1 người xem)

Liên hệ QC

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

TrungChinhs

Thành viên tích cực
Tham gia
18/2/08
Bài viết
1,475
Được thích
2,470
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 !
 
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 !
Bác sửa lại code như vầy:
Mã:
Sub ImPortDaTa_FileClose()
    [COLOR=red]Dim FD As FileDialog, fName As String[/COLOR]
    Application.ScreenUpdating = 0
    On Error Resume Next
    [COLOR=red]Set FD = Application.FileDialog(1)
    If FD.Show = -1 Then fName = FD.SelectedItems(1)[/COLOR]
     With ActiveSheet
        Cells.Clear
         With .QueryTables.Add(Connection:=Array("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data [COLOR=red]Source=fName[/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
Theo như giới thiệu của bác thì code này hay quá nhưng em không hiểu về nó, nếu bỏ câu lệnh On Error Resume Next thì khi chạy, excel báo lỗi không tìm thấy đối tượng 'TongHop$'. Nhờ bác giải thích code trên giúp em. Cảm ơn bác đã chia sẻ 1 code hay.
 
Upvote 0
Bác sửa lại code như vầy:
Mã:
With .QueryTables.Add(Connection:=Array("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;[COLOR=red][B]Data Source=fName[/B][/COLOR];Jet OLEDB:Engine Type=35"), , Destination:=Selection)
Vầy mới đúng chứ
Mã:
With .QueryTables.Add(Connection:=Array("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0[COLOR=red][B];Data Source=" & fName & "[/B][/COLOR];Jet OLEDB:Engine Type=35"), Destination:=Selection)
Theo như giới thiệu của bác thì code này hay quá nhưng em không hiểu về nó, nếu bỏ câu lệnh On Error Resume Next thì khi chạy, excel báo lỗi không tìm thấy đối tượng 'TongHop$'. Nhờ bác giải thích code trên giúp em. Cảm ơn bác đã chia sẻ 1 code hay.
Record macro quá trình Import External Data sẽ có code này (menu Data\Import External Data)
 
Upvote 0
Cảm ơn 2 bạn Nghiaphuc và Ndu ! sau khi sửa theo ndu code chạy đúng yêu cầu rồi.


...nếu bỏ câu lệnh On Error Resume Next thì khi chạy, excel báo lỗi không tìm thấy đối tượng 'TongHop$'. Nhờ bác giải thích code trên giúp em. Cảm ơn bác đã chia sẻ 1 code hay.

1. Trong file đang đóng (File nguồn) Bạn phải có Sheets("TongHop") - lưu ý tên Sheet không có dấu $ như trong code.
2. Đúng như Ndu hướng dẫn code này là Recode Macro Import data và chỉnh sửa, bổ sung chút ít theo yêu cầu của người dùng. Bạn Recode Macro và so sánh với code sẽ thấy.

Tôi xin hỏi tiếp
Trường hợp trong File nguồn có nhiều Sheet thì... Thì code viết thế nào để chọn được đúng sheet cần lấy dữ liệu ?.

Thanks !
 
Lần chỉnh sửa cuối:
Upvote 0
Tôi xin hỏi tiếp
Trường hợp trong File nguồn có nhiều Sheet thì... Thì code viết thế nào để chọn được đúng sheet cần lấy dữ liệu ?.

Thanks !
Thì anh cứ sửa chổ này
.CommandText = Array("TongHop$")
Thay TongHop thành tên sheet anh muốn thôi
 
Upvote 0
Thì anh cứ sửa chổ này
.CommandText = Array("TongHop$")
Thay TongHop thành tên sheet anh muốn thôi

Ý của tôi là sau khi chọn file thì Sẽ có một FileDialog hoặc From có danh sách các Sheet trong file cho người dùng chọn để không phải sửa code (không mở file nguồn thì làm sao biết trong đó có Sheet nào mà sửa code).
 
Lần chỉnh sửa cuối:
Upvote 0
Ý của tôi là sau khi chọn file thì Sẽ có một FileDialog hoặc From có danh sách các Sheet trong file cho người dùng chọn để không phải sửa code (không mở file nguồn thì làm sao biết trong đó có Sheet nào mà sửa code).
Lại phải tốn thêm 1 code lấy tên sheet từ file đang đóng! Anh xem ở đây:
http://www.giaiphapexcel.com/forum/showthread.php?25407-Lấy-danh-sách-tên-các-Sheet-từ-file-excel
 
Upvote 0

Cảm ơn Ndu ! Mình đã xem lại các bài theo đường Links của bạn nhưng không làm được (thấy tên Sheet trong file chọn rồi nhưng không biết gán tên Sheet vào code này như thế nào).

Bạn viết giúp mình với. Thanks !
 
Upvote 0
Cảm ơn Ndu ! Mình đã xem lại các bài theo đường Links của bạn nhưng không làm được (thấy tên Sheet trong file chọn rồi nhưng không biết gán tên Sheet vào code này như thế nào).

Bạn viết giúp mình với. Thanks !
Với Form và code có sẳn, giờ em thêm code anh vào (trong Form luôn), sửa lại tí:
PHP:
Private Sub ImPortDaTa_FileClose(FileName As String, ShName As String)
  On Error Resume Next
  With ActiveSheet
    .Cells.Clear
    With .QueryTables.Add(Connection:=Array("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";Jet OLEDB:Engine Type=35"), Destination:=Selection)
      .CommandType = xlCmdTable
      .CommandText = Array(ShName & "$")
      .Refresh BackgroundQuery:=False
    End With
    Selection.EntireRow.Delete
    .UsedRange.Columns.AutoFit
  End With
End Sub
Trong form ấy, em thêm 1 nút Lấy dữ liệu với code như sau:
PHP:
Private Sub txtGetData_Click()
  On Error GoTo ExitSub
  ImPortDaTa_FileClose lstWB.List(lstWB.ListIndex), lstWS.List(lstWS.ListIndex)
ExitSub:
End Sub
Chỉ vậy thôi ---> Đương nhiên code này viết ở mức đơn giản nhất, anh phải bẫy thêm các lỗi khác (chẳng hạn chưa chọn filename, chưa chọn tên sheet...)
--------------------
Hình như đoạn này:
Selection.EntireRow.Delete
Hơi thừa thì phải
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn Ndu ! Mình đã test code OK rồi.



Lý do mình viết thêm dòng này vì Khi Import data dòng trên cùng luôn có tiêu đề cột là F1 F2 F... nên phải xóa nó đi.
Hình như trong 1 vùng dữ liệu thì nó xem dòng đầu là tiêu đề cột ---> Trong dòng tiêu đề này, nếu cell nào rổng thì khi xuất kết quả nó sẽ tự điền mấy cái F1, F2... vào
Em cũng chẳng biết nữa, nhưng với dữ liệu đầy đủ tiêu đề thì cho dù em bỏ dòng code Selection.EntireRow.Delete thì nó vẫn cho kết quả bình thường (không có mấy cái F1, F2 đâu)
Còn nếu anh thêm dòng code Selection.EntireRow.Delete vào thì khi xuất dữ liệu sẽ mất tiêu đề
Ngoài ra anh cũng nên cẩn thận, lở selection ban đầu không phải là 1 cell thì... chết ---> Nói không chừng vừa có dữ liệu là nó xóa sạch luôn
Em nghĩ nên là Selection.Resize(1).EntireRow.Delete (Đó là chưa nói đến việc ta vô tình Select nhiều cell rời rạc rồi chạy code ---> Rối)
 
Lần chỉnh sửa cuối:
Upvote 0
Em chạy thử code của anh Ndu thì thấy nếu mình lấy dữ liệu xong rồi lại quay trở lại folder đó lấy dữ liệu file vừa lấy thì không lấy đc các sheet của file nữa. Em dùng off 2007. Anh giải thích giùm với. Thanks!
 
Upvote 0
Em chạy thử code của anh Ndu thì thấy nếu mình lấy dữ liệu xong rồi lại quay trở lại folder đó lấy dữ liệu file vừa lấy thì không lấy đc các sheet của file nữa. Em dùng off 2007. Anh giải thích giùm với. Thanks!
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é
 
Lần chỉnh sửa cuối:
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.
 
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.

Hình như Code trên tôi đã sửa để lấy dữ liệu từ file không có Pass vì vậy bạn thử lại với file không có Pass xem sao.
 
Upvote 0
Các file của em đều không dùng Pass, qua đây anh cho em hỏi thêm về chương trình ghép dữ liệu từ nhiều sheet của anh (em có đọc thấy anh dự định giới thiệu vào dịp sinh nhật lần thứ 4 của GPE), anh gửi cho em đường dẫn để lấy nhé:
 
Upvote 0
Mã:
Sub ImPortDaTa_FileClose()
    Application.ScreenUpdating = 0
    On Error Resume Next
    FileNguon = D:\New  Folder\Nguon.xls
    With ActiveSheet
        Cells.Clear
        .[b1].Select
        With .QueryTables.Add(Connection:=Array("OLEDB;Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileNguon & ";Jet OLEDB:Engine Type=35"), Destination:=Selection)
            .CommandType = 3
            .CommandText = Array("[COLOR=#ff0000][B]ShNguon[/B][/COLOR]$")
            .Refresh BackgroundQuery:=False
        End With
        Selection.EntireRow.Clear
        .UsedRange.Columns.AutoFit
    End With
End Sub

Trong file nguồn (file đang đóng) Sheet tôi muốn lấy dữ liệu là Sheet1(ShNguon) vậy tôi muốn tên Sheet trong Array là tên gốc Sheet1 thay cho tên do người dùng đặt (ShNguon) thì câu lệnh .CommandText = Array("ShNguon$") sửa như thế nào ? tôi đã thử viết .CommandText = Array(Sheet1) hoặc .CommandText = Array(Sheet1 &"$") đều không được.

Nhờ các bạn xem giúp. Thanhks !

Để thử code này bạn tạo một File có tên là Nguon -> đặt tên Sheet muốn lấy dữ liệu là ShNguon -> lưu vào thư mục New Folder trong ổ D:\ và đóng file này lại.
Tạo một file mới rồi đặt code này vào Module và chạy code.
 
Lần chỉnh sửa cuối:
Upvote 0
Trong file nguồn (file đang đóng) Sheet tôi muốn lấy dữ liệu là Sheet1(ShNguon) vậy tôi muốn tên Sheet trong Array là tên gốc Sheet1 thay cho tên do người dùng đặt (ShNguon) thì câu lệnh .CommandText = Array("ShNguon$") sửa như thế nào ? tôi đã thử viết .CommandText = Array(Sheet1) hoặc .CommandText = Array(Sheet1 &"$") đều không được.
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?
 
Upvote 0
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

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

Back
Top Bottom