Giúp viết code tổng hợp dữ liệu (1 người xem)

Liên hệ QC

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

Xuân hiếu

Thành viên thường trực
Tham gia
23/5/08
Bài viết
235
Được thích
72
Chào các bạn của giải pháp EC
Mình có 1 file tổng đây là file có 5 sheet có cấu trúc khác nhau. và rất nhiều file con có cấu trúc giống như file tổng.
Mình muốn các bạn giúp mình viết 1 con macro gắn 1 cái nút để khi nhấn nút thì nó tự động tính tổng
Giữ liệu mình gửi kèm rất mong quí bạn giúp đở
 

File đính kèm

Bạn Luận giúp mình hoàn thiện bảng TH với nhé. Cảm on nhiều...
 
Upvote 0
Bạn còn khúc mắc chổ nào thì nói cho anh em biết mới bàn được chớ!
 
Upvote 0
Cộng tổng ở cột cuối thì nhìn đẹp hơn còn mẫu 6 thì sai toàn bộ ở mẫu này dữ liệu phần nhiều là nằm ở cột quản lý và giáo viênvới lại giúp mình đánh số thứ tự cho các mẫu 2; 5; 7 luôn nhé cảm ơn nhiều
Đã hiệu chỉnh theo yêu cầu (và không dùng sheet TEMP - tính toán trực tiếp)
Bạn chạy lại số liệu để kiểm tra. Riêng dòng tổng có đưa vào nhưng ko chèn công thức, bạn tự làm nhé!
 

File đính kèm

Upvote 0
Bạn luận giúp mình một vấn đề này nữa nhé đó là sau khi chạy macro lần 1 là OK rồi giờ chạy lại lần hai thì dữ liệu trong các mẫu 2; 5; và 7 tự động chèn vào thêm do đó mình muốn là nó không chèn thêm nữa vì dữ liệu giống nhau thì khỏi phải chèn thêm nếu nếu có dữ liệu khác với dữ liệu lúc đầu mới chèn thêm vào với lại bạn giúp mình viết công thức tính ở hàng tổng với mình mò hoài hôm qua giờ nhưng không được xin cảm ơn bạn nhiều.
 
Upvote 0
Bạn Luận giúp mình hoàn chỉnh code cho bảng tổng hợp này với. Xin cảm ơn trước rất nhiều.
 
Upvote 0
Bạn Luận giúp mình hoàn chỉnh code cho bảng tổng hợp này với. Xin cảm ơn trước rất nhiều.
Tôi đã hoàn tất các yêu cầu của bạn. Bạn hãy kiểm tra các công thức tính ở dòng tổng, có gì sai sót thì gửi lên ở đây.
Mỗi lần cập nhật sẽ xóa số liệu cũ, thay bằng số liệu mới.
 

File đính kèm

Upvote 0
Lời đầu tiên xin cảm ơn mọ người giúp đở.
Mình xin làm phiền bạn luận nhé bạn giúp mình hoàn thiện bảng tổng hợp giúp nhé. Code bạn viết đúng ý mình rùi nhưng một số chỗ như: Khi chạy code lần đầu lấy dữ liệu xong nếu chạy lại lần hai mà dự liệu giống nhau (có tên đơn vị giống nhau) thì bỏ qua hoặc ghi đè lên chứ không chèn thêm giống với lại một số chỗ như tính tổng bạn giúp mình làm code tính tổng luôn nhé. Cảm ơn rất nhiều.
 

File đính kèm

Upvote 0
Ở trên (bài số 27) tôi đã gửi file, bạn đã kiểm tra chưa? Một số vướng mắc nhỏ (chẳng hạn liên kết dữ liệu từ mẫu 2 sang mẫu 1 thì bạn chỉ cần thay tham chiếu tuyệt đối thành tương đối là xong. bảng tổng hợp thường chỉ chạy 1 lần, do đó có 1 số tình huống không nhất thiết phải viết lại code (mà nếu viết thì thì trong code, tôi đã tách riêng 1 đoạn cho dễ điều chỉnh - tôi nghĩ là bạn cũng nên xắn tay áo lên 1 ít để code hoàn thiện đúng theo ý bạn)
 
Upvote 0
Cảm ơn bạn rất nhiều do khi gửi câu hỏi xong mới thấy bạn gửi trả lời mình đã hoàn chỉnh rồi cách cách chọn file cần tổng hợp kiểu như thế này mình áp dụng rất nhiều nhưng do tầm hiểu biết còn thấp nên đành pahỉ nhờ các bạn giải giúp một lần nữa xin cảm ơn....
Ở trên (bài số 27) tôi đã gửi file, bạn đã kiểm tra chưa? Một số vướng mắc nhỏ (chẳng hạn liên kết dữ liệu từ mẫu 2 sang mẫu 1 thì bạn chỉ cần thay tham chiếu tuyệt đối thành tương đối là xong. bảng tổng hợp thường chỉ chạy 1 lần, do đó có 1 số tình huống không nhất thiết phải viết lại code (mà nếu viết thì thì trong code, tôi đã tách riêng 1 đoạn cho dễ điều chỉnh - tôi nghĩ là bạn cũng nên xắn tay áo lên 1 ít để code hoàn thiện đúng theo ý bạn)
 
Upvote 0
Trước hết xin cảm ơn bạn Luận
Bạn giúp mình một tý nữa nhen là tại cột T ở mẫu số 2 hàng Tổng nếu trong các đơn vị mà có 1 đơn vị không đạt thì ghi chữ không đạt còn tất cả các đơn vị đều đạt thì ghi Đạt vậy công thức này chèn chỗ nào vậy bạn? Bạn giúp mình với nhen
Với lại bạn giúp mình một code khóa các sheet lại sau khi macro chạy xong do mình sợ một số người xóa nhầm.
Một lần nữa cảm ơn bạn nhiều
 
Lần chỉnh sửa cuối:
Upvote 0
Bạn copy code dưới đây và thay vào file của bạn:
PHP:
Const m1r1 = "C11:AC15", m1r2 = "C17:AC20"
Const m2r1 = "B11:T11", m2r2 = "N11"
Const m5r1 = "B11:P11"
Const m6r1 = "D12:Y15", m6r2 = "D17:Y17"
Const m7r1 = "B8:V8"
Const fPath = "C:\PC THCS IA PA\NAM 2010\*"
Dim sM1 As Worksheet, sM2 As Worksheet, sM5 As Worksheet, sM6 As Worksheet, sM7 As Worksheet
Dim r1M1 As Range, r2M1 As Range, r1M2 As Range, r2M2 As Range, r1M5 As Range
Dim r1M6 As Range, r2M6 As Range, r1M7 As Range, rT1 As Range, rT2 As Range
 
Dim sM1x As Worksheet, sM2x As Worksheet, sM5x As Worksheet, sM6x As Worksheet, sM7x As Worksheet
Dim r1M1x As Range, r2M1x As Range, r1M2x As Range, r2M2x As Range, r1M5x As Range
Dim r1M6x As Range, r2M6x As Range, r1M7x As Range
 
Dim wbTH As Workbook
Dim a1M1(), a2M1(), a1M6(), a2M6()
Private Sub setVar(wb As Workbook)
With wb
    Set sM1 = .Sheets("Mau 1")
        Set r1M1 = sM1.Range(m1r1)
        Set r2M1 = sM1.Range(m1r2)
    Set sM2 = .Sheets("Mau 2")
        Set r1M2 = sM2.Range(m2r1)
        Set r2M2 = sM2.Range(m2r2)
    Set sM5 = .Sheets("Mau 5")
        Set r1M5 = sM5.Range(m5r1)
    Set sM6 = .Sheets("Mau 6")
        Set r1M6 = sM6.Range(m6r1)
        Set r2M6 = sM6.Range(m6r2)
    Set sM7 = .Sheets("Mau 7 ")
        Set r1M7 = sM7.Range(m7r1)
End With
End Sub
Private Sub setVarTH()
With ThisWorkbook
On Error Resume Next
    For Each sh In ThisWorkbook.Worksheets
        sh.Unprotect ("")
    Next
 
    Set sM1x = .Sheets("Mau 1")
 
        Set r1M1x = sM1x.Range(m1r1)
        Set r2M1x = sM1x.Range(m1r2)
    Set sM2x = .Sheets("Mau 2")
        Set r1M2x = sM2x.Range("A10")
 
    Set sM5x = .Sheets("Mau 5")
        Set r1M5x = sM5x.Range("A10")
 
    Set sM6x = .Sheets("Mau 6")
        Set r1M6x = sM6x.Range(m6r1)
        Set r2M6x = sM6x.Range(m6r2)
 
    Set sM7x = .Sheets("Mau 7 ")
        Set r1M7x = sM7x.Range("A8")
 
End With
End Sub
 
Private Sub copyData()
    For i = 1 To 5
        For j = 1 To 27
            a1M1(i, j) = a1M1(i, j) + r1M1(i, j)
        Next
    Next
        For j = 1 To 27
            a2M1(1, j) = a2M1(1, j) + r2M1(1, j)
        Next
    For i = 1 To 4
        For j = 1 To 22
            a1M6(i, j) = a1M6(i, j) + r1M6(i, j)
            Debug.Print a1M6(i, j)
        Next
    Next
        For j = 1 To 22
            a2M6(1, j) = a2M6(1, j) + r2M6(1, j)
        Next
    r1M2x.Rows(2).EntireRow.Insert
    r1M2.Offset(0, 0).Copy: r1M2x.Offset(1, 1).PasteSpecial (xlPasteValues)
    r1M5x.Rows(2).EntireRow.Insert
    r1M5.Copy: r1M5x.Offset(1, 1).PasteSpecial (xlPasteValues)
    r1M7x.Rows(2).EntireRow.Insert
    r1M7.Copy: r1M7x.Offset(1, 1).PasteSpecial (xlPasteValues)
End Sub
Private Sub sumData()
Dim sh As Worksheet
    r1M1x = a1M1: r2M1x = a2M1
    r1M6x = a1M6: r2M6x = a2M6
    Call proSheet(2, r1M2x)
    Call proSheet(5, r1M5x)
    Call proSheet(7, r1M7x)
    For Each sh In ThisWorkbook.Worksheets
        sh.Protect ("")
    Next
End Sub
Private Function setRange(ra As Range) As Range
On Error Resume Next
    Set setRange = ra.Offset(1).Resize(ra.End(xlDown).Row - ra.Row - 1, 1)
End Function
Private Sub delData(ra As Range)
Dim t As Range
    Set t = setRange(ra)
    If Not t Is Nothing Then t.Rows.EntireRow.Delete
End Sub
Private Sub proSheet(m As Long, ra As Range)
Dim t As Range, i As Long
    Set t = setRange(ra)
    If Not t Is Nothing Then
        t.Columns(1).Value = Evaluate("Row(1:" & t.Rows.Count & ")")
        ra.End(xlDown).Offset(0, 2).Resize(1, ra.End(xlToRight).Column - 2).Formula = _
            "=Sum(" & t.Columns(3).Address(False, False) & ")"
        Select Case m
            Case 2
                With t.Resize(t.Rows.Count + 1)
                .Columns(5).Formula = "=If(C11<>0,Round(D11/C11 %,2),"""")"
                .Columns(10).Formula = "=If(F11<>0,Round(I11/F11 %,2),"""")"
                .Columns(13).Formula = "=If(K11<>0,Round(L11/K11 %,2),"""")"
                .Columns(19).Formula = "=If(O11<>0,Round(S11/O11 %,2),"""")"
                End With
                With ra.End(xlDown)
                .Offset(0, 13).Formula = "=Average(" & t.Columns(14).Address(False, False) & ")"
                .Offset(0, 19).Value = t(1, 20)
                For i = 1 To t.Rows.Count - 1
                    If InStr(t(i, 20), "ng") Then .Offset(0, 19).Value = t(i, 20)
                Next
                End With
            Case 5
                With t.Resize(t.Rows.Count + 1)
                .Columns(5).Formula = "=Round(D11/C11 %,2)"
                .Columns(7).Formula = "=Round(F11/C11 %,2)"
                .Columns(9).Formula = "=Round(H11/C11 %,2)"
                .Columns(11).Formula = "=Round(J11/C11 %,2)"
                .Columns(13).Formula = "=Round(C11/L11,2)"
                .Columns(15).Formula = "=Round(N11/L11,2)"
                .Cells(t.Rows.Count + 1, 16).Value = ""
                End With
            Case 7
                With ra.End(xlDown)
                .Offset(0, 3).Formula = "=Average(" & t.Columns(4).Address(False, False) & ")"
                End With
        End Select
       
    End If
End Sub
Sub proFile()
Dim fd As FileDialog
Dim wb As Workbook, sh As Worksheet, ra As Range, shT As Worksheet, ra1 As Range
Dim idx As Long
Dim vrtSelectedItem As Variant
With Application
.ScreenUpdating = False
.EnableEvents = False
.DisplayAlerts = False
    ReDim a1M1(1 To 5, 1 To 27)
    ReDim a2M1(1 To 1, 1 To 27)
    ReDim a1M6(1 To 4, 1 To 22)
    ReDim a2M6(1 To 1, 1 To 22)
    idx = 1
    Set fd = Application.FileDialog(msoFileDialogFilePicker)
    With fd
        'Allow the selection of multiple file.'
        .AllowMultiSelect = True
        .Filters.Clear
        .Filters.Add "XLS", "*.XLS"
        .InitialFileName = fPath
        If .Show = -1 Then
            Call setVarTH
            Call delData(r1M2x)
            Call delData(r1M5x)
            Call delData(r1M7x)
            For Each vrtSelectedItem In .SelectedItems
                Set wb = Workbooks.Open(vrtSelectedItem)
                Call setVar(wb)
                Call copyData
                wb.Close savechanges:=False
            Next vrtSelectedItem
            Call sumData
            sM1x.Activate
        Else
        End If
    End With
    Set fd = Nothing
    Set wb = Nothing
    Erase a1M1, a2M1, a1M6, a2M6
.ScreenUpdating = True
.EnableEvents = True
.DisplayAlerts = True
End With
End Sub
 
Upvote 0
Bạn thật tiệt vời mình cảm ơn bạn rất nhiều.
 
Upvote 0
Bạn luận cho mình hỏi thêm 1 bài này nữa nhen.
Cách làm thì cũng giống như bài trên nhưng dữ liệu cộng dồn nhưng không liên tục hàng thị cộng các file lại hàng thì phần trăm. Các mẫu đều giống nhau chỉ có 1 sheet mình xin cảm ơn trước.
Kích gọi macro
chọn đơn vị cần tổng hợp
sau đó tính tổng vào các cột trắng, cột xanh tính % và tính tổng
Mình gửi file lên nhờ bạn xem giải giúp.
Àh bạn giúp mình chú giải 1 số câu trong VBA với để lần sau mình tập viết
Mình cảm ơn bạn rất nhiều.
 

File đính kèm

Upvote 0
Bạn luận giúp mình bài 34 này với.
Cảm ơn trước rất nhiều
 
Upvote 0
Vì không có file test nên tôi tạo tạm 2 file để kiểm tra, có thể chưa xử lý hết tất cả trường hợp.
Trong mẫu cần tổng hợp 5 cột x 4 khối x 3 loại = 60 cột => tôi tạo 1 mảng 60 phần tử để tỉnh tổng.
Trong sheet chính, tôi thêm 1 validation để bạn chọn cách lấy số liệu: TH mới và Bổ sung - nếu chọn TH mới sẽ xóa số liệu, tính lại từ đầu.
Bạn test thử nhé.
 

File đính kèm

Upvote 0
Qua kiểm tra mình thấy đúng rồi bạn ơi. Cảm ơn bạn rất nhiều.
Một lần nữa cảm ơn bạn, bạn rất tuyệt.

Vì không có file test nên tôi tạo tạm 2 file để kiểm tra, có thể chưa xử lý hết tất cả trường hợp.
Trong mẫu cần tổng hợp 5 cột x 4 khối x 3 loại = 60 cột => tôi tạo 1 mảng 60 phần tử để tỉnh tổng.
Trong sheet chính, tôi thêm 1 validation để bạn chọn cách lấy số liệu: TH mới và Bổ sung - nếu chọn TH mới sẽ xóa số liệu, tính lại từ đầu.
Bạn test thử nhé.
 
Upvote 0
Web KT

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

Back
Top Bottom