Tổng hợp dữ liệu từ nhiều file ở nhiều thư mục khác nhau về 1file tổng (1 người xem)

Liên hệ QC

Người dùng đang xem chủ đề này

LuuGiaPhúc

Thành viên hoạt động
Tham gia
28/7/21
Bài viết
126
Được thích
51
Em nhờ các anh chị viết dùm e đoạn code để lấy dữ liệu từ nhiều file, mỗi file nằm ở 1 thư mục khác nhau (nhưng tất cà các thư mục này đều nằm trong 1 thư mục tổng
Hằng tháng, em tạo ra 1 thư mục tổng, ví dụ tháng này là T8.2021 và lưu nó lên trên ổ mạng chia sẻ cho các văn phòng trên toàn quốc cùng vào nhập dữ liệu.
Mỗi văn phòng sẽ tự tạo 1 thư mục con (ví dụ DBN1 , BHO1 ...) nằm trong thư mục tổng này. Trong thư mục tổng, em để sẵn 1 template PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx.
Các văn phòng sẽ dùng file template này để nhập yêu cầu cung cấp văn phòng phẩm như giấy in, mực in, hàng khuyến mãi... mà văn phòng của họ cần sử dụng trong tháng.
Sau đó, em dùng file tổng hợp để tổng hợp số lượng, mã hàng , loại hàng.... của tất cả lại và đặt hàng.

Vấn đề là có khoảng 50 văn phòng như thế, nên quá trình tổng hợp bằng tay rất mất thời gian. Nhờ các anh chị viết dùm 1 đoạn code để mình nhấn nút import, chỉ đường dẫn đến thư mục T8.2021 thì nó sẽ tự động mở từng thư mục con, tìm đến file PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx trong thư mục đó, copy sheet MUC - GIAY IN , paste value vào sheet MUC - GIAY IN của file tổng hợp. Lưu ý : nhìn tên thư mục để copy. Ví dụ : vào thư mục BHO1, copy thì phải paste vào phần VP BHO1 tương ứng.
Sheet PYC HKM cũng tương tự như vậy

1628389247103.png
1628388842791.png
1628389103079.png
 

File đính kèm

Lần chỉnh sửa cuối:
Tiếc là cái laptop có vấn đề. Khắc phục được thì mai tôi làm cho
 
Upvote 0
Tiếc là cái laptop có vấn đề. Khắc phục được thì mai tôi làm cho
Dạ, em cảm ơn. Nhờ a làm giúp, vì e mất rất nhiều thời gian cho công việc này. Mở từng thư mục, rồi mở file trong đó, copy nội dung, paste vào cột văn phòng tương ứng trong file tổng, lặp lại công việc như thế khoảng 50 lần (do cty e có khoảng 50vp trên toàn quốc, e nghĩ nếu có thể dùng code chạy thì sẽ nhanh hơn
 
Upvote 0
Mình có ý kiến như thế này để code đơn giản hơn.
Thay vì dùng code để dò tìm thư mục con để lấy ra các file cần tổng hợp, thì mình lập ra danh sách cách file cần tổng hợp ra 1 sheet trong file tổng hợp trước, rồi sau đó dùng code lấy dữ liệu từ file khác thôi.
Trường hợp bạn làm tay thì bạn lập ra danh sách thì bạn có thể dùng hyperlink để mở file nhanh hơn.
1. Phần lập ra danh sách file con cần tổng hợp thì bạn có thể tìm code lấy ra danh sách các file trong thư mục, nếu bạn biết dùng commandline thì dùng hàm Dir cho nhanh. khỏi phải code VBA
2. Bạn tham khảo các bài viết lấy dữ liệu từ file khác: Thường sẽ là mở file con (file trong danh sách trên) rồi dùng các vòng lặp và so sánh để lấy dữ liệu đưa vào file tổng hợp.
 
Upvote 0
Em nhờ các anh chị viết dùm e đoạn code để lấy dữ liệu từ nhiều file, mỗi file nằm ở 1 thư mục khác nhau (nhưng tất cà các thư mục này đều nằm trong 1 thư mục tổng
Hằng tháng, em tạo ra 1 thư mục tổng, ví dụ tháng này là T8.2021 và lưu nó lên trên ổ mạng chia sẻ cho các văn phòng trên toàn quốc cùng vào nhập dữ liệu.
Mỗi văn phòng sẽ tự tạo 1 thư mục con (ví dụ DBN1 , BHO1 ...) nằm trong thư mục tổng này. Trong thư mục tổng, em để sẵn 1 template PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx.
Các văn phòng sẽ dùng file template này để nhập yêu cầu cung cấp văn phòng phẩm như giấy in, mực in, hàng khuyến mãi... mà văn phòng của họ cần sử dụng trong tháng.
Sau đó, em dùng file tổng hợp để tổng hợp số lượng, mã hàng , loại hàng.... của tất cả lại và đặt hàng.

Vấn đề là có khoảng 50 văn phòng như thế, nên quá trình tổng hợp bằng tay rất mất thời gian. Nhờ các anh chị viết dùm 1 đoạn code để mình nhấn nút import, chỉ đường dẫn đến thư mục T8.2021 thì nó sẽ tự động mở từng thư mục con, tìm đến file PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx trong thư mục đó, copy sheet MUC - GIAY IN , paste value vào sheet MUC - GIAY IN của file tổng hợp. Lưu ý : nhìn tên thư mục để copy. Ví dụ : vào thư mục BHO1, copy thì phải paste vào phần VP BHO1 tương ứng.
Sheet PYC HKM cũng tương tự như vậy

View attachment 263766
View attachment 263764
View attachment 263765

Mình không biết làm bằng những cách cao siêu như : Power table, pivot query, ADO...
nhưng làm bằng VBA thì cũng thấy ra được kết quả, tuy nó chỉ làm theo cách tuần tự Dùng vòng lặp: mở folder mẹ\mở folder con\chon Wb phù hợp\ mở Wb\ quét các Sh\ lấy dữ liệu sh phù hợp đưa vào mảng.. lặp lại vói folder tiếp theo.... đến hết===> gán xuống sh phù hợp.
Mã:
Sub TONGHOPNHUCAU()
MyFolder = "C:\Users\Admin\Downloads\Thang 08-2021"
    Dim fs, f, f1, s, sf, fc, fol, i, k, sWb
    Dim wb As Workbook, Sh As Worksheet
    Dim KQ(), KQ1(), M
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
   

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(MyFolder)
    Set sf = f.SubFolders
            M = Array(1, 2, 5, 6, 7, 8, 11, 12, 13, 14)
    ReDim KQ(1 To 100, 1 To 12) ' UBound(M) + 2)
    ReDim KQ1(1 To 50, 1 To 100)
    'On Error Resume Next
    For Each f1 In sf
        i = i + 1
        s = f1.Name
            KQ(i, 1) = i
            KQ(i, 2) = s
            KQ1(1, i) = s
        MyFolder = "C:\Users\Admin\Downloads\Thang 08-2021\" & s
        Set f = fs.GetFolder(MyFolder)
        Set fc = f.Files
            For Each fol In fc
                sWb = fol.Name
                        If sWb = "PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx" Then
                            Set wb = Workbooks.Open(fol)
                                For Each Sh In wb.Worksheets
                                    If Sh.Name = "MUC - GIAY IN" Then
                                         For k = 0 To UBound(M)
                                                KQ(i, k + 3) = Sh.Cells(13, M(k))
                                         Next k
                                    End If
                                    If Sh.Name = "PYC HKM" Then
                                        For j = 3 To 31
                                                KQ1(j, i) = Sh.Cells(18 + j, 4)
                                        Next j
                                    End If
                               Next Sh
                                wb.Close False
                        End If
            Next fol
    Next
    Sheets("MUC - GIAY IN").[M13].Resize(i, 12) = KQ
    Sheets("PYC HKM").[AD4].Resize(34, i) = KQ1
    Set fs = Nothing: Set sf = Nothing: Set f = Nothing: Set fc = Nothing:
   
Msgbox  " Xong"
   
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
End Sub
Code này dựa trên code lấy tên folder và file của anh Batman
bạn vào Sh TH và nhấn nút để xem kết quả ở các sh

Bản thân kiến thức còn nông cạn, xin được mọi người ghé qua góp ý.
(dòng cả một ngày mói cho ra kết quả đúng là hoa mắt)
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Vụ này dùng ADO mới nhanh được.
 
Upvote 0
Code này mình sử dụng bao năm nay rất ổn khi cần tổng hợp các sheet chọn từ nhiều file trong folder. Lâu quá rồi không nhớ code của ai trên GPE chia sẻ nữa. Xin phép chia sẻ lại cho người cần dùng. Tại sheet của file cần tổng hợp (nên tạo sheet mới) rồi chạy Sub Main() nhớ thay đổi tham số cho SheetName và RangeAddress cho phù hợp với nhu cầu cần tổng hợp của bạn. Sau khi có sheet được tổng hợp bạn tự xử lý lại dữ liệu cho phù hợp.
Mã:
Function GetData(ByVal FileName As String, ByVal SheetName As String, ByVal RangeAddress As String, _
            ByVal HasTitle As Boolean, ByVal UseTitle As Boolean)
            
  Dim rsCon As Object, rsData As Object, cat As Object, tbl As Object
  Dim tmpArr, Arr()
  Dim szConnect As String, szSQL As String, tmp As String
  Dim lCount As Long, lR As Long, lC As Long, lVer As Long
  lVer = Val(Application.Version)
  Set rsCon = CreateObject("ADODB.Connection")
  Set rsData = CreateObject("ADODB.Recordset")
  Set cat = CreateObject("ADOX.Catalog")
 
  If lVer < 12 Then
    szConnect = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 8.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  Else
    szConnect = "Provider=Microsoft.ACE.OLEDB.12.0;Data Source=" & FileName & ";" & _
                "Extended Properties=""Excel 12.0;HDR=" & IIf(HasTitle, "Yes", "No") & """;"
  End If
  If SheetName = "" Then
    Dim Dbs  As Object, db As Object
    Set Dbs = CreateObject("DAO.DBEngine." & IIf(lVer < 12, "36", "120"))
    Set db = Dbs.OpenDatabase(FileName, False, False, "Excel 8.0;")
    tmp = db.TableDefs(0).Name
    tmp = Replace(tmp, " ", "?")
    tmp = Replace(tmp, "'", " ")
    tmp = WorksheetFunction.Trim(tmp)
    tmp = Replace(tmp, " ", "'")
    tmp = Replace(tmp, "?", " ")
    SheetName = tmp
    db.Close
    Set Dbs = Nothing: Set db = Nothing
  End If
  If Right(SheetName, 1) <> "$" Then SheetName = SheetName & "$"
  rsCon.Open szConnect
  cat.ActiveConnection = rsCon
 
  szSQL = "SELECT * FROM [" & SheetName & RangeAddress & "];"
  rsData.Open szSQL, rsCon, 0, 1, 1
  tmpArr = rsData.GetRows
  ReDim Arr(UBound(tmpArr, 2) - UseTitle, UBound(tmpArr, 1) + 1)
  If UseTitle Then
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(0, lC) = rsData.Fields(lC).Name
    Next
  End If
  For lR = LBound(tmpArr, 2) To UBound(tmpArr, 2)
    For lC = LBound(tmpArr, 1) To UBound(tmpArr, 1)
      Arr(lR - UseTitle, lC) = tmpArr(lC, lR)
      Arr(lR - UseTitle, UBound(tmpArr, 1)) = FileName      'tao 1 cot o vi tri cot cuoi cung danh dau ten file cho tung hang du lieu
    Next
  Next
  rsData.Close: Set rsData = Nothing
  rsCon.Close: Set rsCon = Nothing
  GetData = Arr
End Function

Sub Main()
  Dim vFile, FileItem, aRes, Target As Range
  Dim FileName As String, SheetName As String, RangeAddress As String
  On Error Resume Next
  vFile = Application.GetOpenFilename("Excel File, *.xls; *.xlsx; *.xlsm", , , , True)
  If TypeName(vFile) = "Variant()" Then
    SheetName = "Sheet0"                'Thay ten sheet muon tong hop
    RangeAddress = "B2:V10000"          'Chon vi tri vung du lieu se lay (luu y nen chon cot bat dau co chua day du hang du lieu hoac hang can tong hop)
    For Each FileItem In vFile
      FileName = CStr(FileItem)
      If UCase(FileName) <> UCase(ThisWorkbook.FullName) Then
        aRes = GetData(FileName, SheetName, RangeAddress, False, False)
        If IsArray(aRes) Then
          Set Target = ActiveSheet.Range("B60000").End(xlUp).Offset(1)
          Target.Resize(UBound(aRes, 1) + 1, UBound(aRes, 2) + 1).Value = aRes
        End If
      End If
    Next
    MsgBox "Done!"
  End If
End Sub
 
Upvote 0
Em nhờ các anh chị viết dùm e đoạn code để lấy dữ liệu từ nhiều file, mỗi file nằm ở 1 thư mục khác nhau (nhưng tất cà các thư mục này đều nằm trong 1 thư mục tổng
Hằng tháng, em tạo ra 1 thư mục tổng, ví dụ tháng này là T8.2021 và lưu nó lên trên ổ mạng chia sẻ cho các văn phòng trên toàn quốc cùng vào nhập dữ liệu.
Mỗi văn phòng sẽ tự tạo 1 thư mục con (ví dụ DBN1 , BHO1 ...) nằm trong thư mục tổng này. Trong thư mục tổng, em để sẵn 1 template PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx.
Các văn phòng sẽ dùng file template này để nhập yêu cầu cung cấp văn phòng phẩm như giấy in, mực in, hàng khuyến mãi... mà văn phòng của họ cần sử dụng trong tháng.
Sau đó, em dùng file tổng hợp để tổng hợp số lượng, mã hàng , loại hàng.... của tất cả lại và đặt hàng.

Vấn đề là có khoảng 50 văn phòng như thế, nên quá trình tổng hợp bằng tay rất mất thời gian. Nhờ các anh chị viết dùm 1 đoạn code để mình nhấn nút import, chỉ đường dẫn đến thư mục T8.2021 thì nó sẽ tự động mở từng thư mục con, tìm đến file PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx trong thư mục đó, copy sheet MUC - GIAY IN , paste value vào sheet MUC - GIAY IN của file tổng hợp. Lưu ý : nhìn tên thư mục để copy. Ví dụ : vào thư mục BHO1, copy thì phải paste vào phần VP BHO1 tương ứng.
Sheet PYC HKM cũng tương tự như vậy
Bạn thay đường dẫn tại C1 và tên file tại C2 rồi bấm Cập nhật tổng hợp.
Code sẽ xóa hết các mã văn phòng đi và tự lấy thông tin từ thư mục tìm được để điền vào.
(Nếu vẫn muốn "chỉ đường dẫn đến thư mục T8.2021" thì báo lại để tôi sửa code
 

File đính kèm

Upvote 0
Bạn thay đường dẫn tại C1 và tên file tại C2 rồi bấm Cập nhật tổng hợp.
Code sẽ xóa hết các mã văn phòng đi và tự lấy thông tin từ thư mục tìm được để điền vào.
(Nếu vẫn muốn "chỉ đường dẫn đến thư mục T8.2021" thì báo lại để tôi sửa code
Em cảm ơn anh, do 2 hôm nay em đang bị sốt cao, nằm bẹp dúm ở nhà nên chưa thử dc, chắc ít hôm nữa khỏe khỏe em sẽ thử ạ.
Còn vụ thư mục T8.2021 thì nó không cố định đâu, ví dụ qua tháng sau thì em lại tạo T9.2021 rồi,
 
Upvote 0
Bạn thay đường dẫn tại C1 và tên file tại C2 rồi bấm Cập nhật tổng hợp.

Em cảm ơn anh, do 2 hôm nay em đang bị sốt cao, nằm bẹp dúm ở nhà nên chưa thử dc, chắc ít hôm nữa khỏe khỏe em sẽ thử ạ.
Còn vụ thư mục T8.2021 thì nó không cố định đâu, ví dụ qua tháng sau thì em lại tạo T9.2021 rồi,
Ý tôi muốn nói là bạn phải tự thay đường dẫn ở ô C1 chứ không có 1 hộp thoại hiện ra để chọn thư mục 8-2021 hoặc 9-2021 ấy mà.
P/S: Sốt gì thế bạn. Test nhanh thử coi.
 
Lần chỉnh sửa cuối:
Upvote 0
Cảm ơn bạn, sốt bình thường thôi, chắc do làm việc quá sức nên suy kiệt, thức đêm liên tục 2 tháng nên sụp cầu dao do quá tải ý mà, hazz, 38.8 độ, người giờ như đi trên mây ấy, không còn sức, không suy nghĩ dc gì luôn
Ý tôi muốn nói là bạn phải tự thay đường dẫn ở ô C1 chứ không có 1 hộp thoại hiện ra để chọn thư mục 8-2021 hoặc 9-2021 ấy mà.
P/S: Sốt gì thế bạn. Test nhanh thử coi
 
Upvote 0
Cảm ơn bạn, sốt bình thường thôi, chắc do làm việc quá sức nên suy kiệt, thức đêm liên tục 2 tháng nên sụp cầu dao do quá tải ý mà, hazz, 38.8 độ, người giờ như đi trên mây ấy, không còn sức, không suy nghĩ dc gì luôn
Nghỉ ngơi đi bạn! Chúc bạn mau bình phục!
 
Upvote 0
Bạn thay đường dẫn tại C1 và tên file tại C2 rồi bấm Cập nhật tổng hợp.
Code sẽ xóa hết các mã văn phòng đi và tự lấy thông tin từ thư mục tìm được để điền vào.
(Nếu vẫn muốn "chỉ đường dẫn đến thư mục T8.2021" thì báo lại để tôi sửa code
Chào bạn, Mình mới test thử code của bạn.
nó chạy đúng như ý mình mong muốn luôn, chạy cực nhanh, chỉ có phát sinh 1 vài vấn đề nhỏ như sau :
1. Nó chỉ nhận ra 4 thư mục (mình có đến 8 thư mục trong ví dụ này, thực tế chạy là khoảng 50 ).
2. Nếu có thể được thì "chỉ đường dẫn đến thư mục đích" đi, nó thuận tiện hơn. Tên file thì luôn cố định rồi PYC HKM - MUC - GIAY IN - CCKD.xlsx, nên mình gán luôn cũng được, giảm bớt thao tác .

1628687141858.png

Ngoài ra, cái này là mới phát sinh, thêm 1 sheet CCKD, cũng cách làm y chang 2 sheet trước thôi, cũng nhìn tên thư mục, lấy số lượng đưa vào tương ứng, cảm phiền bạn bỏ chút ít thời gian giúp mình nhé.
1628687723573.png
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Mình không biết làm bằng những cách cao siêu như : Power table, pivot query, ADO...
nhưng làm bằng VBA thì cũng thấy ra được kết quả, tuy nó chỉ làm theo cách tuần tự Dùng vòng lặp: mở folder mẹ\mở folder con\chon Wb phù hợp\ mở Wb\ quét các Sh\ lấy dữ liệu sh phù hợp đưa vào mảng.. lặp lại vói folder tiếp theo.... đến hết===> gán xuống sh phù hợp.
Mã:
Sub TONGHOPNHUCAU()
MyFolder = "C:\Users\Admin\Downloads\Thang 08-2021"
    Dim fs, f, f1, s, sf, fc, fol, i, k, sWb
    Dim wb As Workbook, Sh As Worksheet
    Dim KQ(), KQ1(), M
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
  

    Set fs = CreateObject("Scripting.FileSystemObject")
    Set f = fs.GetFolder(MyFolder)
    Set sf = f.SubFolders
            M = Array(1, 2, 5, 6, 7, 8, 11, 12, 13, 14)
    ReDim KQ(1 To 100, 1 To 12) ' UBound(M) + 2)
    ReDim KQ1(1 To 50, 1 To 100)
    'On Error Resume Next
    For Each f1 In sf
        i = i + 1
        s = f1.Name
            KQ(i, 1) = i
            KQ(i, 2) = s
            KQ1(1, i) = s
        MyFolder = "C:\Users\Admin\Downloads\Thang 08-2021\" & s
        Set f = fs.GetFolder(MyFolder)
        Set fc = f.Files
            For Each fol In fc
                sWb = fol.Name
                        If sWb = "PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx" Then
                            Set wb = Workbooks.Open(fol)
                                For Each Sh In wb.Worksheets
                                    If Sh.Name = "MUC - GIAY IN" Then
                                         For k = 0 To UBound(M)
                                                KQ(i, k + 3) = Sh.Cells(13, M(k))
                                         Next k
                                    End If
                                    If Sh.Name = "PYC HKM" Then
                                        For j = 3 To 31
                                                KQ1(j, i) = Sh.Cells(18 + j, 4)
                                        Next j
                                    End If
                               Next Sh
                                wb.Close False
                        End If
            Next fol
    Next
    Sheets("MUC - GIAY IN").[M13].Resize(i, 12) = KQ
    Sheets("PYC HKM").[AD4].Resize(34, i) = KQ1
    Set fs = Nothing: Set sf = Nothing: Set f = Nothing: Set fc = Nothing:
  
Msgbox  " Xong"
  
    Application.ScreenUpdating = False
    Application.DisplayAlerts = False
End Sub
Code này dựa trên code lấy tên folder và file của anh Batman
bạn vào Sh TH và nhấn nút để xem kết quả ở các sh

Bản thân kiến thức còn nông cạn, xin được mọi người ghé qua góp ý.
(dòng cả một ngày mói cho ra kết quả đúng là hoa mắt)
Kết quả chạy ra chưa đúng anh ơi.
ví dụ thư mục BGG1, sheet MUC - GIAY IN,
1628690358168.png

mà file tổng hợp chạy ra trống trơn
1628690450066.png
 

File đính kèm

Upvote 0
Chào bạn, Mình mới test thử code của bạn.
nó chạy đúng như ý mình mong muốn luôn, chạy cực nhanh, chỉ có phát sinh 1 vài vấn đề nhỏ như sau :
1. Nó chỉ nhận ra 4 thư mục (mình có đến 8 thư mục trong ví dụ này, thực tế chạy là khoảng 50 ).
2. Nếu có thể được thì "chỉ đường dẫn đến thư mục đích" đi, nó thuận tiện hơn. Tên file thì luôn cố định rồi PYC HKM - MUC - GIAY IN - CCKD.xlsx, nên mình gán luôn cũng được, giảm bớt thao tác .


Ngoài ra, cái này là mới phát sinh, thêm 1 sheet CCKD, cũng cách làm y chang 2 sheet trước thôi, cũng nhìn tên thư mục, lấy số lượng đưa vào tương ứng, cảm phiền bạn bỏ chút ít thời gian giúp mình nhé.
Trả lời cho 1: "Nó chỉ nhận ra 4 thư mục (mình có đến 8 thư mục trong ví dụ này, thực tế chạy là khoảng 50 )."
File tôi gửi cho bạn ở máy tôi vẫn chạy đủ 8 folder. Không biết thực tế máy bạn có sai gì không, chứ tôi tin chắc code chạy đúng.

Trả lời cho 2: Chừ tôi gửi lại cho bạn file có sửa chỗ hiện hộp thoại để chọn folder và cố định luôn tên file nguồn

Vấn đề mới phát sinh sẽ làm sau.
 

File đính kèm

Upvote 0
Kết quả chạy ra chưa đúng anh ơi.
ví dụ thư mục BGG1, sheet MUC - GIAY IN,
View attachment 263933

mà file tổng hợp chạy ra trống trơn
View attachment 263934
Tên file bạn đặt ỏ các folder không thống nhất , ở folder BGG1 và BHD1, BTM1 là PYC..........CDKD ,các Folder khác là PHIEU YEU CAU .MUC - GIAY IN... (code chỉ tim các Wb có tên là PHIEU YEU CAU....thì mở wb và tìm sh có tên là "MUC - GIAY IN" và lấy số liệu). các folder BGG1,BHD1, BMT1 không trùng các điều kiện tìm thì code sẽ không mỏ các folder BGG1,BMT1, BHD1...là lẽ đương nhiên.

Bạn sửa lại code nhé.
thay đoạn If sWb = "PHIEU YEU CAU HKM - MUC - GIAY IN.xlsx" Then
bằng đoạn If sWb Like ("*MUC - GIAY IN*") Then '===> thay bằng các ký tự đặc biệt
và chạy thử.
Mà tại sao bạn không dùng code của anh Maika8008? Mình không có thòi gian để chạy thử code của anh ấy nên cũng không biết nó nhanh chậm thế nào.

chúc vui khỏe, thành công!
 
Upvote 0
Trả lời cho 1: "Nó chỉ nhận ra 4 thư mục (mình có đến 8 thư mục trong ví dụ này, thực tế chạy là khoảng 50 )."
File tôi gửi cho bạn ở máy tôi vẫn chạy đủ 8 folder. Không biết thực tế máy bạn có sai gì không, chứ tôi tin chắc code chạy đúng.

Trả lời cho 2: Chừ tôi gửi lại cho bạn file có sửa chỗ hiện hộp thoại để chọn folder và cố định luôn tên file nguồn

Vấn đề mới phát sinh sẽ làm sau.
tuyệt vời. Code của bạn chạy quá chuẩn. Cực kỳ nhanh. Còn vấn đề 1 là do mình sai, đúng như bạn HUONGHCKT nói, là do mình nhầm lẫn lúc tạo tên file không thống nhất trong các thư mục, mình đã sửa lại.
2 sheet đầu hoàn toàn đúng như ý. nó đã giúp mình rút ngắn được 1 lượng thao tác tay nhiều khủng khiếp với thời gian nhanh không tưởng luôn.
Còn vấn đề sheet CCKD mà mình nói thực ra cách làm, yêu cầu cũng y chang vậy thôi, nếu có thể bổ sung được thêm sheet đó vào là xem như 100% hoàn thành, từ nay việc tổng hợp này không còn là nỗi ám ảnh mình mỗi tháng nữa, trung bình mỗi tháng mình mất đúng 1 ngày chỉ để làm việc tổng hợp này, chưa kể hoa cả mắt, lại còn thỉnh thoảng bị lệch hàng, lệch cột.... quá oải. giờ có code này, chỉ cần mọi người không đổi tên file là xem như 2 phút là xong cái tổng hợp
Cảm ơn bạn rất nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
tuyệt vời. Code của bạn chạy quá chuẩn. Cực kỳ nhanh. Còn vấn đề 1 là do mình sai, đúng như bạn HUONGHCKT nói, là do mình nhầm lẫn lúc tạo tên file không thống nhất trong các thư mục, mình đã sửa lại.
2 sheet đầu hoàn toàn đúng như ý. nó đã giúp mình rút ngắn được 1 lượng thao tác tay nhiều khủng khiếp với thời gian nhanh không tưởng luôn.
Còn vấn đề sheet CCKD mà mình nói thực ra cách làm, yêu cầu cũng y chang vậy thôi, nếu có thể bổ sung được thêm sheet đó vào là xem như 100% hoàn thành, từ nay việc tổng hợp này không còn là nỗi ám ảnh mình mỗi tháng nữa, trung bình mỗi tháng mình mất đúng 1 ngày chỉ để làm việc tổng hợp này, chưa kể hoa cả mắt, lại còn thỉnh thoảng bị lệch hàng, lệch cột.... quá oải. giờ có code này, chỉ cần mọi người không đổi tên file là xem như 2 phút là xong cái tổng hợp
Cảm ơn bạn rất nhiều
Bổ sung cho sheet CCKD.
Chú ý: Trong file nguồn tại BMT1 bạn quên đổi tên sheet thành CCKD nên code báo lỗi. Do đó khi chạy dữ liệu thực nếu có báo lỗi không tìm được vùng địa chỉ nguồn CCKDxxxxx thì là lỗi này. Lúc đó, bấm Debug và dựa theo biến VPName lúc code đang dừng để tìm đúng thư mục sửa lại.
 

File đính kèm

Upvote 0
Bổ sung cho sheet CCKD.
Chú ý: Trong file nguồn tại BMT1 bạn quên đổi tên sheet thành CCKD nên code báo lỗi. Do đó khi chạy dữ liệu thực nếu có báo lỗi không tìm được vùng địa chỉ nguồn CCKDxxxxx thì là lỗi này. Lúc đó, bấm Debug và dựa theo biến VPName lúc code đang dừng để tìm đúng thư mục sửa lại.
Đa tạ bạn rất nhiều. Quá hoàn hảo luôn.
 
Upvote 0
Chúc bạn ngày mới vui vẻ và giữ gìn sức khỏe vượt qua đại dịch
Cảm ơn bạn Maika8008 .
Tiếp tục với cái template mà bạn đã viết dùm đoạn code lần trước, lần này nhờ bạn xem giúp có cách nào làm nhanh hơn không ?
Nhìn vào sheet PYC HKM, hàng 4, nếu có bao nhiêu văn phòng thì qua sheet PXK HKM (phiếu xuất kho hàng khuyến mãi), tạo ra tương ứng bấy nhiêu trang

1629600940811.png

1629601170530.png

 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Sửa code có sẵn hay viết code mới? Tôi thấy bạn nói 'có cách nào làm nhanh hơn' thì có vẻ là có code rồi nhưng chạy chậm?
 
Upvote 0
Sửa code có sẵn hay viết code mới? Tôi thấy bạn nói 'có cách nào làm nhanh hơn' thì có vẻ là có code rồi nhưng chạy chậm?
Dạ không phải, em thì không biết về code, chỉ biết hàm thôi, nên em phải tạo sẵn luôn 50 trang, rồi dùng hàm cho nó nhìn qua sheet PYC HKM, ví dụ : trang 1 : hàm sẽ là : =IF(OR('PYC HKM'!H$4=0,'PYC HKM'!H$4=""),"",'PYC HKM'!H$4) kiểu như vậy nè, trang 2 sẽ là : =IF(OR('PYC HKM'!I$4=0,'PYC HKM'!I$4=""),"",'PYC HKM'!I$4)

Rồi em dùng CF ẩn đi nếu văn phòng nào = 0, nhưng thật tế như vậy nó quá thủ công, chưa kể sheet PXK HKM (phiếu xuất kho hàng khuyến mãi) em còn phải chuyển qua pdf ==> nó tạo ra mấy chục trang trắng.

Theo quy định, sau khi các văn phòng tự tạo thư mục tên văn phòng (nằm trong thư mục tháng 08.2021) và điền thông tin đặt hàng theo template mẫu của em, thì em dùng file tổng hợp để chạy code tổng hợp số lượng đặt hàng, xong e phải qua sheet PXK HKM để xuất file pdf (của những văn phòng nào có đặt hàng) ==> gởi mail cho họ file pdf này, họ ký tên xác nhận rồi chuyển bản hard copy có chữ ký về HO cho em lưu lại. ==> ý em muốn là sheet PXK HKM sẽ nhìn qua sheet PYC HKM, xem có bao nhiêu văn phòng đặt hàng trong tháng này thì sẽ in sẵn mẫu PXK HKM của văn phòng đó, điền tên văn phòng và số lượng đặt hàng vào cột D tương ứng.
Nên ở sheet PXK HKM, em muốn chỉ tạo sẵn 1 trang mẫu thôi, rồi viết 1 nút EXPORT PDF : khi click vào, nó sẽ nhìn qua sheet PYC HKM, xem có bao nhiêu văn phòng thì nó sẽ tạo ra bấy nhiêu trang mẫu tương ứng, điền tên văn phòng và số lượng đặt hàng vào cột D, rồi xuất ra thành 1 file PDF với số lượng trang = số lượng văn phòng có đặt hàng (ở sheet PYC HKM). ==> em sẽ gởi mail cho các văn phòng của toàn quốc ==> ai có đặt hàng thì tự vào, in trang của VP của họ rồi ký tên và chuyển bản giấy có chữ ký về cho em. thế là xong.
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn có nghĩ nên xuất riêng mỗi VP chỉ 1 trang của VP đó rồi dùng kiểu gửi mail hàng loạt cho từng VP theo 1 danh sách điền sẵn thông tin người nhận chưa? Ứng dụng gửi mail hàng loạt bằng VBA trên GPE có sẵn bằng cả 2 cách: Outlook và Gmail
 
Upvote 0
Bạn có nghĩ nên xuất riêng mỗi VP chỉ 1 trang của VP đó rồi dùng kiểu gửi mail hàng loạt cho từng VP theo 1 danh sách điền sẵn thông tin người nhận chưa? Ứng dụng gửi mail hàng loạt bằng VBA trên GPE có sẵn bằng cả 2 cách: Outlook và Gmail
Dạ không được anh. vấn đề chính là theo quy định, em sẽ phải gởi 1 FILE PDF (trong file này có nhiều trang, mỗi trang tương đương với 1 văn phòng có đặt hàng). 1 file này sẽ được gởi vào mail group OA toàn quốc (Group OA là group mail của những người quản lý của các văn phòng).
Trước giờ em vẫn làm theo cách em nói ở trên : tức là em tạo ra sẵn 50 trang (tương đương với 50 văn phòng toàn quốc), rồi dùng công thức cho nó nhìn qua sheet PYC HKM, hàng thứ 4 xem có văn phòng nào có đặt hàng thì đưa thông tin qua , ví dụ tháng này có 10 văn phòng có đặt hàng thì 10 trang đầu tiên sẽ có nội dung, 40 trang còn lại thì dùng CF ẩn nội dung đi rồi dùng code xuất ra file PDF ==> nó sẽ ra 50 trang với 10 trang đầu có nội dung, 40 trang sau là trang trắng, rồi em lại dùng Acrobat Pro để cắt bỏ 40 trang trắng kia đi, giữ lại 10 trang đầu có nội dung ==> lưu file lại và gởi cho group mail.
Nhưng giờ thấy anh viết được đoạn code tổng hợp nhiều thư mục như thế, em lại nghĩ chắc chắn có cách viết code cho nó nhìn xem sheet PYC HKM có bao nhiêu văn phòng đặt hàng thì chỉ lấy thông tin đưa qua sheet PXK HKM ==> như vậy sẽ không cần tốn thêm thao tác cắt bớt trang trống nữa.
 
Lần chỉnh sửa cuối:
Upvote 0
Dạ không được anh. vấn đề chính là theo quy định, em sẽ phải gởi 1 FILE PDF (trong file này có nhiều trang, mỗi trang tương đương với 1 văn phòng có đặt hàng). 1 file này sẽ được gởi vào mail group OA toàn quốc (Group OA là group mail của những người quản lý của các văn phòng).
Trước giờ em vẫn làm theo cách em nói ở trên : tức là em tạo ra sẵn 50 trang (tương đương với 50 văn phòng toàn quốc), rồi dùng công thức cho nó nhìn qua sheet PYC HKM, hàng thứ 4 xem có văn phòng nào có đặt hàng thì đưa thông tin qua , ví dụ tháng này có 10 văn phòng có đặt hàng thì 10 trang đầu tiên sẽ có nội dung, 40 trang còn lại thì dùng CF ẩn nội dung đi rồi dùng code xuất ra file PDF ==> nó sẽ ra 50 trang với 10 trang đầu có nội dung, 40 trang sau là trang trắng, rồi em lại dùng Acrobat Pro để cắt bỏ 40 trang trắng kia đi, giữ lại 10 trang đầu có nội dung ==> lưu file lại và gởi cho group mail.
Nhưng giờ thấy anh viết được đoạn code tổng hợp nhiều thư mục như thế, em lại nghĩ chắc chắn có cách viết code cho nó nhìn xem sheet PYC HKM có bao nhiêu văn phòng đặt hàng thì chỉ lấy thông tin đưa qua sheet PXK HKM ==> như vậy sẽ không cần tốn thêm thao tác cắt bớt trang trống nữa.
Bạn thử code nhé. Do trên file của bạn, khi Xóa định dạng (Clear Format) code chạy khá chậm (bị Not Responding) nên tôi chép dữ liệu sang 1 file mới để chạy thử, thấy nhanh hơn hẳn.

Tôi gửi cho bạn cả 2 file để bạn chạy thử.
 

File đính kèm

Upvote 0
Bạn thử code nhé. Do trên file của bạn, khi Xóa định dạng (Clear Format) code chạy khá chậm (bị Not Responding) nên tôi chép dữ liệu sang 1 file mới để chạy thử, thấy nhanh hơn hẳn.

Tôi gửi cho bạn cả 2 file để bạn chạy thử.
Quá xuất sắc !. Vậy là bạn dùng cách tạo thêm 1 sheet phụ (sheet mau) để chứa trang mẫu, rồi sau đó, khi click vào nút chuyển PDF thì nó đếm số văn phòng có đặt hàng, rồi tạo ra đúng số trang mẫu tương ứng với các văn phòng đó. Đúng ý của mình rồi.
Tuy nhiên hình như bạn còn thiếu , chỗ cột D, bạn chưa đưa tên văn phòng vào (bạn mới đưa số lượng vào thôi, còn tên văn phòng bạn chưa đưa vào, bạn giúp mình chỉnh thêm 1 chút xíu chỗ tên văn phòng nữa là được nhé.
Cảm ơn bạn rất nhiều
 
Upvote 0
Quá xuất sắc !. Vậy là bạn dùng cách tạo thêm 1 sheet phụ (sheet mau) để chứa trang mẫu, rồi sau đó, khi click vào nút chuyển PDF thì nó đếm số văn phòng có đặt hàng, rồi tạo ra đúng số trang mẫu tương ứng với các văn phòng đó. Đúng ý của mình rồi.
Tuy nhiên hình như bạn còn thiếu , chỗ cột D, bạn chưa đưa tên văn phòng vào (bạn mới đưa số lượng vào thôi, còn tên văn phòng bạn chưa đưa vào, bạn giúp mình chỉnh thêm 1 chút xíu chỗ tên văn phòng nữa là được nhé.
Cảm ơn bạn rất nhiều
Haha, quên!
Bạn dùng file này thay cho file cùng tên bài #29 và chép code này sang file kia của bạn.
 

File đính kèm

Upvote 0
Haha, quên!
Bạn dùng file này thay cho file cùng tên bài #29 và chép code này sang file kia của bạn.
Đỉnh của chóp luôn, cảm ơn bạn nhiều lắm lắm luôn nha, code của bạn hay thật, nó giúp cho công việc trở nên nhẹ nhàng và nhanh hơn rất nhiều.
 
Upvote 0
Bổ sung cho sheet CCKD.
Chú ý: Trong file nguồn tại BMT1 bạn quên đổi tên sheet thành CCKD nên code báo lỗi. Do đó khi chạy dữ liệu thực nếu có báo lỗi không tìm được vùng địa chỉ nguồn CCKDxxxxx thì là lỗi này. Lúc đó, bấm Debug và dựa theo biến VPName lúc code đang dừng để tìm đúng thư mục sửa lại.
Chào anh Maika8008!
Em cũng gặp trường hợp cần tổng hợp dữ liệu từ nhiều file về 1 file giống trường hợp trên, nhưng của e khác là các file e để trong 1 thư mục và tên của các file sẽ khác nhau ở stt file ví dụ như chi phi 1, chi phi 2, chi phi 3, ....Anh viết code giúp e tổng hợp dữ liệu từ các file khác tên được ko ạ.
Em cảm ơn anh nhiều!
 
Upvote 0
Chào anh Maika8008!
Em cũng gặp trường hợp cần tổng hợp dữ liệu từ nhiều file về 1 file giống trường hợp trên, nhưng của e khác là các file e để trong 1 thư mục và tên của các file sẽ khác nhau ở stt file ví dụ như chi phi 1, chi phi 2, chi phi 3, ....Anh viết code giúp e tổng hợp dữ liệu từ các file khác tên được ko ạ.
Em cảm ơn anh nhiều!
1. Hà tiện xưng hô, hà tiện viết tiếng Việt là sugar you, you go you go nhé.
2. Nếu đã hết hà tiện thì tôi không thể nhìn mấy con chữ mà làm được. File đâu, dữ liệu đâu, bạn hỡi?
 
Upvote 0
1. Hà tiện xưng hô, hà tiện viết tiếng Việt là sugar you, you go you go nhé.
2. Nếu đã hết hà tiện thì tôi không thể nhìn mấy con chữ mà làm được. File đâu, dữ liệu đâu, bạn hỡi?
em gửi file dữ liệu, mục đích là tìm kiếm dữ liệu ở các file trong thư mục "Thang 6-2022" bỏ vào file dữ liệu "DS TONG",kết quả thể hiện ở cột L-TEN, với điều kiện tìm kiếm ở các file là MNV, nếu ko có MNV thì tìm kiếm theo CMND,ko thoả 2 điều kiện thì bỏ trống, nếu được chỉ cho em NV đó thuộc file nào trong thư mục.
(để kết qủa như vậy để e còn dò lại tên của file DS TONG và file chi tiết có khớp nhau ko? do file thì viết tiếng việt, file thì viết ko dấu)
Do file thực không thể cung cấp nên e làm file mẫu mỗi file chỉ có vài dòng, chứ file thực mổi file đến 500.000 dòng, mà có tận 50 file thì em vlookup thủ công từng file ko biết khi nào mới xong. Nhờ anh viết code giúp em.
Cám ơn anh rất rất nhiều....
 

File đính kèm

Upvote 0

Bài viết mới nhất

Back
Top Bottom