Trang 1 của 4 123 ... CuốiCuối
Kết quả 1 đến 10 của 33

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

  1. #1
    mobistar206 Guest

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

    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

    Mã nguồn 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:

    Mã nguồn 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").SelectEnd Sub  
    - Chỉnh sửa code lại 1 tí:

    Mã nguồn 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:

    Mã nguồn PHP:
    Sub Macro1() With Range("A1") .Value = "='C:\Documents and Settings\NHAV\Desktop\GetData_Test\[Source.xls]Sheet1'!R1C1" .Value = .Value End WithEnd Sub  
    Cách 2:

    Mã nguồn 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é

    Mã nguồn 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 IfEnd Function  
    - 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:

    Mã nguồn 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:

    Mã nguồn 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

  2. #2
    Ngày tham gia
    Aug 2015
    Bài viết
    3
    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ỉ?

  3. #3
    vAPK Guest
    Trích dẫn Gửi bởi MinhCong
    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)

  4. #4
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Trích dẫn Gửi bởi ndu96081631
    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?

  5. #5
    hieuind1 Guest
    Trích dẫn Gửi bởi MinhCong
    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:

    Mã nguồn 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 A112 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?)

  6. #6
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Trích dẫn Gửi bởi anhtuan1066
    - Giả sử ta có file Source.xls và file Main.xls nằm cùng 1 thư mục
    Bạn giải thích giúp sao lại phải cùng 1 thư mục

  7. #7
    lolem19 Guest
    Trích dẫn Gửi bởi le tin
    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:

    Mã nguồn 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:

    Mã nguồn 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

  8. #8
    ghorse Guest
    Giải pháp rất hay. Khi Source.xls có Password to open thì thế nào nhỉ?

  9. #9
    Ngày tham gia
    Aug 2015
    Bài viết
    0
    Trích dẫn Gửi bởi ndu96081631
    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

  10. #10
    maimai Guest
    Trích dẫn Gửi bởi chibi
    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)

Trang 1 của 4 123 ... CuốiCuối

Quyền viết bài

  • Bạn Không thể gửi Chủ đề mới
  • Bạn Không thể Gửi trả lời
  • Bạn Không thể Gửi file đính kèm
  • Bạn Không thể Sửa bài viết của mình
  •