Giúp đỡ sửa VBA lấy dữ liệu từ file Excel khác đang đóng

Liên hệ QC

chidung2009

Thành viên hoạt động
Tham gia
12/9/12
Bài viết
123
Được thích
8
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



Mã:
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
 

File đính kèm

  • Lấy dữ liệu.zip
    178.3 KB · Đọc: 20
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

Mã:
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à.
 
Upvote 0
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
 
Upvote 0
Chào anh @Hoàng Tuấn 868 !!!
File ở bài #4 của anh là lấy hết các sheet tên và có cùng số cột (23 cột), còn bây giờ em chỉ muốn lấy 2 sheet chỉ định (ví dụ sheet"ABCD" và sheet"FGHK" thôi) mà sheet"ABCD" chỉ có 13 cột, và sheet"FGHK" thì có 17 cột, thì chỉnh code làm sao ạ.
Mong anh giúp.
 
Upvote 0
Chào anh @Hoàng Tuấn 868 !!!
File ở bài #4 của anh là lấy hết các sheet tên và có cùng số cột (23 cột), còn bây giờ em chỉ muốn lấy 2 sheet chỉ định (ví dụ sheet"ABCD" và sheet"FGHK" thôi) mà sheet"ABCD" chỉ có 13 cột, và sheet"FGHK" thì có 17 cột, thì chỉnh code làm sao ạ.
Mong anh giúp.
Bạn với chủ thớt là 1 à
 
Upvote 0
Chào anh @Hoàng Tuấn 868 !!!
File ở bài #4 của anh là lấy hết các sheet tên và có cùng số cột (23 cột), còn bây giờ em chỉ muốn lấy 2 sheet chỉ định (ví dụ sheet"ABCD" và sheet"FGHK" thôi) mà sheet"ABCD" chỉ có 13 cột, và sheet"FGHK" thì có 17 cột, thì chỉnh code làm sao ạ.
Mong anh giúp.
Bạn gửi file lên mình xem cụ thể nhé.
Bạn với chủ thớt là 1 à
Khả năng cao là không phải. Phong cách giao tiếp khác nhau.
 
Upvote 0
Dạ không phải ạ.
Mong các anh giúp đỡ.
 
Upvote 0
Bạn tham khảo, không biết có đúng ý không.
Mình cảm ơn bạn nhiều. Do mình ở quê không có máy tính mong bạn thông cảm.
Hiện mình kiểm tra file của bạn chạy khá ổn, có một biến chưa khai báo nhưng mình đã sửa lại.
Cho mình hỏi thêm: tại sao khi chạy macro thì rất oke nhưng khi sử dụng Ribbon thì phát sinh lỗi.
 
Upvote 0
Upvote 0
Mình chạy thử rồi, nếu biến chưa khai báo thì chạy sao được nhỉ.

Cái này thì mình cũng không biết.
Sub tong_hop_cac_sheets()
Dim fd As Workbook, sd As Worksheet, sn As Worksheet, mn, lrd As Long, lrn As Long, i As Long, j As Long, k As Long, p As Long, ktts As Long, tensheet As Long
Dim chonFile, openfile ....

Mình thấy có biến mn chưa được khai báo

Chắc có Option Explicit nên code vẫn chạy oke đó
 
Upvote 0
Sub tong_hop_cac_sheets()
Dim fd As Workbook, sd As Worksheet, sn As Worksheet, mn, lrd As Long, lrn As Long, i As Long, j As Long, k As Long, p As Long, ktts As Long, tensheet As Long
Dim chonFile, openfile ....
Mình thấy có biến mn chưa được khai báo
Đấy là khai báo mảng nguồn rồi đó. Không hiểu bạn sửa như thế nào nhỉ.
 
Lần chỉnh sửa cuối:
Upvote 0
Đấy là khai báo mảng nguồn rồi đó. Không hiểu bạn sửa như thế nào nhỉ.
Cái đoạn này theo em hiểu là được khai báo biến rồi. Còn nó là gì thì chưa rõ. Khi biến được sử dụng phó mặc cho máy tính tự quyết định biến thì phải.
 
Upvote 0
Cái đoạn này theo em hiểu là được khai báo biến rồi. Còn nó là gì thì chưa rõ. Khi biến được sử dụng phó mặc cho máy tính tự quyết định biến thì phải.
"Mình thấy có biến mn chưa được khai báo
Chắc có Option Explicit nên code vẫn chạy "


Khả năng hai dòng này của bài #15 nhầm hết cả.
 
Lần chỉnh sửa cuối:
Upvote 0
"Mình thấy có biến mn chưa được khai báo
Chắc có Option Explicit nên code vẫn chạy "


Khả năng hai dòng này của bài #15 nhầm hết cả.
Chỉ có biến oke chưa khai báo thôi.
Nhưng vì nó là Tây hột vịt lộn cho nên Option Explicit chả nện nó được.
 
Upvote 0
Hiện code đã chạy đúng với ý của mình rồi. Cảm ơn tất cả các bạn đã hỗ trợ nhiệt tình cho mình.
 
Upvote 0
Web KT
Back
Top Bottom