Lấy tiêu chuẩn nhân công bằng VBA

Liên hệ QC

vulunktheky

Thành viên thường trực
Tham gia
2/3/18
Bài viết
274
Được thích
84
Giới tính
Nam
Chào anh chị và các bạn!
Mình có vấn đề cần mọi người hỗ trợ giúp đỡ VBA.
1/ Dữ liệu ở 3 sheets: Điều chỉnh/ Thực tế/ Tiêu chuẩn IE là 3 sheets có dữ liệu sẵn.
2/ Sheets "NHẬP DỮ LIỆU" là người dùng nhập tay vào.
3/ Sheets "KẾT QUẢ" là giá trị trả về cuối cùng ( MÌnh cần hỗ trợ ở sheet này)
Y/C: - Dựa vào dữ liệu (MÀU) tương ứng với MÃ CHUYỀN và NGÀY của sheets "NHẬP DỮ LIỆU" Tương ứng với MAY và THÀNH PHẨM rồi đem từng mã MÀU của MAY và THÀNH PHẨM đi so sánh với từng MÀU trong sheets "TIÊU CHUẨN IE" rồi trả về số người nhiều nhất trong các loại MÀU đưa đi so sánh với TIÊU CHUẨN IE của MAY và THÀNH PHẨM thì cột trả về sẽ là cột TIÊU CHUẨN IE (A) và số THỰC TẾ (B) sẽ lấy từ sheets "THỰC TẾ" tương ứng với MÃ CHUYỀN, MAY/THÀNH PHẨM và cộng thêm số người MAY/THÀNH PHẨM ở sheets "ĐIỀU CHỈNH" nếu có. Nếu chuyền đó tất đều là "OutSourcing" thì tiêu chuẩn IE trả vê 0, nếu có "OutSourcing" và MÀU thì vẫn so sách với TIÊU CHUẨN IE.
- cột MỤC TIÊU(ĐÔI/H) là sau khi lấy được số người tiêu chuẩn của MAY/THÀNH PHẨM thì sẽ trả về số MỤC TIÊU (ĐÔI/H) tương ứng với số người tiêu chuẩn cao nhất của MÀU của MAY/THÀNH PHẨM ở sheets "TIÊU CHUẨN IE" ở câu trên.
- CỘT( B-A): Lấy cột THỰC TẾ - cột MỤC TIÊU (ĐÔI/H) theo MAY/THÀNH PHẨM.
- Và tình tổng theo từng chuyền và tổng các chuyền.
==> Ở đây mình nhập liệu theo tuần. cảm ơn mọi người đã hỗ trợ.
 

File đính kèm

Chào anh chị và các bạn!
Mình có vấn đề cần mọi người hỗ trợ giúp đỡ VBA.
1/ Dữ liệu ở 3 sheets: Điều chỉnh/ Thực tế/ Tiêu chuẩn IE là 3 sheets có dữ liệu sẵn.
2/ Sheets "NHẬP DỮ LIỆU" là người dùng nhập tay vào.
3/ Sheets "KẾT QUẢ" là giá trị trả về cuối cùng ( MÌnh cần hỗ trợ ở sheet này)
Y/C: - Dựa vào dữ liệu (MÀU) tương ứng với MÃ CHUYỀN và NGÀY của sheets "NHẬP DỮ LIỆU" Tương ứng với MAY và THÀNH PHẨM rồi đem từng mã MÀU của MAY và THÀNH PHẨM đi so sánh với từng MÀU trong sheets "TIÊU CHUẨN IE" rồi trả về số người nhiều nhất trong các loại MÀU đưa đi so sánh với TIÊU CHUẨN IE của MAY và THÀNH PHẨM thì cột trả về sẽ là cột TIÊU CHUẨN IE (A) và số THỰC TẾ (B) sẽ lấy từ sheets "THỰC TẾ" tương ứng với MÃ CHUYỀN, MAY/THÀNH PHẨM và cộng thêm số người MAY/THÀNH PHẨM ở sheets "ĐIỀU CHỈNH" nếu có. Nếu chuyền đó tất đều là "OutSourcing" thì tiêu chuẩn IE trả vê 0, nếu có "OutSourcing" và MÀU thì vẫn so sách với TIÊU CHUẨN IE.
- cột MỤC TIÊU(ĐÔI/H) là sau khi lấy được số người tiêu chuẩn của MAY/THÀNH PHẨM thì sẽ trả về số MỤC TIÊU (ĐÔI/H) tương ứng với số người tiêu chuẩn cao nhất của MÀU của MAY/THÀNH PHẨM ở sheets "TIÊU CHUẨN IE" ở câu trên.
- CỘT( B-A): Lấy cột THỰC TẾ - cột MỤC TIÊU (ĐÔI/H) theo MAY/THÀNH PHẨM.
- Và tình tổng theo từng chuyền và tổng các chuyền.
==> Ở đây mình nhập liệu theo tuần. cảm ơn mọi người đã hỗ trợ.
Anh chị và các ban hỗ trợ vấn đề này giúp mình với.Cảm ơn
 
Upvote 0
Mô tả chỉ có bạn hiểu nên khó có người hổ trợ được,
Giải thích cách tính từ A đến Z từng ô kết quả, hy vọng có người làm được
Mình xin giải thích thêm về cách giá trị trả vê của các Ô
VD: C10: Là lấy giá trị lớn từ sheets NHẬP DỮ LIỆU tương ứng với MÀU, CHUYỀN và NGÀY
ở ô D10 thì lấy dữ liệu từ sheets "DỮ LIỆU NHẬP" tương ứng với các màu hoặc "OutSourcing" của MAY, rồi đem tất cả màu so sánh với sheet tiêu chuẩn tương ứng với MỤC TIÊU(đôi/h) theo NGÀY, CHUYỀN xem màu nào có số người nhiều nhất trong tiêu chuẩn IE thì trả về số người nhiều nhất. Nếu tất cả dữ liệu nhập của chuyền đó chỉ có "OutSourcing" thì giá trị trả về là 0 còn nếu vừa có "OUTSOURCING" thì vẫn đem đi so sánh bình thường.
- E10: là lấy số người ở cột MAY (thực tế) ở sheets thực thế tương ứng với tên chuyền
- F10 = E10-D10
- G10/H10/I10 cũng tương tự như D10/E10/F10 nhưng là của thành phẩm và cũng tương tự cho các ngày tiếp theo
 

File đính kèm

Upvote 0
Mình xin giải thích thêm về cách giá trị trả vê của các Ô
VD: C10: Là lấy giá trị lớn từ sheets NHẬP DỮ LIỆU tương ứng với MÀU, CHUYỀN và NGÀY
ở ô D10 thì lấy dữ liệu từ sheets "DỮ LIỆU NHẬP" tương ứng với các màu hoặc "OutSourcing" của MAY, rồi đem tất cả màu so sánh với sheet tiêu chuẩn tương ứng với MỤC TIÊU(đôi/h) theo NGÀY, CHUYỀN xem màu nào có số người nhiều nhất trong tiêu chuẩn IE thì trả về số người nhiều nhất. Nếu tất cả dữ liệu nhập của chuyền đó chỉ có "OutSourcing" thì giá trị trả về là 0 còn nếu vừa có "OUTSOURCING" thì vẫn đem đi so sánh bình thường.
- E10: là lấy số người ở cột MAY (thực tế) ở sheets thực thế tương ứng với tên chuyền
- F10 = E10-D10
- G10/H10/I10 cũng tương tự như D10/E10/F10 nhưng là của thành phẩm và cũng tương tự cho các ngày tiếp theo
Kết quả khác với vị dụ
Mã:
Sub TongHop()
  Dim NhapDL(), tcIE(), ThucTe(), Chuyen(), S, Res(), Dic As Object
  Dim i&, j&, iR&, iR2&, jC&, sRow&, sCol&, iKey$
  Dim iMax, mMax, tMax
  With Sheet3 'Sheet Nhap Du Lieu
    i = .Range("B" & Rows.Count).End(xlUp).Row
    j = .Cells(3, 16000).End(xlToLeft).Column
    NhapDL = .Range("B2", .Cells(.Range("B" & Rows.Count).End(xlUp).Row, .Cells(3, 16000).End(xlToLeft).Column)).Value
    sCol = UBound(NhapDL, 2)
  End With
  With Sheet1 'Sheet Tieu Chuan IE
    tcIE = .Range("A2:F" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheet2 'Sheet Thuc Te
    ThucTe = .Range("A4:E" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheet5 'Sheet Ket Qua
    Chuyen = .Range("B5", .Range("B" & Rows.Count).End(xlUp)).Value
    ReDim Res(1 To UBound(Chuyen), 1 To sCol - 1)
  End With
 
  Set Dic = CreateObject("scripting.dictionary")
  Call AddDic(Dic, NhapDL, 4, "#N")
  Call AddDic(Dic, ThucTe, 1, "#T")
  Call AddDic(Dic, tcIE, 1, "#E")
 
  sRow = UBound(Chuyen, 1)
  For i = 3 To sRow
    iKey = Chuyen(i, 1) & "#N"
    If Dic.exists(iKey) Then
      S = Split(Dic.Item(iKey), ",")
      For j = 2 To sCol - 2 Step 7
        jC = (j \ 7) * 3 + 2
        iMax = 0
        For n = 1 To UBound(S)
          iR = CLng(S(n))
          tmp = NhapDL(iR, jC)
          If iMax < tmp Then iMax = tmp
        Next n
        
        iKey = Chuyen(i, 1) & "#T"
        If Dic.exists(iKey) Then
          iR = CLng(Split(Dic.Item(iKey), ",")(1))
          Res(i, j + 1) = ThucTe(iR, 3)
          Res(i, j + 4) = ThucTe(iR, 5) 'Thanh Pham
        End If
        
        If iMax > 0 Then '******
        Res(i, j - 1) = iMax 'Muc Tieu
        For n = 1 To UBound(S)
          iR = CLng(S(n))
          'If NhapDL(iR, jC) = Res(i, j) Then
            iKey = NhapDL(iR, jC + 1) & "#E" 'Tieu Chuan IE "May"
            If Dic.exists(iKey) Then
              S2 = Split(Dic.Item(iKey), ",")
              mMax = 0
              For n2 = 1 To UBound(S2)
                iR2 = CLng(S2(n2))
                If tcIE(iR2, 4) = iMax Then
                  tmp = tcIE(iR2, 5)
                  If mMax < tmp Then mMax = tmp
                End If
              Next n2
            End If
            
            iKey = NhapDL(iR, jC + 2) & "#E" 'Tieu Chuan IE "Thanh Pham"
            If Dic.exists(iKey) Then
              S2 = Split(Dic.Item(iKey), ",")
              tMax = 0
              For n2 = 1 To UBound(S2)
                iR2 = CLng(S2(n2))
                If tcIE(iR2, 4) = iMax Then
                  tmp = tcIE(iR2, 6)
                  If tMax < tmp Then tMax = tmp
                End If
              Next n2
            End If
          'End If
        Next n
        Res(i, j) = mMax  'Tieu Chuan IE "May"
        Res(i, j + 2) = Res(i, j + 1) - Res(i, j)
        
        Res(i, j + 3) = tMax 'Tieu Chuan IE "Thanh Pham"
        Res(i, j + 5) = Res(i, j + 4) - Res(i, j + 3)
        End If '*****
      Next j
    End If
  Next i
  With Sheet5 'Sheet Ket Qua
    .Range("C5").Resize(UBound(Res), UBound(Res, 2)) = Res
  End With
End Sub
Private Sub AddDic(Dic, Arr, ByVal fRow&, ByVal iStr$)
  Dim i&, sRow&, iKey$
  sRow = UBound(Arr, 1)
  For i = fRow To sRow
    If Len(Arr(i, 1)) Then
      iKey = Arr(i, 1) & iStr
      Dic.Item(iKey) = Dic.Item(iKey) & "," & i
    End If
  Next i
End Sub
 
Upvote 0
Kết quả khác với vị dụ
Mã:
Sub TongHop()
  Dim NhapDL(), tcIE(), ThucTe(), Chuyen(), S, Res(), Dic As Object
  Dim i&, j&, iR&, iR2&, jC&, sRow&, sCol&, iKey$
  Dim iMax, mMax, tMax
  With Sheet3 'Sheet Nhap Du Lieu
    i = .Range("B" & Rows.Count).End(xlUp).Row
    j = .Cells(3, 16000).End(xlToLeft).Column
    NhapDL = .Range("B2", .Cells(.Range("B" & Rows.Count).End(xlUp).Row, .Cells(3, 16000).End(xlToLeft).Column)).Value
    sCol = UBound(NhapDL, 2)
  End With
  With Sheet1 'Sheet Tieu Chuan IE
    tcIE = .Range("A2:F" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheet2 'Sheet Thuc Te
    ThucTe = .Range("A4:E" & .Range("A" & Rows.Count).End(xlUp).Row).Value
  End With
  With Sheet5 'Sheet Ket Qua
    Chuyen = .Range("B5", .Range("B" & Rows.Count).End(xlUp)).Value
    ReDim Res(1 To UBound(Chuyen), 1 To sCol - 1)
  End With

  Set Dic = CreateObject("scripting.dictionary")
  Call AddDic(Dic, NhapDL, 4, "#N")
  Call AddDic(Dic, ThucTe, 1, "#T")
  Call AddDic(Dic, tcIE, 1, "#E")

  sRow = UBound(Chuyen, 1)
  For i = 3 To sRow
    iKey = Chuyen(i, 1) & "#N"
    If Dic.exists(iKey) Then
      S = Split(Dic.Item(iKey), ",")
      For j = 2 To sCol - 2 Step 7
        jC = (j \ 7) * 3 + 2
        iMax = 0
        For n = 1 To UBound(S)
          iR = CLng(S(n))
          tmp = NhapDL(iR, jC)
          If iMax < tmp Then iMax = tmp
        Next n
      
        iKey = Chuyen(i, 1) & "#T"
        If Dic.exists(iKey) Then
          iR = CLng(Split(Dic.Item(iKey), ",")(1))
          Res(i, j + 1) = ThucTe(iR, 3)
          Res(i, j + 4) = ThucTe(iR, 5) 'Thanh Pham
        End If
      
        If iMax > 0 Then '******
        Res(i, j - 1) = iMax 'Muc Tieu
        For n = 1 To UBound(S)
          iR = CLng(S(n))
          'If NhapDL(iR, jC) = Res(i, j) Then
            iKey = NhapDL(iR, jC + 1) & "#E" 'Tieu Chuan IE "May"
            If Dic.exists(iKey) Then
              S2 = Split(Dic.Item(iKey), ",")
              mMax = 0
              For n2 = 1 To UBound(S2)
                iR2 = CLng(S2(n2))
                If tcIE(iR2, 4) = iMax Then
                  tmp = tcIE(iR2, 5)
                  If mMax < tmp Then mMax = tmp
                End If
              Next n2
            End If
          
            iKey = NhapDL(iR, jC + 2) & "#E" 'Tieu Chuan IE "Thanh Pham"
            If Dic.exists(iKey) Then
              S2 = Split(Dic.Item(iKey), ",")
              tMax = 0
              For n2 = 1 To UBound(S2)
                iR2 = CLng(S2(n2))
                If tcIE(iR2, 4) = iMax Then
                  tmp = tcIE(iR2, 6)
                  If tMax < tmp Then tMax = tmp
                End If
              Next n2
            End If
          'End If
        Next n
        Res(i, j) = mMax  'Tieu Chuan IE "May"
        Res(i, j + 2) = Res(i, j + 1) - Res(i, j)
      
        Res(i, j + 3) = tMax 'Tieu Chuan IE "Thanh Pham"
        Res(i, j + 5) = Res(i, j + 4) - Res(i, j + 3)
        End If '*****
      Next j
    End If
  Next i
  With Sheet5 'Sheet Ket Qua
    .Range("C5").Resize(UBound(Res), UBound(Res, 2)) = Res
  End With
End Sub
Private Sub AddDic(Dic, Arr, ByVal fRow&, ByVal iStr$)
  Dim i&, sRow&, iKey$
  sRow = UBound(Arr, 1)
  For i = fRow To sRow
    If Len(Arr(i, 1)) Then
      iKey = Arr(i, 1) & iStr
      Dic.Item(iKey) = Dic.Item(iKey) & "," & i
    End If
  Next i
End Sub
Hi anh. Sao chỉ chạy tới cột EZ vậy anh. Mà không chạy tới cột NB vay anh, Và không tự tính tổng các dòng tổng hả anh? Cảm ơn anh.
223776
 
Upvote 0
vâng anh, e se kiêm tra lại
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom