Dùng Macro 4 để lấy dữ liệu từ 1 file đang đóng

anhtuan1066

Thành viên gạo cội
Tham gia ngày
10 Tháng ba 2007
Bài viết
5,814
Được thích
6,823
Điểm
860
Tuổi
52
Nơi ở
Biên Hòa, Đồng Nai
Loại bài toán này đã từng được nói rất nhiều lần trên diễn đàn rồi. Hầu hết người ta dùng 2 cách:
Cách 1: Mở file để lấy dữ liệu rồi đóng file lại
Cách 2: Dùng ADO (không thấy mở file nhưng vẫn có mở ngầm)
Hôm nay xin giới thiệu với bạn 1 cách cực kỳ đơn giản (tự các bạn xây dựng). Bẳng cách dùng Macro 4, các bạn sẽ thấy giải thuật đơn giản đến không ngờ
Tất cả bắt đầu bằng những thí nghiệm sau đây:
- Giả sử ta có file Source.xls và file Main.xls nằm cùng 1 thư mục
- File Source.xls là file chứa nguồn dữ liệu
- Ta mở 2 file cùng lúc. Tại file Main, sheet1, cell A1, tôi gõ dấu = , xong tôi dời con trỏ sang file Source.xls rồi nhấp chọn cell A1
- Sau khi thực hiện xong ta được công thức =[Source.xls]Sheet1!$A$1
- Đóng file Source.xls, ta thấy công thức tại cell A1 của file Main.xls đã biến đổi, có thêm đường dẩn tuyệt đối... đại khái thế này
PHP:
='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!$A$1
- Giở ta bật chức năng record macro lên, chọn cell A1, bấm F2Enter... xong, tắt record macro và Alt + F11 để xem code, ta sẽ thấy code có dạng thế này:
PHP:
Sub Macro1()
'
' Macro recorded 17/8/2010 by Anh Tu?n
'
'
    Range("A1").Select
    ActiveCell.FormulaR1C1 = _
        "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
    Range("A2").Select
End Sub
- Chỉnh sửa code lại 1 tí:
PHP:
Sub Macro1()
  Range("A1") = "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
End Sub
- Code này làm công việc gán công thức liên kết đến file Source.xls vào cell A1 của file Main.xls
- Để chuyển công thức thành giá trị, ta có 2 cách
Cách 1:
PHP:
Sub Macro1()
  With Range("A1")
    .Value = "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
    .Value = .Value
  End With
End Sub
Cách 2:
PHP:
Sub Macro1()
  Range("A1") = ExecuteExcel4Macro("'C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1")
End Sub
- Và cách 2 này chính là phương pháp dùng macro 4 để lấy dữ liệu ở file đang đóng
----------------------------------------------------------
- Hãy nghiên cứu chuổi "'C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
Ta thấy nó có cú pháp thế này:
"'" & đường dẩn & "[" Tên file & "]" & Tên sheet & "'!" & địa chỉ cell
- Vậy hãy xây dựng 1 code dựa trên phương pháp lấy dữ liệu này nhé
PHP:
Function GetData(sFile As String, sSheet As String, sAddr As String)
  Dim pLink As String, iR As Long, iC As Long, Arr
  If Len(Dir(sFile)) Then
    Arr = Range(sAddr)
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    For iR = 1 To Range(sAddr).Rows.Count
      For iC = 1 To Range(sAddr).Columns.Count
        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr).Cells(iR, iC).Address(, , 2))
      Next iC
    Next iR
    GetData = Arr
  End If
End Function
- Hàm đã có, giờ để lấy dữ liệu vùng A1:D12 tại sheet1 của file Source.xls, ta viết thêm code này:
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:D100"
  Range("A1:D12") = GetData(sFile, sSheet, sAddr)
End Sub
-----------------------------
Ứng dụng mở rộng: Nạp list cho ComboBox, với dữ liệu được lấy từ file đang đóng
- Giả sử ta có sẳn 1 ComboBox, tên ComboBox1
- Dữ liệu cần lấy nằm ở vùng H1:H10 của sheet1, file Source.xls
- Ta viết code sau:
PHP:
Sub AddList()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "H1:H10"
  Sheet1.ComboBox1.List() = GetData(sFile, sSheet, sAddr)
End Sub
Sau khi chạy code, hãy bấm vào ComboBox xem thử
------------------------------------
Ưu điểm và nhược điểm:
- Ưu điểm của phương pháp dùng macro 4 này là code đơn giản, lại hoàn toàn không mở file tí nào (ngay cả ADO, tuy không thấy mở file nhưng thực chất nó cũng mở ngầm)
- Với ADO hoặc phương thức mở file trực tiếp, dù không biết tên sheet thì ít nhất ta cũng lấy được dữ liệu tại sheet đầu tiên
- Với phương pháp dùng Macro 4, bắt buộc phải biết trước tên sheet
- Còn ưu điểm hay nhược điểm gì nữa.. chúng ta cùng nghiên cứu thêm nhé
------------------------------------
Hãy tham khảo file đính kèm và cảm nhận nhé! Đơn giản không nào?
------------------------------------
Lưu ý quan trọng: Tại file về, phải giải nén ra rồi hẳn chạy, nếu không code chẳng hoạt động đâu nha
 

File đính kèm

Chỉnh sửa lần cuối bởi điều hành viên:

MinhCong

Thành viên gắn bó
Tham gia ngày
28 Tháng năm 2009
Bài viết
1,645
Được thích
1,803
Điểm
860
Em có 2 file. File Data (chứa dữ liệu nguồn) và file Laydulieu (là file cần thực hiện lấy dữ liệu). Trong file lấy dữ liệu tại sheet Dongia, Em chỉ cần nhập mã hiệu thì tự động dò tìm bên file Data kết xuất qua. Trong file Em có ghi yêu cầu. Liệu macro4 có làm được vấn đề như trong file Em hỏi không nhỉ?
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,360
Điểm
11,910
Em có 2 file. File Data (chứa dữ liệu nguồn) và file Laydulieu (là file cần thực hiện lấy dữ liệu). Trong file lấy dữ liệu tại sheet Dongia, Em chỉ cần nhập mã hiệu thì tự động dò tìm bên file Data kết xuất qua. Trong file Em có ghi yêu cầu. Liệu macro4 có làm được vấn đề như trong file Em hỏi không nhỉ?
Nếu là tôi thì đầu tiên tôi sẽ dùng macro 4, copy toàn bộ dữ liệu tại file nguồn cho vào 1 sheet phụ ---> Sau đó muốn làm gì chả được! (xong việc có thể xóa dữ liệu tạm đi)
 

MinhCong

Thành viên gắn bó
Tham gia ngày
28 Tháng năm 2009
Bài viết
1,645
Được thích
1,803
Điểm
860
Nếu là tôi thì đầu tiên tôi sẽ dùng macro 4, copy toàn bộ dữ liệu tại file nguồn cho vào 1 sheet phụ ---> Sau đó muốn làm gì chả được! (xong việc có thể xóa dữ liệu tạm đi)
Trong cùng 1 file thì Em dùng hàm là OK nhưng dùng VBA thì Em chưa rành. Anh có thể hướng giúp theo cách copy vào 1 sheet phụ rồi xử lý nó được không?
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,360
Điểm
11,910
Trong cùng 1 file thì Em dùng hàm là OK nhưng dùng VBA thì Em chưa rành. Anh có thể hướng giúp theo cách copy vào 1 sheet phụ rồi xử lý nó được không?
Thì code này đây:
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:D100"
  Range("A1:D12") = GetData(sFile, sSheet, sAddr)
End Sub
Dùng để copy ra sheet phụ chứ còn gì nữa... Bạn làm như sau:
- Ở code trên, hãy sửa Source.xls thành Data.xls
- Sửa Sheet1 thành Dinhmuc
- Sửa A1:D12 thành A1:F58
- Chèn thêm 1 sheet, chạy code vừa sửa là có ngay dữ liệu thôi
-----------------
Sau khi đã cho dữ liệu vào cùng 1 file thì phần còn lại đó là 1 bài toán khác rồi (sẽ giải quyết ở 1 topic khác, đồng ý không?)
 

anhtuan1066

Thành viên gạo cội
Tham gia ngày
10 Tháng ba 2007
Bài viết
5,814
Được thích
6,823
Điểm
860
Tuổi
52
Nơi ở
Biên Hòa, Đồng Nai
Bạn giải thích giúp sao lại phải cùng 1 thư mục
Điều này không bắt buộc, tôi để cùng 1 thư mục để tiện cho quá trình thí nghiệm thôi
Nếu file của bạn nằm ở thư mục khác, cứ ghi đường dẫn chính xác vào là được rồi
Ví dụ đoạn code này:
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:D100"
  Range("A1:D12") = GetData(sFile, sSheet, sAddr)
End Sub
Nếu file Source.xls nằm ở 1 thư mục khác (D:\Baitap\Source.xls chẳng hạn) thì sửa code thành:
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = "D:\Baitap\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:D100"
  Range("A1:D12") = GetData(sFile, sSheet, sAddr)
End Sub
Vậy thôi
 

anhtuan1066

Thành viên gạo cội
Tham gia ngày
10 Tháng ba 2007
Bài viết
5,814
Được thích
6,823
Điểm
860
Tuổi
52
Nơi ở
Biên Hòa, Đồng Nai
Giải pháp rất hay. Khi Source.xls có Password to open thì thế nào nhỉ?
Đây cũng là 1 nhược điểm nữa của phương pháp này!
Với file có Pass Open, khi chạy code chỉ có cách nhập pass bằng tay vào thôi (vì chắc chắn nó sẽ hiện ra 1 khung xác nhận password)
 

le tin

Học mãi
Tham gia ngày
22 Tháng mười 2007
Bài viết
724
Được thích
557
Điểm
860
Nếu là tôi thì đầu tiên tôi sẽ dùng macro 4, copy toàn bộ dữ liệu tại file nguồn cho vào 1 sheet phụ ---> Sau đó muốn làm gì chả được! (xong việc có thể xóa dữ liệu tạm đi)
Giải pháp bạn đưa ra rất hay , nhưng tôi thử thấy rất chậm , bạn kiểm tra giúp đúng không
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,360
Điểm
11,910
Giải pháp bạn đưa ra rất hay , nhưng tôi thử thấy rất chậm , bạn kiểm tra giúp đúng không
Bạn nói đúng! Vì thế giải pháp này chỉ nên áp dụng với dữ liệu nhỏ mà thôi
Được cái là code đơn giản, dễ nhớ, tự mình xây dựng được! ----> Dù sao thì để lấy dữ liệu khoảng 100 dòng mà mang nguyên cả code dùng ADO ra cũng phí (nhớ được code cũng cả 1 vấn đề)
 

le tin

Học mãi
Tham gia ngày
22 Tháng mười 2007
Bài viết
724
Được thích
557
Điểm
860
Có mấy trường hợp thế này:
1/Dữ liệu(DL) và chương trình(CT) cùng trong 1 file
2/DL và CT trong 2 file . Khi chạy thì mở cả 2 , copy DL vào CT , đóng DL
3/DL và CT trong 2 file . Khi chạy thì mở CT , copy DL từ file đang đóng DL
4/DL và CT trong 2 file . Khi chạy thì mở CT , lấy DL từ file đang đóng DL đưa vào mảng , xử lý tại đây rồi lấy kết quả .
Theo tôi cách 2/ không hơn gì 1/ , cách 3/ như nói ở trên và dung lượng nó cũng lớn lên như 1/ và 2/
Cách 4/ tôi nghĩ là hay nhưng chưa biết cách làm
Suy nghĩ vậy không biết đúng không , xin cho biết ý kiến bạn
 

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia ngày
5 Tháng sáu 2008
Bài viết
30,166
Được thích
52,360
Điểm
11,910
Có mấy trường hợp thế này:
1/Dữ liệu(DL) và chương trình(CT) cùng trong 1 file
2/DL và CT trong 2 file . Khi chạy thì mở cả 2 , copy DL vào CT , đóng DL
3/DL và CT trong 2 file . Khi chạy thì mở CT , copy DL từ file đang đóng DL
4/DL và CT trong 2 file . Khi chạy thì mở CT , lấy DL từ file đang đóng DL đưa vào mảng , xử lý tại đây rồi lấy kết quả .
Theo tôi cách 2/ không hơn gì 1/ , cách 3/ như nói ở trên và dung lượng nó cũng lớn lên như 1/ và 2/
Cách 4/ tôi nghĩ là hay nhưng chưa biết cách làm
Suy nghĩ vậy không biết đúng không , xin cho biết ý kiến bạn
Đối với trường hợp lấy dữ liệu từ Workbook đang đóng, tôi nghĩ nếu đưa vào mảng sẽ chậm hơn so với cách đưa trực tiếp
Các code ở trên là dùng mảng đấy thôi!
Còn đây là cách không dùng mảng và vòng lập
PHP:
Sub GetData(sFile As String, sSheet As String, sAddr As String, Target As Range)
  Dim pLink As String
  If Len(Dir(sFile)) Then
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    With Range(sAddr)
      With Target.Resize(.Rows.Count, .Columns.Count)
        .FormulaArray = "=" & pLink & sAddr
        .Value = .Value
      End With
    End With
  End If
End Sub
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:C10000"
  GetData sFile, sSheet, sAddr, Range("A1")
End Sub
Cách này cho tốc độ nhanh hơn, tuy nhiên vẫn có giới hạn (giới hạn bao nhiêu tôi chưa biết) ---> Nếu tăng vùng dữ liệu cần lấy (chẳng hạn A1:C60000) thì code sẽ báo lỗi
Còn việc tăng dung lượng gì đó thì... có sao đâu ---> Sao khi xong việc, bạn xóa dữ liệu đi là xong chứ gì!
Đương nhiên chỉ có cách dùng ADO là hầu như không bị giới hạn gì cả nhưng ác cái là code rất khó nhớ
 

stulipig

Thành viên mới
Tham gia ngày
17 Tháng chín 2007
Bài viết
7
Được thích
1
Điểm
0
Loại bài toán này đã từng được nói rất nhiều lần trên diễn đàn rồi. Hầu hết người ta dùng 2 cách:
Cách 1: Mở file để lấy dữ liệu rồi đóng file lại
Cách 2: Dùng ADO (không thấy mở file nhưng vẫn có mở ngầm)
Hôm nay xin giới thiệu với bạn 1 cách cực kỳ đơn giản (tự các bạn xây dựng). Bẳng cách dùng Macro 4, các bạn sẽ thấy giải thuật đơn giản đến không ngờ
Tất cả bắt đầu bằng những thí nghiệm sau đây:
- Giả sử ta có file Source.xls và file Main.xls nằm cùng 1 thư mục
- File Source.xls là file chứa nguồn dữ liệu
- Ta mở 2 file cùng lúc. Tại file Main, sheet1, cell A1, tôi gõ dấu = , xong tôi dời con trỏ sang file Source.xls rồi nhấp chọn cell A1
- Sau khi thực hiện xong ta được công thức =[Source.xls]Sheet1!$A$1
- Đóng file Source.xls, ta thấy công thức tại cell A1 của file Main.xls đã biến đổi, có thêm đường dẩn tuyệt đối... đại khái thế này
PHP:
='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!$A$1
- Giở ta bật chức năng record macro lên, chọn cell A1, bấm F2Enter... xong, tắt record macro và Alt + F11 để xem code, ta sẽ thấy code có dạng thế này:
PHP:
Sub Macro1()
'
' Macro recorded 17/8/2010 by Anh Tu?n
'
'
    Range("A1").Select
    ActiveCell.FormulaR1C1 = _
        "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
    Range("A2").Select
End Sub
- Chỉnh sửa code lại 1 tí:
PHP:
Sub Macro1()
  Range("A1") = "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
End Sub
- Code này làm công việc gán công thức liên kết đến file Source.xls vào cell A1 của file Main.xls
- Để chuyển công thức thành giá trị, ta có 2 cách
Cách 1:
PHP:
Sub Macro1()
  With Range("A1")
    .Value = "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
    .Value = .Value
  End With
End Sub
Cách 2:
PHP:
Sub Macro1()
  Range("A1") = ExecuteExcel4Macro("'C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1")
End Sub
- Và cách 2 này chính là phương pháp dùng macro 4 để lấy dữ liệu ở file đang đóng
----------------------------------------------------------
- Hãy nghiên cứu chuổi "'C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
Ta thấy nó có cú pháp thế này:
"'" & đường dẩn & "[" Tên file & "]" & Tên sheet & "'!" & địa chỉ cell
- Vậy hãy xây dựng 1 code dựa trên phương pháp lấy dữ liệu này nhé
PHP:
Function GetData(sFile As String, sSheet As String, sAddr As String)
  Dim pLink As String, iR As Long, iC As Long, Arr
  If Len(Dir(sFile)) Then
    Arr = Range(sAddr)
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    For iR = 1 To Range(sAddr).Rows.Count
      For iC = 1 To Range(sAddr).Columns.Count
        Arr(iR, iC) = ExecuteExcel4Macro(pLink & Range(sAddr).Cells(iR, iC).Address(, , 2))
      Next iC
    Next iR
    GetData = Arr
  End If
End Function
- Hàm đã có, giờ để lấy dữ liệu vùng A1:D12 tại sheet1 của file Source.xls, ta viết thêm code này:
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:D100"
  Range("A1:D12") = GetData(sFile, sSheet, sAddr)
End Sub
-----------------------------
Ứng dụng mở rộng: Nạp list cho ComboBox, với dữ liệu được lấy từ file đang đóng
- Giả sử ta có sẳn 1 ComboBox, tên ComboBox1
- Dữ liệu cần lấy nằm ở vùng H1:H10 của sheet1, file Source.xls
- Ta viết code sau:
PHP:
Sub AddList()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "H1:H10"
  Sheet1.ComboBox1.List() = GetData(sFile, sSheet, sAddr)
End Sub
Sau khi chạy code, hãy bấm vào ComboBox xem thử
------------------------------------
Ưu điểm và nhược điểm:
- Ưu điểm của phương pháp dùng macro 4 này là code đơn giản, lại hoàn toàn không mở file tí nào (ngay cả ADO, tuy không thấy mở file nhưng thực chất nó cũng mở ngầm)
- Với ADO hoặc phương thức mở file trực tiếp, dù không biết tên sheet thì ít nhất ta cũng lấy được dữ liệu tại sheet đầu tiên
- Với phương pháp dùng Macro 4, bắt buộc phải biết trước tên sheet
- Còn ưu điểm hay nhược điểm gì nữa.. chúng ta cùng nghiên cứu thêm nhé
------------------------------------
Hãy tham khảo file đính kèm và cảm nhận nhé! Đơn giản không nào?
------------------------------------
Lưu ý quan trọng: Tại file về, phải giải nén ra rồi hẳn chạy, nếu không code chẳng hoạt động đâu nha
Anh Tuấn ơi, nếu có nhiều file đang đóng cần lấy dữ liệu như: source1, source2... Khi người dùng nhập tên file vào ô E1 của file Main, sẽ lấy được vùng dữ liệu của file tương ứng.

Ví dụ: chỉ cần nhập vào ô E1 của file main tên file Source1 thì sẽ lấy được dữ liệu từ file Source 1.

Mong Anh hướng dẫn giúp.
 

thuycong

Thành viên mới
Tham gia ngày
16 Tháng tư 2012
Bài viết
1
Được thích
0
Điểm
0
Tuổi
36
Help me

Mình thường nhập dữ liệu từ file excel sang một chương trình nhập tin (dữ liệu của chương trình này bị khóa ) mình không thể nào chuyển dư liệu excel thành file dbf của chương trình được.Cho mình hỏi có chương trình gì để nhập tin tự động bằng cách lấy dữ liệu tử file excel không. minh nghe nói là qmacro làm được nhưng mình không biết cách sử dụng, ai biết chỉ mình với
 
Lần chỉnh sửa cuối:

giaosucan

Thành viên hoạt động
Tham gia ngày
6 Tháng bảy 2012
Bài viết
117
Được thích
1
Điểm
0
Tuổi
37
Thế có thể dùng macro 4 để ghi dữ liệu vào file đang đóng ko bác
 

zztantaibazz

Thành viên chính thức
Tham gia ngày
19 Tháng tám 2013
Bài viết
96
Được thích
46
Điểm
0
Tuổi
30
Nơi ở
TP HCM
Đối với trường hợp lấy dữ liệu từ Workbook đang đóng, tôi nghĩ nếu đưa vào mảng sẽ chậm hơn so với cách đưa trực tiếp
Các code ở trên là dùng mảng đấy thôi!
Còn đây là cách không dùng mảng và vòng lập
PHP:
Sub GetData(sFile As String, sSheet As String, sAddr As String, Target As Range)
  Dim pLink As String
  If Len(Dir(sFile)) Then
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    With Range(sAddr)
      With Target.Resize(.Rows.Count, .Columns.Count)
        .FormulaArray = "=" & pLink & sAddr
        .Value = .Value
      End With
    End With
  End If
End Sub
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:C10000"
  GetData sFile, sSheet, sAddr, Range("A1")
End Sub
Cách này cho tốc độ nhanh hơn, tuy nhiên vẫn có giới hạn (giới hạn bao nhiêu tôi chưa biết) ---> Nếu tăng vùng dữ liệu cần lấy (chẳng hạn A1:C60000) thì code sẽ báo lỗi
Còn việc tăng dung lượng gì đó thì... có sao đâu ---> Sao khi xong việc, bạn xóa dữ liệu đi là xong chứ gì!
Đương nhiên chỉ có cách dùng ADO là hầu như không bị giới hạn gì cả nhưng ác cái là code rất khó nhớ
Hi mọi người.

Lâu nay em sử dụng cách dùng VBA mở file và copy dữ liệu.
Dữ liệu ở các file khác nhau đều được để trong Table1.
Vậy có cách nào để lấy data trong Table1 từ nhiều file mà không cần mở file không?
 

vitl0veme0

Thành viên mới
Tham gia ngày
17 Tháng chín 2013
Bài viết
16
Được thích
0
Điểm
163
Tuổi
28
Đối với trường hợp lấy dữ liệu từ Workbook đang đóng, tôi nghĩ nếu đưa vào mảng sẽ chậm hơn so với cách đưa trực tiếp
Các code ở trên là dùng mảng đấy thôi!
Còn đây là cách không dùng mảng và vòng lập
PHP:
Sub GetData(sFile As String, sSheet As String, sAddr As String, Target As Range)
  Dim pLink As String
  If Len(Dir(sFile)) Then
    pLink = "'" & Replace(sFile, Dir(sFile), "[" & Dir(sFile) & "]") & sSheet & "'!"
    With Range(sAddr)
      With Target.Resize(.Rows.Count, .Columns.Count)
        .FormulaArray = "=" & pLink & sAddr
        .Value = .Value
      End With
    End With
  End If
End Sub
PHP:
Sub Test()
  Dim sFile As String, sSheet As String, sAddr As String
  sFile = ThisWorkbook.Path & "\Source.xls"
  sSheet = "Sheet1"
  sAddr = "A1:C10000"
  GetData sFile, sSheet, sAddr, Range("A1")
End Sub
Cách này cho tốc độ nhanh hơn, tuy nhiên vẫn có giới hạn (giới hạn bao nhiêu tôi chưa biết) ---> Nếu tăng vùng dữ liệu cần lấy (chẳng hạn A1:C60000) thì code sẽ báo lỗi
Còn việc tăng dung lượng gì đó thì... có sao đâu ---> Sao khi xong việc, bạn xóa dữ liệu đi là xong chứ gì!
Đương nhiên chỉ có cách dùng ADO là hầu như không bị giới hạn gì cả nhưng ác cái là code rất khó nhớ
code này chỉ paste ra sheet hiện hành, khi mà cho paste ra sheet khác (vẫn cùng workbook) lại báo lỗi =>> có cách nào khắc phục ko a?
 

kieu manh

Vừa Cạo Vừa Gội
Tham gia ngày
9 Tháng sáu 2012
Bài viết
3,516
Được thích
2,426
Điểm
560
Nơi ở
Bình Dương
paste ra sheet khác Thì sửa lại code ...Code chạy Tốt mà không biết cứ hay nói linh tinh lung tung --=0--=0--=0
Hướng Dẫn: Đọc Kỹ lại Bài #1 là biết cách sử dụng
Đọc kỹ hướng dẫn sử dụng trước khi dùng ....Code giống như độc dược ấy...biết thì tốt ...không biết thì tèo (Lỗi)
 
Lần chỉnh sửa cuối:
Top Bottom