anhtuan1066
Thành viên gạo cội
- Tham gia
- 10/3/07
- Bài viết
- 5,802
- Được thích
- 6,912
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
- Giở ta bật chức năng record macro lên, chọn cell A1, bấm F2 và Enter... xong, tắt record macro và Alt + F11 để xem code, ta sẽ thấy code có dạng thế này:
- Chỉnh sửa code lại 1 tí:
- 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:
Cách 2:
- 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é
- Hàm đã có, giờ để lấy dữ liệu vùng A112 tại sheet1 của file Source.xls, ta viết thêm code này:
-----------------------------
Ứ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:
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
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
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
PHP:
Sub Macro1()
Range("A1") = "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1"
End Sub
- Để 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
PHP:
Sub Macro1()
Range("A1") = ExecuteExcel4Macro("'C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1")
End Sub
----------------------------------------------------------
- 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
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
------------------------------------
Ư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: