Sửa code tổng hợp các sheet vào 1 sheet

Liên hệ QC

Thanh1102

Thành viên hoạt động
Tham gia
29/11/08
Bài viết
147
Được thích
46
Chào các bác.
Em có file đính kèm copy dữ liệu từ các sheet (theo ngày) vào 1 sheet "Total" nhưng chỉ copy 1 cột.
Các bác vui lòng xem giúp em.
Trong file có thêm 1 sheet"Sum" không muốn copy vào Sheet "Total" thì làm thế nào.
Em không rành về VBA mong các bác chỉ giúp.
 

File đính kèm

Chào các bác.
Em có file đính kèm copy dữ liệu từ các sheet (theo ngày) vào 1 sheet "Total" nhưng chỉ copy 1 cột.
Các bác vui lòng xem giúp em.
Trong file có thêm 1 sheet"Sum" không muốn copy vào Sheet "Total" thì làm thế nào.
Em không rành về VBA mong các bác chỉ giúp.
Góp y:
bạn diễn đạt chưa rõ nên anh chị diễn đàn muốn giúp cũng không biết giúp thế nào?
coppy 1 cột là cột nào bạn cho ví dụ kết quả và gửi đính kèm file lại chắc sẽ có người hỗ trợ bạn.
 
Upvote 0
Chào các bác.
Em có file đính kèm copy dữ liệu từ các sheet (theo ngày) vào 1 sheet "Total" nhưng chỉ copy 1 cột.
Các bác vui lòng xem giúp em.
Trong file có thêm 1 sheet"Sum" không muốn copy vào Sheet "Total" thì làm thế nào.
Em không rành về VBA mong các bác chỉ giúp.
Thử Cái này.Câu lệnh xác định cột của bạn bị lỗi.
Mã:
Public Sub GPE()
Dim sArr(), dArr(1 To 65000, 1 To 1000), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "Total" Then
       sArr = Ws.Range(Ws.[A5], Ws.[A65000].End(xlUp)).Resize(, Ws.[S5].End(2).Column)
       If Ws.[A5].End(2).Column > Col Then Col = Ws.[S5].End(2).Column
          For I = 1 To UBound(sArr, 1)
              K = K + 1
                 For J = 1 To UBound(sArr, 2)
                     dArr(K, J) = sArr(I, J)
                 Next J
           Next I
      End If
Next
With Sheets("Total")
     .[A5:M65000].ClearContents
If K Then .[A5].Resize(K, Col).Value = dArr
End With
End Sub
 
Upvote 0
Góp y:
bạn diễn đạt chưa rõ nên anh chị diễn đàn muốn giúp cũng không biết giúp thế nào?
coppy 1 cột là cột nào bạn cho ví dụ kết quả và gửi đính kèm file lại chắc sẽ có người hỗ trợ bạn.
Xin lỗi bạn mình nói chưa rõ. Mình muốn copy tất cả dữ liệu từ các sheet (theongày- 31 ngày (mỗi ngày 1 sheet) vào Sheet "Total" (trừ Sheet "Sum"). Trong file đã có code nhưng nó chỉ copy có 1 cột A. Mình cần sửa lại code cho đúng.
- Copy tất cả dữ liệu từ Sheet 01-->31 (tạm VD 05 sheet ) vào Sheet "Total" không copy Sheet "Sum"
Cảm ơn bạn
Bài đã được tự động gộp:

Thử Cái này.Câu lệnh xác định cột của bạn bị lỗi.
Mã:
Public Sub GPE()
Dim sArr(), dArr(1 To 65000, 1 To 1000), I As Long, J As Long, K As Long, Col As Long, Ws As Worksheet
For Each Ws In ThisWorkbook.Worksheets
    If Ws.Name <> "Total" Then
       sArr = Ws.Range(Ws.[A5], Ws.[A65000].End(xlUp)).Resize(, Ws.[S5].End(2).Column)
       If Ws.[A5].End(2).Column > Col Then Col = Ws.[S5].End(2).Column
          For I = 1 To UBound(sArr, 1)
              K = K + 1
                 For J = 1 To UBound(sArr, 2)
                     dArr(K, J) = sArr(I, J)
                 Next J
           Next I
      End If
Next
With Sheets("Total")
     .[A5:M65000].ClearContents
If K Then .[A5].Resize(K, Col).Value = dArr
End With
End Sub
Cảm ơn bạn. Mình chạy được rồi. Tuy nhiên có 1 sheet "Sum" mình không muốn copy vào Sheet"Total".
 
Lần chỉnh sửa cuối:
Upvote 0
Xin lỗi bạn mình nói chưa rõ. Mình muốn copy tất cả dữ liệu từ các sheet (theongày- 31 ngày (mỗi ngày 1 sheet) vào Sheet "Total" (trừ Sheet "Sum"). Trong file đã có code nhưng nó chỉ copy có 1 cột A. Mình cần sửa lại code cho đúng.
- Copy tất cả dữ liệu từ Sheet 01-->31 (tạm VD 05 sheet ) vào Sheet "Total" không copy Sheet "Sum"
Cảm ơn bạn
Bài đã được tự động gộp:


Cảm ơn bạn. Mình chạy được rồi. Tuy nhiên có 1 sheet "Sum" mình không muốn copy vào Sheet"Total".
Thế làm giống cái
If Ws.Name <> "Total" Then
này là được.
 
Upvote 0
Góp y:
bạn diễn đạt chưa rõ nên anh chị diễn đàn muốn giúp cũng không biết giúp thế nào?
coppy 1 cột là cột nào bạn cho ví dụ kết quả và gửi đính kèm file lại chắc sẽ có người hỗ trợ bạn.
Bạn thử xem đúng ý chưa nhe

Mã:
Option Explicit

Sub GPE()
    Const mCol As Long = 13 'côt A - M'
    Dim wsName, sName As String, ws As Worksheet, Cll As Range, arr, lR As Long, ws0 As Worksheet, oldCal
    Set ws0 = Total
    wsName = Array("01", "02", "03", "04", "05") 'Danh sách tên sheets cân tong hop'
    oldCal = Application.Calculation
    Application.Calculation = xlCalculationManual
    Application.ScreenUpdating = False
    For Each ws In ThisWorkbook.Worksheets
        sName = ws.Name
        If CheckName(wsName, sName) = True Then
            If sName = "01" Then
                Set Cll = ws.Range("A1")
            Else
                Set Cll = ws.Range("A5")
            End If
            arr = GetValue(ws, Cll, mCol)
            If arr(3) = True Then
                lR = ws0.Range("A" & Rows.Count).End(xlUp).Row
                If lR > 1 Then lR = lR + 1
                ws0.Range("A" & lR).Resize(arr(2), mCol) = arr(1)
            End If
        End If
    Next ws
    Application.Calculation = oldCal
    Application.ScreenUpdating = False
End Sub

Private Function GetValue(ByVal ws As Worksheet, ByVal Cll As Range, mCol As Long) As Variant
    'Cll - cell dâu tiên cua vùng du liêu cân lây
    'mcol - sô côt cân lây tinh tu Cll
    Dim a, arr(), mR As Long, i As Long, N As Long, flag As Boolean
    Dim Res(1 To 3)
    mR = LastRow(ws, Cll.Column)
    If mR < Cll.Row Then
        flag = False
        Res(3) = flag
    Else
        flag = True
        With ws
            a = .Range(Cll, .Cells(mR, Cll.Column + mCol)).Value2
        End With
        If IsArray(a) = False Then
            ReDim arr(1 To 1, 1 To 1)
            arr(1, 1) = a
        Else
            arr = a
        End If
        Res(1) = arr
        Res(2) = UBound(arr, 1)
        Res(3) = flag
    End If
    GetValue = Res
End Function

Function LastRow(ByVal ws As Worksheet, ByVal sCol As Long) As Long
    ShowAllRows ws
    LastRow = ws.Cells(ws.Rows.Count, sCol).End(xlUp).Row
End Function

Sub ShowAllRows(ByVal ws As Worksheet)
    If ws.FilterMode = True Then ws.ShowAllData
    ws.Cells.EntireRow.Hidden = False
End Sub

Private Function CheckName(ByVal arr, ByVal sTxt As String) As Boolean
    'arr: mang môt chiêu liêt kê tên các sheets
    Dim bchk
    bchk = Application.Match(sTxt, arr, 0)
    If TypeName(bchk) = "Error" Then CheckName = False Else CheckName = True
End Function
 

File đính kèm

Upvote 0
Web KT

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

Back
Top Bottom