Giúp viết code VBA làm báo cáo

Liên hệ QC

ducminhhanam

Thành viên mới
Tham gia
3/12/10
Bài viết
15
Được thích
0

File đính kèm

  • file mau tao bao cao.xlsx
    94.4 KB · Đọc: 24
Mọi người giúp mình với , mình đang cần gấp

★ Happy♣ ♥ New ☆
(¯`v´¯)….l.o.v.e…..
.`•.¸. • ´………y.o.u…
¸.•… ´¸.•´¨) ¸.•”¨……
(¸.•´ (¸.•´ .•´ ¸¸.•¨¯`•..
––:¦:-•:*’.☆.’*:•-:¦:––
––:¦:-,’*:••:*’,.:•-:¦:––
:_ Happy N~year _:
—–:¦:**.’*:•:*’**:¦:—–
chuc mung nam moi
—–:¦:-•:*’*:•:*’*:•-:¦:—–
———★☆★———
——-★2019★——-
 
Upvote 0
Xin chào cả nhà!
Sáng nay mình có post thread: https://www.giaiphapexcel.com/diendan/threads/giúp-lập-báo-cáo-theo-ngày-tháng-quý-năm.139986/ như đưa data chưa đúng nên mọi người chưa giúp được.
Giờ mình đã làm lại data và có yêu cầu tạo báo cáo cụ thể, mong các bạn quan tâm giúp đỡ.
Nhờ mod xóa giúp thread cũ
Cảm ơn cả nhà nhiều!
Cái này công thức giải quyết dc sao lại phải VBA
 
Upvote 0
Xin chào cả nhà!
Sáng nay mình có post thread: https://www.giaiphapexcel.com/diendan/threads/giúp-lập-báo-cáo-theo-ngày-tháng-quý-năm.139986/ như đưa data chưa đúng nên mọi người chưa giúp được.
Giờ mình đã làm lại data và có yêu cầu tạo báo cáo cụ thể, mong các bạn quan tâm giúp đỡ.
Nhờ mod xóa giúp thread cũ
Cảm ơn cả nhà nhiều!
Bạn xem làm theo data có ngày tháng năm kiểu này mới tổng hợp được nhé.
Đây bạn xem.
 

File đính kèm

  • Bao cao da them ma.xlsm
    53.3 KB · Đọc: 22
Upvote 0
Giờ mình đã làm lại data và có yêu cầu tạo báo cáo cụ thể, mong các bạn quan tâm giúp đỡ.
Dữ liệu của bạn chỉ mình bạn hiểu, các ký hiệu lung tung, mục bộ phận thì bên data (Tổ 1.2) bên báo cáo thì (Tổ. 1)
Tôi chỉ hiểu được đến đây. Muốn tháng thì nhập ngày đầu tháng đến cuối tháng, muốn quý thì từ ngày đầu quý đến .... tùy bạn.
Các cột khác không hiểu bạn muốn tính toán ra sao nên còn bỏ trống.
Sheet data bạn cứ thêm cột vào cho đủ nguyên 1 năm.
 

File đính kèm

  • TaoBaoCao.xlsm
    86.8 KB · Đọc: 14
Upvote 0
Dữ liệu của bạn chỉ mình bạn hiểu, các ký hiệu lung tung, mục bộ phận thì bên data (Tổ 1.2) bên báo cáo thì (Tổ. 1)
Tôi chỉ hiểu được đến đây. Muốn tháng thì nhập ngày đầu tháng đến cuối tháng, muốn quý thì từ ngày đầu quý đến .... tùy bạn.
Các cột khác không hiểu bạn muốn tính toán ra sao nên còn bỏ trống.
Sheet data bạn cứ thêm cột vào cho đủ nguyên 1 năm.
Về cơ bản đã đúng ý em, nhờ Anh giúp thêm tính tổng của sheet "baocao" và cột "có mặt" = "tổng số" - "vắng mặt", cột "nữ" bên sheet "baocao" = cột "nữ" bên sheet "data"
 
Lần chỉnh sửa cuối:
Upvote 0
Em đã diễn giải trong sheet "baocao" nhờ Anh giúp đỡ, em cảm ơn Anh nhiều
- Bạn vừa chèn thêm 2 cột G, H? Làm "banh chành" code đã viết.
- Diễn giải nhưng vẫn không hiểu: Tổng số người trong bộ phận hay tổng số công? Tương tự là các tổng khác như Nữ, ...
 
Upvote 0
- Bạn vừa chèn thêm 2 cột G, H? Làm "banh chành" code đã viết.
- Diễn giải nhưng vẫn không hiểu: Tổng số người trong bộ phận hay tổng số công? Tương tự là các tổng khác như Nữ, ...
+ Tổng số người, tổng số công, ... trong sheet "baocao" em muốn cộng dồn lại và tổng cộng cuối dòng.
+ Còn data sau này em muốn thêm cột không được sao Anh?
Nhờ Anh hướng dẫn giúp!
 
Upvote 0
Xin chào cả nhà!
Sáng nay mình có post thread: https://www.giaiphapexcel.com/diendan/threads/giúp-lập-báo-cáo-theo-ngày-tháng-quý-năm.139986/ như đưa data chưa đúng nên mọi người chưa giúp được.
Giờ mình đã làm lại data và có yêu cầu tạo báo cáo cụ thể, mong các bạn quan tâm giúp đỡ.
Nhờ mod xóa giúp thread cũ
Cảm ơn cả nhà nhiều!
Tạo thêm cột mã , nguyên tắc phân cấp, với cấp lấy dữ liệu ở sheet data phải có 2 dấu "." , ví dụ "I.1.2"
Chỉ làm các cột có tô màu, còn các cột khác không biết nên không thể viết code
Mã:
Sub TongHop()
  Dim sArr(), DonVi(), Nghi(), Res(), Dic As Object
  Dim NgayD As Date, NgayC As Date, fCol As Integer, eCol As Integer
  Dim sR As Long, i As Long, ik As Long, j As Integer, jk As Integer
  Dim tmp As String
  With Sheets("Button")
    NgayD = DateSerial(.Range("K4").Value, .Range("J4").Value, .Range("I4").Value)
    NgayC = DateSerial(.Range("K5").Value, .Range("J5").Value, .Range("I5").Value)
  End With
  With Sheets("data")
    sArr = .Range("A7:CE" & .Range("C100000").End(xlUp).Row).Value
    For j = 7 To 83
      If Cells(4, j).Value >= NgayD Then fCol = j: Exit For
    Next j
    For j = 83 To 7 Step -1
      If Cells(4, j).Value <= NgayC Then eCol = j: Exit For
    Next j
    If eCol < fCol Or eCol = 0 Or fCol = 0 Then MsgBox ("Ngay thang Sai"): Exit Sub
  End With
  With Sheets("mau bao cao")
    Nghi = .Range("D5:V5").Value
    DonVi = .Range("A6:C" & .Range("A100000").End(xlUp).Row).Value
    sR = UBound(DonVi)
  End With
  ReDim Res(1 To sR, 1 To UBound(Nghi, 2))
  Set Dic = CreateObject("scripting.dictionary")
  For j = 4 To UBound(Nghi, 2)
    Dic.Add Nghi(1, j), j
  Next j
  For i = 1 To sR
    If Len(Replace(DonVi(i, 1), ".", "")) = Len(DonVi(i, 1)) - 2 Then
      Dic.Add DonVi(i, 3), i
    Else
      DonVi(i, 2) = "DongTong!!!"
    End If
  Next i
  For i = 1 To UBound(sArr)
    ik = Dic.Item(sArr(i, 3))
    If ik > 0 Then
      Res(ik, 1) = Res(ik, 1) + 1
      Res(sR, 1) = Res(sR, 1) + 1
      For j = fCol To eCol
        jk = Dic.Item(sArr(i, j))
        If jk > 0 Then
          Res(ik, jk) = Res(ik, jk) + 1
          Res(sR, jk) = Res(sR, jk) + 1
        End If
      Next j
    End If
  Next i
  For i = 1 To sR - 1
    If DonVi(i, 2) = "DongTong!!!" Then
      For ik = i + 1 To sR - 1
        If InStr(1, DonVi(ik, 1), DonVi(i, 1) & ".") = 1 Then
          For j = 1 To UBound(Res, 2)
            If Res(ik, j) > 0 Then Res(i, j) = Res(i, j) + Res(ik, j)
          Next j
        Else
          Exit For
        End If
      Next ik
    Else
      DonVi(i, 2) = "DongTong!!!"
    End If
  Next i
  With Sheets("mau bao cao")
    .Range("D6").Resize(sR, UBound(Res, 2)) = Res
    .Activate
    .Range("D6").Select
  End With
End Sub
 

File đính kèm

  • file mau tao bao cao.xlsm
    106.2 KB · Đọc: 20
Upvote 0
Theo mình, tác giả bài đăng nên thiết kế lại CSDL; Thiết kế như hiện nay thì không thể làm báo cáo theo chu kì mong muốn 1 cách dễ dàng.
Như hiện tại bạn cần đến B/C nữa năm,. . . Mà dữ liệu có 1 tháng thôi thì làm sao kiểm chứng?
Dữ liệu hiện tại của bạn chỉ có thể kiểm chứng các báo cáo:
1 vài ngày hay vài 3 tuần
BC tháng
BC 01 ngày

À mà bạn chưa nói rằng trong trang Data mặc định những ngày khác T7 hay CN & để trống sẽ là những ngày đi làm của CN viên?

Theo mình bạn nên có các bảng danh mục sau đây:
[Mã Đơn vị], [Tên đơn vị]
[Mã Công], [Loại công]

Còn như bây giờ mà những ai đang giúp bạn vì rỗi việc quá í thôi!

Chào bạn & chúc vui vẻ nhân dịp năm mới!
 
Upvote 0
Theo mình, tác giả bài đăng nên thiết kế lại CSDL; Thiết kế như hiện nay thì không thể làm báo cáo theo chu kì mong muốn 1 cách dễ dàng.
Như hiện tại bạn cần đến B/C nữa năm,. . . Mà dữ liệu có 1 tháng thôi thì làm sao kiểm chứng?
Dữ liệu hiện tại của bạn chỉ có thể kiểm chứng các báo cáo:
1 vài ngày hay vài 3 tuần
BC tháng
BC 01 ngày

À mà bạn chưa nói rằng trong trang Data mặc định những ngày khác T7 hay CN & để trống sẽ là những ngày đi làm của CN viên?

Theo mình bạn nên có các bảng danh mục sau đây:
[Mã Đơn vị], [Tên đơn vị]
[Mã Công], [Loại công]

Còn như bây giờ mà những ai đang giúp bạn vì rỗi việc quá í thôi!

Chào bạn & chúc vui vẻ nhân dịp năm mới!
+ Em nhờ các anh viết code sau đó em sẽ bổ sung dữ liệu để làm cho cả năm, thực sự em đang có file như vậy và cũng chưa biết các anh giúp viết code theo hướng nào nên đăng lên đây nhờ mọi người cùng giúp đỡ.
+ Vì sheet "data" em nhập thủ công theo từng ngày, ngày nào có dữ liệu mới cộng dồn nên em không nói là ngày nghỉ của NV.
Thực sự em đang rất cần báo cáo này để đầu tuần sau bắt đầu áp dụng nên mong các Anh hỗ trợ đến nơi giúp em, chứ mỗi người viết cho em 1 đoạn code rồi lại bận việc khác nên em rất bối rối không biết phải làm tiếp theo thế nào.
Em cảm ơn mọi người!
 
Lần chỉnh sửa cuối:
Upvote 0
Thường ở các cơ quan, người sử dụng lao động hay điều động công nhân viên từ đơn vị này sang đơn vị khác vào các ngày đầu hay giữa tháng;
Vậy bạn sẽ thống kê ra sao khi thống kê quí cho những người có quyết định thuyên chuyển.

Theo mình bạn làm như thống kê của máy chấm công thôi:
PHP:
  Ngày     Mã NV  Mã công  Mã Đon vị
1/13/2018  NVA00    Ro     TCHC
1/16/2018  TTB07    KT     KTTC
01/20/2018  VNC10   CB      FxA
. . . .
 
Lần chỉnh sửa cuối:
Upvote 0
+ Tổng số người, tổng số công, ... trong sheet "baocao" em muốn cộng dồn lại và tổng cộng cuối dòng.
+ Còn data sau này em muốn thêm cột không được sao Anh?
Nhờ Anh hướng dẫn giúp!
- Thêm cho bạn Tổng số người, tổng số công, còn Có mặt thì không biết tính sao.
- Còn lung tung cái "CTV" và "Không tham gia sản xuất" chẳng hiểu gì, N1, N2,... là gì, ở đâu.
- Giải thích sao cho người khác hiểu chứ không phải tự mình hiểu nhé.
 

File đính kèm

  • TaoBaoCao2.rar
    66.6 KB · Đọc: 12
Upvote 0
Thường ở các cơ quan, người sử dụng lao động hay điều động công nhân viên từ đơn vị này sang đơn vị khác vào các ngày đầu hay giữa tháng;
Vậy bạn sẽ thống kê ra sao khi thống kê quí cho những người có quyết định thuyên chuyển.

Theo mình bạn làm như thống kê của máy chấm công thôi:
PHP:
  Ngày     Mã NV  Mã công
1/13/2018  NVA00    Ro
1/16/2018  TTB07    KT
01/20/2018  VNC10   CB
. . . .
- Thêm cho bạn Tổng số người, tổng số công, còn Có mặt thì không biết tính sao.
- Còn lung tung cái "CTV" và "Không tham gia sản xuất" chẳng hiểu gì, N1, N2,... là gì, ở đâu.
- Giải thích sao cho người khác hiểu chứ không phải tự mình hiểu nhé.
Em đang chạy ra ngoài lát về nhờ hai bác hỗ trợ tiếp
 
Upvote 0
Em đã diễn giải trong sheet "baocao" nhờ Anh giúp đỡ, em cảm ơn Anh nhiều
Tạo lại cột thứ tự, nếu được bạn nên lấy cột nầy làm Mã cho từng bộ phận
Mã:
Sub TongHop()
  Dim sArr(), DonVi(), Nghi(), Res(), Dic As Object
  Dim NgayD As Date, NgayC As Date, fCol As Long, eCol As Long
  Dim sR As Long, i As Long, ik As Long, j As Long, jk As Long
  Dim tmp As String
  With Sheets("BaoCao")
    NgayD = .Range("K2").Value
    NgayC = .Range("R2").Value
    Nghi = .Range("C5:U5").Value
    DonVi = .Range("A6:B" & .Range("B100000").End(xlUp).Row).Value
    sR = UBound(DonVi)
  End With
  With Sheets("data")
    jk = .Range("I4").End(xlToRight).Column
    sArr = .Range("A7").Resize(.Range("C100000").End(xlUp).Row, jk).Value
    For j = 9 To jk
      If .Cells(4, j).Value >= NgayD Then fCol = j: Exit For
    Next j
    For j = jk To 9 Step -1
      If .Cells(4, j).Value <= NgayC Then eCol = j: Exit For
    Next j
    If eCol < fCol Or eCol = 0 Or fCol = 0 Then MsgBox ("Ngay thang Sai"): Exit Sub
  End With

  ReDim Res(1 To sR, 1 To 24)
  Set Dic = CreateObject("scripting.dictionary")
  For j = 4 To UBound(Nghi, 2)
    If Len(Nghi(1, j)) > 0 Then Dic.Add Nghi(1, j), j
  Next j
  For i = 1 To sR - 1
    If InStr(1, DonVi(i + 1, 1), DonVi(i, 1) & ".") = 0 Then
      Dic.Add DonVi(i, 2), i
    End If
  Next i
  For i = 1 To UBound(sArr)
    ik = Dic.Item(sArr(i, 3))
    If ik > 0 Then
      Res(ik, 1) = Res(ik, 1) + 1
      For j = fCol To eCol
        jk = Dic.Item(sArr(i, j))
        If jk > 0 Then
          Res(ik, jk) = Res(ik, jk) + 1
          If InStr(1, ",O,BP,BÙ,CT,", "," & sArr(i, j) & ",") = 0 Then
            Res(ik, 3) = Res(ik, 3) + 1
          End If
        End If
      Next j
      If sArr(i, 7) > 0 Then Res(ik, 22) = Res(ik, 22) + sArr(i, 7)
      If sArr(i, 8) > 0 Then Res(ik, 23) = Res(ik, 23) + sArr(i, 8)
      If sArr(i, 5) > 0 Then Res(ik, 24) = Res(ik, 24) + 1
    End If
  Next i
  For i = 1 To sR - 1
    If Dic.Item(DonVi(i, 2)) = 0 Then
      For ik = i + 1 To sR - 1
        If InStr(1, DonVi(ik, 1), DonVi(i, 1) & ".") = 1 Then
          For j = 1 To UBound(Res, 2)
            If Res(ik, j) > 0 Then Res(i, j) = Res(i, j) + Res(ik, j)
          Next j
        Else
          Exit For
        End If
      Next ik
    Else
      For j = 1 To UBound(Res, 2)
        If Res(i, j) > 0 Then Res(sR, j) = Res(sR, j) + Res(i, j)
      Next j
    End If
  Next i
  With Sheets("Baocao")
    .Range("C6").Resize(sR, UBound(Res, 2)) = Res
    .Activate
    .Range("D6").Select
  End With
End Sub
Cột tổng không tính được, chỉ tính cho vui
 

File đính kèm

  • TaoBaoCao.xlsb
    45.9 KB · Đọc: 13
Upvote 0
Bạn tham khảo thêm cách mình xây dựng lại CSDL & xài hàm CSDL để thống kê
 

File đính kèm

  • TK_VBA.rar
    23.5 KB · Đọc: 25
Upvote 0
Web KT
Back
Top Bottom