Giúp đỡ sửa VBA lấy dữ liệu từ file Excel khác đang đóng
Hiện mình muốn sửa Code VBA bên dưới để lấy dữ liệu từ file khác.
Rất mong anh chị giúp đỡ
Lý do: VBA lấy dữ liệu chạy từng sub 1 để lấy dữ liệu của từng Sheet, nên thỉnh thoảng phát sinh lỗi và nhìn rất rối
Dim vFile, FileItem, aRes, Target As Range, Sh Dim FileName As String, SheetName As String, RangeAddress As String On Error Resume Next vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsb; *.xlsm", , , , True) If TypeName(vFile) = "Variant()" Then SheetName = "HinhSu": RangeAddress = "B6:W9999" For Each FileItem In vFile aRes = Nothing FileName = CStr(FileItem) If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then aRes = GetData(FileName, SheetName, RangeAddress, False, False) If IsArray(aRes) Then Set Target = ThongKe_HS.Range("B" & iCuoi(ThongKe_HS, 4) + 1).End(xlUp).Offset(1) Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes End If End If Next End If '-------------------------------------------------------------------------------- If TypeName(vFile) = "Variant()" Then SheetName = "DanSu": RangeAddress = "B6:W9999" For Each FileItem In vFile aRes = Nothing FileName = CStr(FileItem) If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then aRes = GetData(FileName, SheetName, RangeAddress, False, False) If IsArray(aRes) Then Set Target = ThongKe_DS.Range("B" & iCuoi(ThongKe_DS, 4) + 1).End(xlUp).Offset(1) Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes End If End If Next End If '-------------------------------------------------------------------------------- If TypeName(vFile) = "Variant()" Then SheetName = "HonNhan": RangeAddress = "B6:W9999" For Each FileItem In vFile aRes = Nothing FileName = CStr(FileItem) If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then aRes = GetData(FileName, SheetName, RangeAddress, False, False) If IsArray(aRes) Then Set Target = ThongKe_HN.Range("B" & iCuoi(ThongKe_HN, 4) + 1).End(xlUp).Offset(1) Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes End If End If Next End If '-------------------------------------------------------------------------------- If TypeName(vFile) = "Variant()" Then SheetName = "LaoDong": RangeAddress = "B6:W9999" For Each FileItem In vFile aRes = Nothing FileName = CStr(FileItem) If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then aRes = GetData(FileName, SheetName, RangeAddress, False, False) If IsArray(aRes) Then Set Target = ThongKe_LD.Range("B" & iCuoi(ThongKe_LD, 4) + 1).End(xlUp).Offset(1) Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes End If End If Next End If '-------------------------------------------------------------------------------- If TypeName(vFile) = "Variant()" Then SheetName = "HoaGiai": RangeAddress = "B6:W9999" For Each FileItem In vFile aRes = Nothing FileName = CStr(FileItem) If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then aRes = GetData(FileName, SheetName, RangeAddress, False, False) If IsArray(aRes) Then Set Target = ThongKe_HG.Range("B" & iCuoi(ThongKe_HG, 4) + 1).End(xlUp).Offset(1) Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes End If End If Next End If '-------------------------------------------------------------------------------- If TypeName(vFile) = "Variant()" Then SheetName = "THA_HS": RangeAddress = "B6:W9999" For Each FileItem In vFile aRes = Nothing FileName = CStr(FileItem) If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then aRes = GetData(FileName, SheetName, RangeAddress, False, False) If IsArray(aRes) Then Set Target = ThongKe_THA.Range("B" & iCuoi(ThongKe_THA, 4) + 1).End(xlUp).Offset(1) Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes End If End If Next End If End Sub
Mình thấy bạn lấy tất cả dữ liệu từ file nguồn sang file đích thì cần gì chạy code nhỉ, cứ copy file là xong mà.
Mình muốn sử dụng chức năng đó để khôi phục dữ liệu, nhiều trường hợp chỉ lấy 1 phần dữ liệu gốc, nên nếu copy thủ công rất tốn thời gian và dễ bị lỗi
Bạn tham khảo, không biết có đúng ý không.
Khóa học SprinGO phù hợp
Khóa học Power PI – Ứng dung trong Nhân sự
TỔNG QUAN KHÓA HỌC: POWER BI CHO NGÀNH NHÂN SỰ Khóa học Power BI cho Nhân sự được thiết kế dành riêng cho các...
Xem khóa học
Không hiểu lắm. Nếu giống nhau y hệt thì làm gì có lỗi chứ, có bao nhiêu cứ liệt kê vào Or này nè.
Mình đã liệt kê hết rồi, khi số lượng sheet 2 file bằng nhau thì phát sinh lỗi
Thêm 3 dấu nháy này rồi test cả 2 trường hợp: thừa sheet và bằng sheet xem sao.
'On Error Resume Next
……………………………………………………..
'On Error GoTo 0
'If i = 0 Then Exit Sub
Nhìn qua thì có thể do dòng code này (màu xanh) làm phát sinh lỗi khi cả 2 file có thêm các sheet1,2,3…
Bên "Nguồn" có thêm Sheet1, bên "Đích" cũng có thêm Sheet1 => chạy các dòng code kế tiếp mà 2 sheets này không có dữ liệu gì cả.
1745
Duyệt từng Sheet – lấy tên – so sánh -> phát sinh lỗi nếu phát sinh thêm tên sheet bất kỳ ("Sheet1", "ABC"…) mà không phải là Sheet lấy dữ liệu. Theo tôi làm thì sẽ khai báo cố định luôn tên các sheet cần lấy dữ liệu.
Lý do:
Bạn đã thiết kế ứng dụng cố định cho các công việc như vậy thì cũng phải thiết kế cố định luôn tên các sheet chứ đâu thể hứng lên thì đổi tên, rồi phải đổi tên đồng bộ cả 2 file nguồn và đích.
Một khi đã có chuỗi tên sheet cố định thì chỉ cần duyệt 1 vòng mảng tên sheet rồi gán giá trị luôn.
File này dựa trên code của bạn @Hoàng Tuấn 868 , tôi chỉ sửa lại một chút theo cách của tôi.
Còn mấy trường hợp không nằm trong pham vi xử lý của file này:
– Số cột thay đổi, thứ tự thay đổi.
– Copy dữ liệu không có kiểm tra trùng.
– … (chưa tìm ra)
Cứ xài tạm vậy thôi.
À tại trong code tôi chạy test thử 1 sheet thôi mà quên sửa lại như cũ.
Bạn kiếm dòng code như trong hình (dòng màu xanh) – Bỏ số 0 và dấu nháy đơn đi là được rồi.
1836
Còn các vấn đề sau của bạn thì nó vẫn chạy đúng như yêu cầu đó. Chỉ lấy dữ liệu những Sheet nào bạn gõ trong ô B1 – Sheet "Settings".
Bạn thử nghiên cứu xem nhé.
Bạn thử lại xem sao nhé.
Lâu chưa xem lại nhưng có thể thêm điều kiện lấy ngày nào theo mình mong muốn thôi.
Bạn cho ví dụ cụ thể, diễn giải thao tác và kết quả mong muốn vào file xem thế nào. Ví dụ là nhập ngày nào thì lấy ngày đó thôi hay chỉ lấy ngày nhỏ hơn hoặc bằng ngày chọn chẳng hạn…
Không thì dùng thử file này xem đúng ý chưa nhé. (Nhập ngày nào lấy dữ liệu ngày đó).
Bạn nhập như sau: 08/11/2022 hoặc 08/11/22 đều được.
File này mình đặt lấy giá trị lớn hơn hoặc bằng ngày chọn.