Tạo phiếu giao việc cho từng nhân viên dựa trên Bảng dữ liệu tổng

Liên hệ QC

quyenpv

Thu nhặt kiến thức
Tham gia
5/1/13
Bài viết
709
Được thích
90
Giới tính
Nam
Nghề nghiệp
Decode cuộc đời!
Thủ tướng cho cách ly Encovy toàn quốc mà bị trưởng phòng giao việc khó quá so với trình độ hiểu biết của mình nên mong anh chị hỗ trợ qua giai đoạn Encovy này với ạ
Tình hình là em hàng tháng đều phải làm bảng dữ liệu tổng để anh em trong phòng chạy việc theo yêu cầu của trưởng phòng em theo Sheet "GV-KTHT". Nay tự dưng bắt từ Sheet "GV-KTHT" hàng tháng đó đưa dữ liệu vào từng Sheet cho nhân viên để ký giữa TP và NV đánh giá hàng tháng
Cụ thể:
- Tạo từng Sheet cho nhân viên với tên từng người: VD Giaoviec_vuongdd1
- Kiểm tra dữ liệu cột L (Tiến độ) người nào thực hiện đưa dữ liệu vào từng Sheet của NV đó
- Tại Sheet Giaoviec_NV (VD "Giaoviec_vuongdd1) chi tiết lấy dữ liệu như sau:
+ Tên nhiệm vụ, công việc: Lấy dữ liệu cột B của Sheet GV-KTHT
+ Thời gian thực hiện: Lấy dữ liệu cột O của Sheet GV-KTHT
+ Mục tiêu, kết quả cần đạt được (Có thể đo lường được): Lấy dữ liệu cột E của Sheet GV-KTHT
+ Mức độ hoàn thành nhiệm vụ: Lấy dữ liệu cột F của Sheet GV-KTHT
Mong các anh chị giúp đỡ em với ạ
 

File đính kèm

  • Help_Giao viec.xlsm
    135.9 KB · Đọc: 35
  • 1.PNG
    1.PNG
    65.3 KB · Đọc: 41
  • 2.PNG
    2.PNG
    48.7 KB · Đọc: 41
  • Help_Giao viec.xlsm
    137.2 KB · Đọc: 11
Mã:
Option Explicit
Option Private Module
Sub Run_BB_2B()

    Dim i, k, ar, ketqua
    Dim Nguon, Dong
    Dim LastRow
    
    Dim MaCT, MaDT, BBBG, NgayBG, DiaBan

    With Sheets("GV-KTHT")
        Dong = .Range("O17").End(xlDown).Row
        Nguon = .Range("B11", "R" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    ReDim ketqua(1 To Dong, 1 To 15)
    
    For i = 1 To Dong
      If Nguon(i, 11) = "vuongdd1" Then       'Ktra lay nhung vat tu DVSD
            k = k + 1
            ketqua(k, 1) = k
            ketqua(k, 2) = Nguon(i, 1)
            ketqua(k, 4) = 1
            ketqua(k, 6) = Nguon(i, 14)          'Ten VTTB
            ketqua(k, 7) = Nguon(i, 4)          'Ma VT
            ketqua(k, 8) = Nguon(i, 6)          'So luong nghiem thu
            ketqua(k, 9) = Nguon(i, 4)          'Don gia

      End If
    Next i


    Sheets("Giaoviec_vuongdd1").Select
    With Sheets("Giaoviec_vuongdd1")
       LastRow = Sheets("Giaoviec_vuongdd1").Cells(Rows.Count, "P").End(xlUp).Row

       If LastRow > 18 Then
          .Rows("18:" & LastRow - 1).Delete Shift:=xlShiftUp
       Else
          .Range("A18:K" & LastRow).ClearContents
       End If

      .Range("A18:A" & 18 + k - 1).EntireRow.Insert

      .Range("A18").Resize(k, 15).Value = ketqua

      .Range("C18:F" & 18 + k - 1).WrapText = 1
      .Range("C18:F" & 18 + k - 1).HorizontalAlignment = xlJustify
      .Range("A18:M" & 18 + k - 1).Font.Bold = False
      .Range("A18").Resize(k, 15).Borders.LineStyle = 1
      .Range("H18:J" & 18 + k + 1).NumberFormat = "#,##0.00"
      .Range("J" & 18 + k + 1).Formula = "=SUBTOTAL(9,J18:J" & 18 + k & ")"
      'Can chinh
      .Rows("18:" & LastRow - 1 & "").RowHeight = 35
      .Rows("" & LastRow & ":" & LastRow + 4 & "").RowHeight = 23
      .PageSetup.PrintArea = "$A$1:$M" & LastRow + 4 & ""
      
    End With
End Sub
Bài đã được tự động gộp:

Em viết code bước 1 trên test thử 1 người nhưng đang báo lỗi dòng
.Range("A18").Resize(k, 15).Value = ketqua
Các anh xem giúp em với ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Mã:
Option Explicit
Option Private Module
Sub Run_BB_2B()

    Dim i, k, ar, ketqua
    Dim Nguon, Dong
    Dim LastRow
   
    Dim MaCT, MaDT, BBBG, NgayBG, DiaBan

    With Sheets("GV-KTHT")
        Dong = .Range("O17").End(xlDown).Row
        Nguon = .Range("B11", "R" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    ReDim ketqua(1 To Dong, 1 To 15)
   
    For i = 1 To Dong
      If Nguon(i, 11) = "vuongdd1" Then       'Ktra lay nhung vat tu DVSD
            k = k + 1
            ketqua(k, 1) = k
            ketqua(k, 2) = Nguon(i, 1)
            ketqua(k, 4) = 1
            ketqua(k, 6) = Nguon(i, 14)          'Ten VTTB
            ketqua(k, 7) = Nguon(i, 4)          'Ma VT
            ketqua(k, 8) = Nguon(i, 6)          'So luong nghiem thu
            ketqua(k, 9) = Nguon(i, 4)          'Don gia

      End If
    Next i


    Sheets("Giaoviec_vuongdd1").Select
    With Sheets("Giaoviec_vuongdd1")
       LastRow = Sheets("Giaoviec_vuongdd1").Cells(Rows.Count, "P").End(xlUp).Row

       If LastRow > 18 Then
          .Rows("18:" & LastRow - 1).Delete Shift:=xlShiftUp
       Else
          .Range("A18:K" & LastRow).ClearContents
       End If

      .Range("A18:A" & 18 + k - 1).EntireRow.Insert

      .Range("A18").Resize(k, 15).Value = ketqua

      .Range("C18:F" & 18 + k - 1).WrapText = 1
      .Range("C18:F" & 18 + k - 1).HorizontalAlignment = xlJustify
      .Range("A18:M" & 18 + k - 1).Font.Bold = False
      .Range("A18").Resize(k, 15).Borders.LineStyle = 1
      .Range("H18:J" & 18 + k + 1).NumberFormat = "#,##0.00"
      .Range("J" & 18 + k + 1).Formula = "=SUBTOTAL(9,J18:J" & 18 + k & ")"
      'Can chinh
      .Rows("18:" & LastRow - 1 & "").RowHeight = 35
      .Rows("" & LastRow & ":" & LastRow + 4 & "").RowHeight = 23
      .PageSetup.PrintArea = "$A$1:$M" & LastRow + 4 & ""
     
    End With
End Sub
Bài đã được tự động gộp:

Em viết code bước 1 trên test thử 1 người nhưng đang báo lỗi dòng
.Range("A18").Resize(k, 15).Value = ketqua
Các anh xem giúp em với ạ
Bạn thử sửa thành thế này xem dòng này của bạn còn lỗi không
If K <> 0 then .Range("A18").Resize(k, 15).Value = ketqua
 
Upvote 0
Không lỗi nhưng không ra kết quả. Hic (@$%@
 
Upvote 0
Không lỗi nhưng không ra kết quả. Hic (@$%@
Chỗ phần dữ liệu bạn sửa thành thế này xem
Mã:
   With Sheets("GV-KTHT")
       Dong = Range("B" & Rows.Count).End(xlUp).Row
        Nguon = .Range("B17:R" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With
 
Upvote 0
Chỗ phần dữ liệu bạn sửa thành thế này xem
Mã:
   With Sheets("GV-KTHT")
       Dong = Range("B" & Rows.Count).End(xlUp).Row
        Nguon = .Range("B17:R" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With
Không được bạn ơi
 
Upvote 0
Thanks bạn nhiều!
Mình muốn lấy cái tiêu đề của công việc nhân viên đó luôn được không bạn
Bước 2 tách theo từng nhân viên ra từng Sheet riêng mà cái này em ko biết làm nữa mong anh chị giúp với ạ
 

File đính kèm

  • Tieu de.PNG
    Tieu de.PNG
    15.6 KB · Đọc: 25
Upvote 0
Kính mong các anh giúp em với ạ
Em có thêm đoạn Code phân chia Sheet được rồi, tuy nhiên chạy không đúng kết quả như mong muốn ạ
Mã:
Option Explicit
'Option Private Module
Sub Run_BB_2B()

    Dim i, k, ar, ketqua
    Dim Nguon, Dong
    Dim LastRow
    Dim ws1 As Worksheet
    Dim wsNew As Worksheet
    Dim g As Range
    Set ws1 = Sheets("GV-KTHT")

    With ws1
        Dong = .Range("B" & .Rows.Count).End(xlUp).Row
        Nguon = .Range("B17:R" & Dong)                          'Cot cuoi cung tai Sheet Input_TB
        Dong = UBound(Nguon)
    End With

    'Tim Du lieu
    For Each g In Sheets("TH KI").Range("C8:C20")
        'Tieu chí trích loc
'        Nguon(i, 11).Value = _
            "=""="" & " & Chr(34) & g.Value & Chr(34) 'c.Value & Chr(34)
        'Tao sheet moi
'        End

        'Láy du lieu vào các sheet
    ReDim ketqua(1 To Dong, 1 To 15)

    For i = 1 To Dong
      If Nguon(i, 11) = g.Value Then       'Ktra lay nhung vat tu DVSD
            k = k + 1
            ketqua(k, 1) = k
            ketqua(k, 2) = Nguon(i, 1)
            ketqua(k, 4) = 1
            ketqua(k, 6) = Nguon(i, 14)          'Ten VTTB
            ketqua(k, 7) = Nguon(i, 4)          'Ma VT
            ketqua(k, 8) = Nguon(i, 6)          'So luong nghiem thu
            ketqua(k, 9) = Nguon(i, 4)          'Don gia

      End If
    Next i
        Set wsNew = Sheets.Add
        wsNew.Move After:=Worksheets(Worksheets.Count)

        'dat ten cho sheet moi
        wsNew.Name = "Giaoviec" & g.Value
    With wsNew
       LastRow = wsNew.Cells(Rows.Count, "P").End(xlUp).Row

       If LastRow > 18 Then
          .Rows("18:" & LastRow - 1).Delete Shift:=xlShiftUp
       Else
          .Range("A18:K" & LastRow).ClearContents
       End If

      .Range("A18:A" & 18 + k - 1).EntireRow.Insert
        If k Then
          .Range("A18").Resize(k, 15).Value = ketqua
    
          .Range("C18:F" & 18 + k - 1).WrapText = 1
          .Range("C18:F" & 18 + k - 1).HorizontalAlignment = xlJustify
          .Range("A18:M" & 18 + k - 1).Font.Bold = False
          .Range("A18").Resize(k, 15).Borders.LineStyle = 1
          .Range("H18:J" & 18 + k + 1).NumberFormat = "#,##0.00"
          .Range("J" & 18 + k + 1).Formula = "=SUBTOTAL(9,J18:J" & 18 + k & ")"
          'Can chinh
'          .Rows("18:" & LastRow - 1 & "").RowHeight = 35
          .Rows("" & LastRow & ":" & LastRow + 4 & "").RowHeight = 23
          .PageSetup.PrintArea = "$A$1:$O" & LastRow + 7 & ""
        End If
    End With

    Next


End Sub
 

File đính kèm

  • Help_Giao viec (1).xlsm
    142.2 KB · Đọc: 8
Upvote 0
Các anh chị ơi xem giúp em với. Em mò tới mò lui không biết sao các Sheet sau khi tách không lấy được dữ liệu ra trang trắng không ạ
 
Upvote 0
Các anh chị ơi xem giúp em đoạn Code với ạ, nó ra kết quả nhưng không ở tại dòng thứ A18 của từng Sheet mà nó chạy thứ tự lung tung hết cả, em không rõ sắp xếp code thế nào chạy cho đúng ý nữa
 
Upvote 0
Các anh chị ơi xem giúp em với. Em mò tới mò lui không biết sao các Sheet sau khi tách không lấy được dữ liệu ra trang trắng không ạ
Em đưa File với 2 sheet có kết quả cần tách để anh xem có cách nào khác không.
 
Upvote 0
Upvote 0
Em bé đùng khóc, diễn đàn ngập lụt rồi
Mã:
Option Explicit

Sub xyz()
  Dim aTHKI(), aGV(), Res(), Dic As Object
  Dim Rng As Range, RngFormat As Range
  Dim sRow&, i&, r&, k&, ik&, Mail$, tmp
  Dim stt&, tR1&, tR2&, fR1&, fR2&, bTd1 As Boolean, bTd2 As Boolean
 
  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  For i = Sheets.Count To 1 Step -1
    If Left(Sheets(i).Name, 9) = "Giaoviec_" Then Sheets(i).Delete
  Next i
  With Sheets("Mau Giao viec")
    Set Rng = .Range("A20:O25")
    Set RngFormat = .Range("A18:O18")
  End With
  With Sheets("GV-KTHT")
    aGV = .Range("A17:P" & .Range("C" & .Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("TH KI")
    aTHKI = .Range("C8:M" & .Range("D" & .Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTHKI)
  For i = 1 To sRow
    If aTHKI(i, 1) <> Empty Then Dic.Item(aTHKI(i, 1)) = i
  Next i
  sRow = UBound(aGV)
  For i = 1 To sRow
    tmp = aGV(i, 1)
    If tmp <> Empty And tmp <> "+" Then
        If IsNumeric(tmp) Then tR2 = i Else tR1 = i
    End If
    Mail = aGV(i, 12)
    If Mail <> Empty Then
      If Dic.exists(Mail & "#") = False Then
        Dic.Add Mail & "#", ""
        stt = 0: fR2 = tR2: bTd2 = True: fR1 = tR1: bTd1 = True
        ReDim Res(1 To sRow, 1 To 15)
        k = 0
        For r = i To sRow
          tmp = aGV(r, 1)
          If tmp <> Empty And tmp <> "+" Then
            If IsNumeric(tmp) Then
              fR2 = r: bTd2 = True
            Else
              stt = 0: fR1 = r: bTd1 = True
            End If
          End If
          If aGV(r, 12) = Mail Then
            If bTd1 = True Then
              k = k + 1:                bTd1 = False
              Res(k, 1) = aGV(fR1, 1):  Res(k, 2) = aGV(fR1, 2)
            End If
            If bTd2 = True Then
              k = k + 1:                bTd2 = False
              stt = stt + 1: Res(k, 1) = stt
              Res(k, 2) = aGV(fR2, 2)
            End If
            k = k + 1
            Res(k, 2) = aGV(r, 2)
            Res(k, 5) = aGV(r, 15)
            Res(k, 6) = aGV(r, 5)
            Res(k, 8) = aGV(r, 6)
          End If
        Next r
        Sheets("Mau Giao viec").Copy After:=Sheets(Sheets.Count)
        With Sheets(Sheets.Count)
          .Name = "Giaoviec_" & Mail
          .Range("A20:O25").Clear
          ik = Dic.Item(Mail)
          If ik > 0 Then
            .Range("C5") = aTHKI(ik, 2):          .Range("C6") = Mail
            .Range("C7") = aTHKI(ik, 3):          .Range("C9") = aTHKI(ik, 4)
          End If
          If k Then
            .Range("A18").Resize(k, 15) = Res
          End If
          Rng.Copy .Range("A" & 18 + k)
          RngFormat.Copy
          If k > 3 Then .Range("A" & 20).Resize(k - 2, 15).PasteSpecial (xlPasteFormats)
        End With
      End If
    End If
  Next i
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub
 

File đính kèm

  • Help_Giao viec.xlsm
    123.2 KB · Đọc: 19
Upvote 0
Cái này dùng Vlookup và Sumprodut là được mà
Bài đã được tự động gộp:


If IsNumeric(tmp) Then tR2 = i Else tR1 = i
Đoạn này cần chú ý anh nhé. ẩu tả quá
Trước đó còn
If tmp <> Empty And tmp <> "+" Then
If IsNumeric(tmp) Then tR2 = i Else tR1 = i
Khả năng sụp hố thấp
 
Upvote 0
Em bé đùng khóc, diễn đàn ngập lụt rồi
Mã:
Option Explicit

Sub xyz()
  Dim aTHKI(), aGV(), Res(), Dic As Object
  Dim Rng As Range, RngFormat As Range
  Dim sRow&, i&, r&, k&, ik&, Mail$, tmp
  Dim stt&, tR1&, tR2&, fR1&, fR2&, bTd1 As Boolean, bTd2 As Boolean

  Application.ScreenUpdating = False
  Application.DisplayAlerts = False
  For i = Sheets.Count To 1 Step -1
    If Left(Sheets(i).Name, 9) = "Giaoviec_" Then Sheets(i).Delete
  Next i
  With Sheets("Mau Giao viec")
    Set Rng = .Range("A20:O25")
    Set RngFormat = .Range("A18:O18")
  End With
  With Sheets("GV-KTHT")
    aGV = .Range("A17:P" & .Range("C" & .Rows.Count).End(xlUp).Row).Value
  End With
  With Sheets("TH KI")
    aTHKI = .Range("C8:M" & .Range("D" & .Rows.Count).End(xlUp).Row).Value
  End With
  Set Dic = CreateObject("scripting.dictionary")
  sRow = UBound(aTHKI)
  For i = 1 To sRow
    If aTHKI(i, 1) <> Empty Then Dic.Item(aTHKI(i, 1)) = i
  Next i
  sRow = UBound(aGV)
  For i = 1 To sRow
    tmp = aGV(i, 1)
    If tmp <> Empty And tmp <> "+" Then
        If IsNumeric(tmp) Then tR2 = i Else tR1 = i
    End If
    Mail = aGV(i, 12)
    If Mail <> Empty Then
      If Dic.exists(Mail & "#") = False Then
        Dic.Add Mail & "#", ""
        stt = 0: fR2 = tR2: bTd2 = True: fR1 = tR1: bTd1 = True
        ReDim Res(1 To sRow, 1 To 15)
        k = 0
        For r = i To sRow
          tmp = aGV(r, 1)
          If tmp <> Empty And tmp <> "+" Then
            If IsNumeric(tmp) Then
              fR2 = r: bTd2 = True
            Else
              stt = 0: fR1 = r: bTd1 = True
            End If
          End If
          If aGV(r, 12) = Mail Then
            If bTd1 = True Then
              k = k + 1:                bTd1 = False
              Res(k, 1) = aGV(fR1, 1):  Res(k, 2) = aGV(fR1, 2)
            End If
            If bTd2 = True Then
              k = k + 1:                bTd2 = False
              stt = stt + 1: Res(k, 1) = stt
              Res(k, 2) = aGV(fR2, 2)
            End If
            k = k + 1
            Res(k, 2) = aGV(r, 2)
            Res(k, 5) = aGV(r, 15)
            Res(k, 6) = aGV(r, 5)
            Res(k, 8) = aGV(r, 6)
          End If
        Next r
        Sheets("Mau Giao viec").Copy After:=Sheets(Sheets.Count)
        With Sheets(Sheets.Count)
          .Name = "Giaoviec_" & Mail
          .Range("A20:O25").Clear
          ik = Dic.Item(Mail)
          If ik > 0 Then
            .Range("C5") = aTHKI(ik, 2):          .Range("C6") = Mail
            .Range("C7") = aTHKI(ik, 3):          .Range("C9") = aTHKI(ik, 4)
          End If
          If k Then
            .Range("A18").Resize(k, 15) = Res
          End If
          Rng.Copy .Range("A" & 18 + k)
          RngFormat.Copy
          If k > 3 Then .Range("A" & 20).Resize(k - 2, 15).PasteSpecial (xlPasteFormats)
        End With
      End If
    End If
  Next i
  Application.DisplayAlerts = True
  Application.ScreenUpdating = True
End Sub
Dạ em cám ơn anh nhiều ạ
Bài đã được tự động gộp:

Trước đó còn
If tmp <> Empty And tmp <> "+" Then
If IsNumeric(tmp) Then tR2 = i Else tR1 = i
Khả năng sụp hố thấp
Em gà lắm nền các anh nói kỹ giúp em với, trình độ code và debug còn kém lắm ạ
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT
Back
Top Bottom