Giúp sửa code tổng hợp các sheet khác, trừ một số sheet

Liên hệ QC

AnhThu-1976

Thành viên tích cực
Tham gia
17/10/14
Bài viết
1,016
Được thích
163
Các anh/chị vui lòng giúp em sửa code như sau
Em có tải 1 code trên GPE
Mã:
Option Explicit
Sub Tong()
    Dim sh As Worksheet, data(), dic As Object, i As Long, r As Long
    Dim Res(1 To 10000, 1 To 14), n As Long, k As Long, so
    Set dic = CreateObject("scripting.dictionary")
    With Range("A8:N5000")
        .Font.Bold = False
        .Borders.LineStyle = xlNone
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
    End With
    For Each sh In Worksheets
        If sh.Name <> "CaNam" Then
         
            data = sh.Range(sh.[A8], sh.[A65536].End(3)).Resize(, 14).Value
            For i = 1 To UBound(data)
                If data(i, 2) <> "" Then
                    If Not dic.exists(data(i, 2)) Then
                        k = k + 1
                        dic.Add data(i, 2), k
                        For n = 1 To 13
                            Res(k, n) = data(i, n)
                        Next
                        If Right(data(i, 2), 3) <> "000" Then
                            Res(k, 14) = Res(k, 14) + 1
                        End If
                    Else
                        For n = 6 To 13
                            Res(dic.Item(data(i, 2)), n) = Res(dic.Item(data(i, 2)), n) + data(i, n)
                        Next
                        If Right(data(i, 2), 3) <> "000" Then
                            Res(dic.Item(data(i, 2)), 14) = Res(dic.Item(data(i, 2)), 14) + 1
                        End If
                    End If
                End If
            Next
        End If
    Next
    With Sheets("CaNam")
        .[A8:N1000].ClearContents
        .[A8].Resize(k, 14) = Res
        .Range(.[A8], .[A65536].End(3)).Resize(, 14).Sort .[B7]
        .Range(.[A8], .[A65536].End(3)).Resize(, 14).Font.Bold = False
        For r = .[B65536].End(3).Row To 8 Step -1
            If Right(.Cells(r, 2), 3) = "000" Then
                .Cells(r, 2).EntireRow.Font.Bold = True
                If r > 8 Then .Cells(r, 2).EntireRow.Insert
            Else
                .Cells(r, 1) = Val(Right(.Cells(r, 2), 3))
            End If
        Next
    End With
    Dim Tong As Range, j As Long
    Set Tong = Range([B8], [B50000].End(xlUp))    ' Tinh dong Tong
    For j = 4 To 12
        [B50000].End(xlUp)(3).Offset(, j) = Application.WorksheetFunction.Sum(Tong.Offset(, j)) / 2
    Next j
    With Range([A8], [A5000].End(xlUp))
        .HorizontalAlignment = xlCenter
        .Offset(.Rows.Count)(2, 1) = "C" & ChrW(7897) & "ng"
        .Offset(.Rows.Count)(2, 1).Resize(, 3).HorizontalAlignment = xlCenterAcrossSelection
        .Offset(.Rows.Count)(2, 1).Resize(, 13).Font.Bold = True
    End With
    With Range([A8], [N65536].End(3))
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlDot
    End With
    Range([A65536].End(3), [N65536].End(3)).Borders.Value = 1
End Sub
Tại sheet CaNam chạy code thì nó sẽ tổng hợp số liệu của toàn bộ các sheet khác
Bây giờ em có thêm sheet MuaDongPhuc, em muốn khi chạy code thì sheet CaNam thì nó chỉ tổng hợp các sheet có ký tự bắt đầu là chữ "T" còn các sheet khác không có chữ "T" đầu tiên thì không tổng hợp số liệu vào sheet CaNam
Em có sửa dòng
Mã:
If sh.Name <> "CaNam" Then
Thành
Mã:
If sh.Name <> "CaNam" Or Left(sh.Name, 1) <> "T" Then
Sau khi sửa code xong và tại sheet CaNam ta delete từ dòng thứ 8 trở xuống và chạy code, kết quả như sau:
1/ Sau khi chạy lần thứ 1 thì:
a/Nó tự động thêm dòng tiêu đề ở phía dưới tên Nguyễn Đình Đỉnh
b/ Nó cộng toàn số liệu của tất cả các sheet
2/ Vẫn để số liệu như vậy rồi chạy code lần thứ 2 thì
a/ Số liệu ở sheet CaNam không bị xóa đi để cập nhật lại số liệu mới mà nó bị cộng dồn lên
Cho em hỏi
1/ Tại sao nó bị lỗi như trên
2/ Cách khắc phục lỗi đó
Em cảm ơn!
 

File đính kèm

  • TonhHopLuong.xls
    368.5 KB · Đọc: 3
Các anh/chị vui lòng giúp em sửa code như sau
Em có tải 1 code trên GPE
Mã:
Option Explicit
Sub Tong()
    Dim sh As Worksheet, data(), dic As Object, i As Long, r As Long
    Dim Res(1 To 10000, 1 To 14), n As Long, k As Long, so
    Set dic = CreateObject("scripting.dictionary")
    With Range("A8:N5000")
        .Font.Bold = False
        .Borders.LineStyle = xlNone
        .HorizontalAlignment = xlGeneral
        .VerticalAlignment = xlBottom
    End With
    For Each sh In Worksheets
        If sh.Name <> "CaNam" Then
        
            data = sh.Range(sh.[A8], sh.[A65536].End(3)).Resize(, 14).Value
            For i = 1 To UBound(data)
                If data(i, 2) <> "" Then
                    If Not dic.exists(data(i, 2)) Then
                        k = k + 1
                        dic.Add data(i, 2), k
                        For n = 1 To 13
                            Res(k, n) = data(i, n)
                        Next
                        If Right(data(i, 2), 3) <> "000" Then
                            Res(k, 14) = Res(k, 14) + 1
                        End If
                    Else
                        For n = 6 To 13
                            Res(dic.Item(data(i, 2)), n) = Res(dic.Item(data(i, 2)), n) + data(i, n)
                        Next
                        If Right(data(i, 2), 3) <> "000" Then
                            Res(dic.Item(data(i, 2)), 14) = Res(dic.Item(data(i, 2)), 14) + 1
                        End If
                    End If
                End If
            Next
        End If
    Next
    With Sheets("CaNam")
        .[A8:N1000].ClearContents
        .[A8].Resize(k, 14) = Res
        .Range(.[A8], .[A65536].End(3)).Resize(, 14).Sort .[B7]
        .Range(.[A8], .[A65536].End(3)).Resize(, 14).Font.Bold = False
        For r = .[B65536].End(3).Row To 8 Step -1
            If Right(.Cells(r, 2), 3) = "000" Then
                .Cells(r, 2).EntireRow.Font.Bold = True
                If r > 8 Then .Cells(r, 2).EntireRow.Insert
            Else
                .Cells(r, 1) = Val(Right(.Cells(r, 2), 3))
            End If
        Next
    End With
    Dim Tong As Range, j As Long
    Set Tong = Range([B8], [B50000].End(xlUp))    ' Tinh dong Tong
    For j = 4 To 12
        [B50000].End(xlUp)(3).Offset(, j) = Application.WorksheetFunction.Sum(Tong.Offset(, j)) / 2
    Next j
    With Range([A8], [A5000].End(xlUp))
        .HorizontalAlignment = xlCenter
        .Offset(.Rows.Count)(2, 1) = "C" & ChrW(7897) & "ng"
        .Offset(.Rows.Count)(2, 1).Resize(, 3).HorizontalAlignment = xlCenterAcrossSelection
        .Offset(.Rows.Count)(2, 1).Resize(, 13).Font.Bold = True
    End With
    With Range([A8], [N65536].End(3))
        .Borders(xlEdgeLeft).LineStyle = xlContinuous
        .Borders(xlEdgeRight).LineStyle = xlContinuous
        .Borders(xlInsideVertical).LineStyle = xlContinuous
        .Borders(xlInsideHorizontal).LineStyle = xlDot
    End With
    Range([A65536].End(3), [N65536].End(3)).Borders.Value = 1
End Sub
Tại sheet CaNam chạy code thì nó sẽ tổng hợp số liệu của toàn bộ các sheet khác
Bây giờ em có thêm sheet MuaDongPhuc, em muốn khi chạy code thì sheet CaNam thì nó chỉ tổng hợp các sheet có ký tự bắt đầu là chữ "T" còn các sheet khác không có chữ "T" đầu tiên thì không tổng hợp số liệu vào sheet CaNam
Em có sửa dòng
Mã:
If sh.Name <> "CaNam" Then
Thành
Mã:
If sh.Name <> "CaNam" Or Left(sh.Name, 1) <> "T" Then
Sau khi sửa code xong và tại sheet CaNam ta delete từ dòng thứ 8 trở xuống và chạy code, kết quả như sau:
1/ Sau khi chạy lần thứ 1 thì:
a/Nó tự động thêm dòng tiêu đề ở phía dưới tên Nguyễn Đình Đỉnh
b/ Nó cộng toàn số liệu của tất cả các sheet
2/ Vẫn để số liệu như vậy rồi chạy code lần thứ 2 thì
a/ Số liệu ở sheet CaNam không bị xóa đi để cập nhật lại số liệu mới mà nó bị cộng dồn lên
Cho em hỏi
1/ Tại sao nó bị lỗi như trên
2/ Cách khắc phục lỗi đó
Em cảm ơn!
Tôi không xem hết code, nhưng xem lại câu lệnh này:
If sh.Name <> "CaNam" Or Left(sh.Name, 1) <> "T" Then

Đúng ra phải là ..<> "CaNam" and .. <> đồng phục gì đó.
hoặc là If Left(sh.Name,1) = "T" then
 
Upvote 0
Web KT
Back
Top Bottom