Báo cáo thay vì sử dụng Fivot

Liên hệ QC

satthuvae

Thành viên thường trực
Tham gia
12/3/09
Bài viết
381
Được thích
52
Em chào Anh/Chị

Hiện tại e có báo cáo dữ liệu đầu vào thường xuyên có sự thay đổi theo tháng, mỗi khi thay đổi số người, hoặc mức thu nhập...e lại chạy lại báo cáo.

Việc làm cũng mất thời gian của e, e có sử dụng Fivot nhưng do thay đổi số liệu nhiều quá.

Nhờ Anh/Chị các bạn xem giúp em có thể làm marco tự động chạy lên báo cáo giúp em.

Em xin cám ơn À.
 

File đính kèm

  • Báo cáo thay vì sử dụng Fivot.xlsx
    111.7 KB · Đọc: 14
Em chào Anh/Chị

Hiện tại e có báo cáo dữ liệu đầu vào thường xuyên có sự thay đổi theo tháng, mỗi khi thay đổi số người, hoặc mức thu nhập...e lại chạy lại báo cáo.

Việc làm cũng mất thời gian của e, e có sử dụng Fivot nhưng do thay đổi số liệu nhiều quá.

Nhờ Anh/Chị các bạn xem giúp em có thể làm marco tự động chạy lên báo cáo giúp em.

Em xin cám ơn À.

Thử công thức này tại B2
Mã:
=IFERROR(INDEX('Đầu vào'!$B$2:$B$3000,MATCH(0,INDEX(COUNTIF($B$1:B1,'Đầu vào'!$B$2:$B$3000),0,0),0)),"")

Công thức mảng tại G2-->Ctrl+Shift+Enter
Mã:
=MAX(IF('Đầu vào'!$B$2:$B$3000=B2,'Đầu vào'!$G$2:$G$3000,0))
 

File đính kèm

  • Báo cáo thay vì sử dụng Fivot.xlsx
    111.1 KB · Đọc: 13
Thử công thức này tại B2
Mã:
=IFERROR(INDEX('Đầu vào'!$B$2:$B$3000,MATCH(0,INDEX(COUNTIF($B$1:B1,'Đầu vào'!$B$2:$B$3000),0,0),0)),"")

Công thức mảng tại G2-->Ctrl+Shift+Enter
Mã:
=MAX(IF('Đầu vào'!$B$2:$B$3000=B2,'Đầu vào'!$G$2:$G$3000,0))
Dạ e cám ơn Anh/Chị à.

Do đặc thù dữ liệu đầu vào của e thay đổi liên tục, dẫn đến thứ tự dòng ở bên sheet để chạy tự động lên báo cáo sẽ thay đổi,

Do cũng không nắm được số liệu chính xác là bao nhiêu, khi thêm dòng hoặc thiếu dòng sẽ không tự động được à

Đó là ngược điểm à, e rất mong Anh/Chị có thể dùng marco để chạy tự động, tăng giảm số dòng tự động ra báo cáo.

E xin cám ơn À
 
Dạ e cám ơn Anh/Chị à.

Do đặc thù dữ liệu đầu vào của e thay đổi liên tục, dẫn đến thứ tự dòng ở bên sheet để chạy tự động lên báo cáo sẽ thay đổi,

Do cũng không nắm được số liệu chính xác là bao nhiêu, khi thêm dòng hoặc thiếu dòng sẽ không tự động được à

Đó là ngược điểm à, e rất mong Anh/Chị có thể dùng marco để chạy tự động, tăng giảm số dòng tự động ra báo cáo.

E xin cám ơn À

Thì sheet chi tiết có bao nhiêu dòng, thay đổi gì thì nó vẫn cập nhật rồi mà, B2 mình đã dùng công thức, G2 cũng dùng công thức, bạn thử xóa, chèn dòng bên chi tiết xem như thế nào, mình đang làm 3000 dòng.
 
Thì sheet chi tiết có bao nhiêu dòng, thay đổi gì thì nó vẫn cập nhật rồi mà, B2 mình đã dùng công thức, G2 cũng dùng công thức, bạn thử xóa, chèn dòng bên chi tiết xem như thế nào, mình đang làm 3000 dòng.
Vâng à. E rất cám ơn Anh à.

Ý của e nếu mà sử dụng được marco thì tốt à, vì dữ liệu của e khá nhiều, khi chạy excel hơi chậm.

Rất cám ơn anh đã hỗ trợ e à.

Không biết anh có thể giúp e bằng marco không à.
 
Vâng à. E rất cám ơn Anh à.

Ý của e nếu mà sử dụng được marco thì tốt à, vì dữ liệu của e khá nhiều, khi chạy excel hơi chậm.

Rất cám ơn anh đã hỗ trợ e à.

Không biết anh có thể giúp e bằng marco không à.

VBA thì không biết rồi, chờ các Anh/Em khác vào giúp nhé.
 
Em chào Anh/Chị

Hiện tại e có báo cáo dữ liệu đầu vào thường xuyên có sự thay đổi theo tháng, mỗi khi thay đổi số người, hoặc mức thu nhập...e lại chạy lại báo cáo.

Việc làm cũng mất thời gian của e, e có sử dụng Fivot nhưng do thay đổi số liệu nhiều quá.

Nhờ Anh/Chị các bạn xem giúp em có thể làm marco tự động chạy lên báo cáo giúp em.

Em xin cám ơn À.
Đây bạn xem.
Mã:
Sub tonghop()
Dim a As Long, b As Long, c As Long, d As Double, e As Double, i As Long, j As Long
Dim dk As String
Dim dic As Object
Dim arr, arr1
Set dic = CreateObject("scripting.dictionary")
With Sheet2
     b = .Range("B" & Rows.Count).End(xlUp).Row - 1
     If b > 0 Then arr = .Range("B2:G" & b).Value
End With
With Sheet3
     ReDim arr1(1 To UBound(arr, 1), 1 To 7)
     For i = 1 To UBound(arr, 1)
        dk = arr(i, 1)
        If dic.exists(dk) = 0 Then
           a = a + 1
           dic.Item(dk) = Array(a)
           arr1(a, 1) = a
           For j = 2 To 7
                arr1(a, j) = arr(i, j - 1)
           Next j
       Else
           c = dic.Item(dk)(0)
        arr1(c, 3) = arr1(c, 3) + arr(i, 2)
        arr1(c, 4) = arr1(c, 4) + arr(i, 3)
        arr1(c, 5) = arr1(c, 5) + arr(i, 4)
        arr1(c, 6) = arr1(c, 6) + arr(i, 5)
        If arr1(c, 7) < arr(i, 6) Then arr1(c, 7) = arr(i, 6)
       End If
    Next i
  .Rows("2:132").EntireRow.Hidden = False
  .Range("A2:g132").ClearContents
  If a Then
     .Range("A2").Resize(a, 7).Value = arr1
     .Rows(a + 2 & ":132").EntireRow.Hidden = True
  End If
End With
End Sub
 

File đính kèm

  • Báo cáo thay vì sử dụng Fivot.xlsm
    122.9 KB · Đọc: 21
File của bạn còn thiếu nghiêm trọng 1 trường/cột, đó là [Mã NV]
Đã muốn xài VBA thì càng không nên tên trang tính tiếng Việt có dấu; Mà không đụng đến VBA chăng nữa, tên trang tính không nên lê thê đến thế.
Dưới đây cách mà mình xài DSUM() & DMAX() để có số liệu thống kê cho bạn:
PHP:
Sub ThongKeTungNguoi()
 Dim CSDL As Range, Cls As Range, WF As Object
 Dim Rws As Long, J As Integer
 
 Set WF = Application.WorksheetFunction
 Sheet3.Select
 With Sheet2
    Rws = .[B1].CurrentRegion.Rows.Count
    Set CSDL = .[B1].Resize(Rws):                                           .[AA1].Value = .[B1].Value
    For Each Cls In Range([B2], [B2].End(xlDown))
        .[AA2].Value = Cls.Value
        For J = 3 To 6
            Cls.Offset(, J - 1).Value = WF.DSum(CSDL.Resize(, J), .[A1].Offset(, J), .[AA1:AA2])
        Next J
        Cls.Offset(, 6).Value = WF.DMax(CSDL.Resize(, 7), .[H1], .[AA1:AA2])
    Next Cls
 End With
End Sub
 

File đính kèm

  • TK_VBA.rar
    49.1 KB · Đọc: 15
Đây bạn xem.
Mã:
Sub tonghop()
Dim a As Long, b As Long, c As Long, d As Double, e As Double, i As Long, j As Long
Dim dk As String
Dim dic As Object
Dim arr, arr1
Set dic = CreateObject("scripting.dictionary")
With Sheet2
     b = .Range("B" & Rows.Count).End(xlUp).Row - 1
     If b > 0 Then arr = .Range("B2:G" & b).Value
End With
With Sheet3
     ReDim arr1(1 To UBound(arr, 1), 1 To 7)
     For i = 1 To UBound(arr, 1)
        dk = arr(i, 1)
        If dic.exists(dk) = 0 Then
           a = a + 1
           dic.Item(dk) = Array(a)
           arr1(a, 1) = a
           For j = 2 To 7
                arr1(a, j) = arr(i, j - 1)
           Next j
       Else
           c = dic.Item(dk)(0)
        arr1(c, 3) = arr1(c, 3) + arr(i, 2)
        arr1(c, 4) = arr1(c, 4) + arr(i, 3)
        arr1(c, 5) = arr1(c, 5) + arr(i, 4)
        arr1(c, 6) = arr1(c, 6) + arr(i, 5)
        If arr1(c, 7) < arr(i, 6) Then arr1(c, 7) = arr(i, 6)
       End If
    Next i
  .Rows("2:132").EntireRow.Hidden = False
  .Range("A2:g132").ClearContents
  If a Then
     .Range("A2").Resize(a, 7).Value = arr1
     .Rows(a + 2 & ":132").EntireRow.Hidden = True
  End If
End With
End Sub

Dạ rất cám ơn anh đã giúp đỡ em.

Do bản thiết kế của e lần trước vẫn còn sơ sài và chưa đủ các chỉ tiêu.

Em gửi lại anh mẫu, E bổ sung một số chỉ tiêu cho phù hợp.

Rất mong anh giúp em lại à, kỳ thực e chạy công thức trên excel đơ máy quá, không xử lý được à.

E cám ơn anh nhiều.

E gửi lại bản excel à.
Bài đã được tự động gộp:

File của bạn còn thiếu nghiêm trọng 1 trường/cột, đó là [Mã NV]
Đã muốn xài VBA thì càng không nên tên trang tính tiếng Việt có dấu; Mà không đụng đến VBA chăng nữa, tên trang tính không nên lê thê đến thế.
Dưới đây cách mà mình xài DSUM() & DMAX() để có số liệu thống kê cho bạn:
PHP:
Sub ThongKeTungNguoi()
Dim CSDL As Range, Cls As Range, WF As Object
Dim Rws As Long, J As Integer

Set WF = Application.WorksheetFunction
Sheet3.Select
With Sheet2
    Rws = .[B1].CurrentRegion.Rows.Count
    Set CSDL = .[B1].Resize(Rws):                                           .[AA1].Value = .[B1].Value
    For Each Cls In Range([B2], [B2].End(xlDown))
        .[AA2].Value = Cls.Value
        For J = 3 To 6
            Cls.Offset(, J - 1).Value = WF.DSum(CSDL.Resize(, J), .[A1].Offset(, J), .[AA1:AA2])
        Next J
        Cls.Offset(, 6).Value = WF.DMax(CSDL.Resize(, 7), .[H1], .[AA1:AA2])
    Next Cls
End With
End Sub

Dạ e cám ơn anh.

Kỳ thức mẫu thực tế, e cần tên là có dấu à, vì thực tế đó là danh sách nhân viên công ty.

E thấy marco anh snow25 chạy khá ổn à, không làm treo excel khi áp dụng công thức thủ công của e à.

Cám ơn anh đã góp ý à.
 

File đính kèm

  • Báo cáo thay vì sử dụng Fivot.xlsm
    277.5 KB · Đọc: 12
Lần chỉnh sửa cuối:
E rất mong anh/Chị các bạn rảnh xem giúp em à,

Do e sử dụng nhiều công thức quá, công ty e nhiều nhân viên, lên mỗi khi làm báo cáo này excel không chạy được à.

Anh/Chị có thể giúp e tạo marco có thể chạy được tự động theo File e gửi đính kèm à.

E rất cám ơn à.

Em xin gửi lại File
 

File đính kèm

  • Báo cáo tự động thay vì áp dụng công thức.xlsm
    365.9 KB · Đọc: 12
E rất mong anh/Chị các bạn rảnh xem giúp em à,

Do e sử dụng nhiều công thức quá, công ty e nhiều nhân viên, lên mỗi khi làm báo cáo này excel không chạy được à.

Anh/Chị có thể giúp e tạo marco có thể chạy được tự động theo File e gửi đính kèm à.

E rất cám ơn à.

Em xin gửi lại File
Bảng của bạn có bao nhiêu sheets cần gộp vào vậy.
 
Sau khi xem 3 trang tính trên file của bạn, kết luận của mình là có khả năng chăng nữa mình sẽ không giúp.
Lí do: Thiết kế file không fù hợp với mình:
Trong 3 trang tính, bạn iêu cầu chép từ 'OutPut' đến 2 'Input'
Nhưng ở trang chép đi không có mã duy nhất;
Trớ trêu ở 1 trong 2 trang cần chép đến lại có mã NV; Thêm nữa lại ghi là 'Nếu có'

Công cuộc chép đi & chép đến này nên & fải xài macro; & Theo mình, macro chỉ làm việc với các Mã NV, chớ không nên (1 cách hoàn toàn) tên NV
Mình xin cảnh báo, nếu CSDL gốc của bạn không có mã NV thì có ngày thành đống rác không xa!

Nói thêm: Trong mã NV của bạn có chuyện này:
Mã:
[ATTACH=full]208865[/ATTACH]
Sao không là
PHP:
[ATTACH=full]208867[/ATTACH]
hay:
Mã:
[ATTACH=full]208868[/ATTACH]
 

File đính kèm

  • 1544075632055.png
    1544075632055.png
    3.1 KB · Đọc: 4
  • 1544075683028.png
    1544075683028.png
    3.3 KB · Đọc: 1
  • 1544075747714.png
    1544075747714.png
    3.2 KB · Đọc: 1
Bảng của bạn có bao nhiêu sheets cần gộp vào vậy.
Dạ e có 2 sheet cần gộp vào à

sheet input1 và input 2 là dữ liệu
sheet output là kết quả à.

Rất mong anh xem giúp em

Cám ơn Anh
Bài đã được tự động gộp:

Sau khi xem 3 trang tính trên file của bạn, kết luận của mình là có khả năng chăng nữa mình sẽ không giúp.
Lí do: Thiết kế file không fù hợp với mình:
Trong 3 trang tính, bạn iêu cầu chép từ 'OutPut' đến 2 'Input'
Nhưng ở trang chép đi không có mã duy nhất;
Trớ trêu ở 1 trong 2 trang cần chép đến lại có mã NV; Thêm nữa lại ghi là 'Nếu có'

Công cuộc chép đi & chép đến này nên & fải xài macro; & Theo mình, macro chỉ làm việc với các Mã NV, chớ không nên (1 cách hoàn toàn) tên NV
Mình xin cảnh báo, nếu CSDL gốc của bạn không có mã NV thì có ngày thành đống rác không xa!

Nói thêm: Trong mã NV của bạn có chuyện này:
Mã:
[ATTACH=full]208865[/ATTACH]
Sao không là
PHP:
[ATTACH=full]208867[/ATTACH]
hay:
Mã:
[ATTACH=full]208868[/ATTACH]

Dạ cám ơn Anh đã góp ý à.

E căn cứ vào họ tên nhân viên à khi sao chép từ input sang output thôi à. Vì công ty e không có mã nhân viên cụ thể, chỉ có từng phòng ban thôi à. Đó mới là điểm khó của công ty em.

Còn cột ghi "nếu có" chỉ là e báo tô màu nếu trùng thôi.
 
Lần chỉnh sửa cuối:
Web KT
Back
Top Bottom