Chuyên mục xử lý, gỡ rối code VBA (2 người xem)

Liên hệ QC

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

Status
Không mở trả lời sau này.

ndu96081631

Huyền thoại GPE
Thành viên BQT
Super Moderator
Tham gia
5/6/08
Bài viết
30,703
Được thích
53,957
Dạ em chào các anh chị,

Em có một bài toán chọn mẫu có điều kiện, muốn sử dụng code VBA để tự động giải quyết, nhưng chưa có nhiều kinh nghiệm.
nhờ anh chị định hướng giúp em với ạ.
1. Dữ liệu đầu vào
- Một sheet data nguồn "Data reference" có sẵn dùng để lấy thông tin
- Một bảng mã hàng bất kì sheet "Data cần lọc"
2. Dữ liệu đầu ra
- Chọn 10% mã hàng có trong list
Trong đó:
+ 7% rơi vào các mã hàng có tỉ lệ lỗi cao nhất
+ 3% rơi vào các mã hàng có tỉ lệ bốc mẫu cao nhất
+ mã hàng 7% và 3% ko trùng nhau
3. Bài toán ví dụ:
Data cần lọc có 40 mã hàng
=> chọn ra 4 mã hàng, trong đó
+ 3 mã hàng có tỉ lệ lỗi cao nhất (75%)
+ 1 mã hàng có tỉ lệ bốc mẫu cao nhất (25%)
4. Trợ giúp
Em muốn nhờ các bác chỉ giúp em macro làm tự động phần này với ạ.
Về concept là như vậy nhưng em vừa mới mò về VBA nên nhờ các anh chị định hướng giúp em về cách làm với ạ!


Em cám ơn mọi người rất nhiều!
 

File đính kèm

Upvote 0
Về concept là như vậy nhưng em vừa mới mò về VBA nên nhờ các anh chị định hướng giúp em về cách làm với ạ!

Còn xếp với còn xẹp!

Nếu còn xẹp chú ô lỳ cỏ rách thì phải dùng Excel 2016. Dùng Pivot Table và nối hai bảng với nhau qua key mã hàng. Lúc đó muốn lấy ra phần trăm gì tuỳ thích.
 
Upvote 0
Hi mọi người,

Em không rành lắm về VBA, nhờ mọi người hỗ trợ giùm em trường hợp này:

Em sẽ tạo 1 usseform và nội dung usedform này sẽ là giá trị của ô A2:E2 .
Em muốn viết code để lưu dữ liệu các ô này vào 1 file mới tên là filetong , và mỗi khi bấm save sẽ lưu tiếp tục xuống các dòng tiếp theo.
Nếu dữ liệu ô B2 đã tồn tại trong filetong thì sẽ save đè nội dung A2:E2 vào file filetong luôn .

Mọi người vui lòng giúp đỡ giùm em đoạn code này với !!!
 

File đính kèm

Upvote 0
Em có một chút vấn đề về code, trong file em đính kèm (cả ảnh lẫn file rar). Nhờ mọi người và các thầy chỉnh giúp:
1. Khắc phục tình trạng thời gian khi chạy về 00:00 không bị trễ giây khi kết hợp với âm thanh báo hiệu ạ.
2. Khi ở thời gian nghỉ giữa hiệp, khi về đến 00:10 (tức còn 10s) thì âm thanh báo hiệu sẽ kêu ạ.
Cảm ơn ạ!
 

File đính kèm

  • BTD.rar
    BTD.rar
    429.3 KB · Đọc: 22
  • Untitled.jpg
    Untitled.jpg
    128 KB · Đọc: 5
Upvote 0
Nhờ mọi người bớt chút thời gian gỡ rối vấn đề em nêu ở trên với ạ.
 
Upvote 0
Anh Bate ơi xem lại giúp em hình như có sự nhầm lẫn. Ví dụ ID 136457 ở nghỉ lẻ phần phép là 0.7 nhưng code không thấy cộng cái đó. Lý do vì cột ID có thể lặp lại, còn các loại nghỉ thì phải riêng rẽ không được cộng lẫn nhau.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
PHP:
With Sheets("N")
R = .Range("AL60000").End(xlUp).Row
If R > 4 Then
    sArr = .Range("AL4:AL" & R).Resize(, 16).Value
    ReDim tArr(1 To UBound(sArr), 1 To 16)
        For i = 2 To UBound(sArr)
            If Not Dic.Exists(sArr(i, 1)) Then
                k = k + 1
                Dic.Item(sArr(i, 1)) = k
                tArr(k, 1) = sArr(i, 1)
            End If
            For j = 6 To 16
                If sArr(1, j) = "P" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "NC" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "N" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "BH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "CN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "M7" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "TM" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "KH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "SP" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "DN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "LT" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                End If
             
            Next j
        Next i
     
    End If
    .Range("AM13").Resize(k, 6) = tArr
End With

Em viết lại ở phần đầu của module GPE, Sub Bate đã liệt kê được ID và các loại nghỉ riêng rẽ. Nhưng ở phần dưới chỗ code

PHP:
'Ngay nghi....................................................................
            If sArr(i, j) = "LT" Then
                dArr(k, 6) = dArr(k, 6) + 1
                    If Dic.Exists(sArr(i, 4)) Then dArr(k, 6) = dArr(k, 6) + tArr(Dic.Item(sArr(i, 1)), 16)
vẫn không thấy nó cộng, không biết sai ở đâu mong mọi người chỉ giúp. số 16 số thứ tự của cột LT.
 
Lần chỉnh sửa cuối:
Upvote 0
Em giả lập một file lên đây, anh chị tạo giúp em sử dụng Dic như thế nào để ra kết quả như vùng đổ màu vàng ở sheet KQ nhé. Em cảm ơn ạ!
 

File đính kèm

Upvote 0
PHP:
With Sheets("N")
R = .Range("AL60000").End(xlUp).Row
If R > 4 Then
    sArr = .Range("AL4:AL" & R).Resize(, 16).Value
    ReDim tArr(1 To UBound(sArr), 1 To 16)
        For i = 2 To UBound(sArr)
            If Not Dic.Exists(sArr(i, 1)) Then
                k = k + 1
                Dic.Item(sArr(i, 1)) = k
                tArr(k, 1) = sArr(i, 1)
            End If
            For j = 6 To 16
                If sArr(1, j) = "P" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "NC" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "N" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "BH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "CN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "M7" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "TM" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "KH" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "SP" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "DN" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                ElseIf sArr(1, j) = "LT" Then
                    tArr(Dic.Item(sArr(i, 1)), j) = tArr(Dic.Item(sArr(i, 1)), j) + sArr(i, j)
                End If
           
            Next j
        Next i
   
    End If
    .Range("AM13").Resize(k, 6) = tArr
End With

Em viết lại ở phần đầu của module GPE, Sub Bate đã liệt kê được ID và các loại nghỉ riêng rẽ. Nhưng ở phần dưới chỗ code

PHP:
'Ngay nghi....................................................................
            If sArr(i, j) = "LT" Then
                dArr(k, 6) = dArr(k, 6) + 1
                    If Dic.Exists(sArr(i, 4)) Then dArr(k, 6) = dArr(k, 6) + tArr(Dic.Item(sArr(i, 1)), 16)
vẫn không thấy nó cộng, không biết sai ở đâu mong mọi người chỉ giúp. số 16 số thứ tự của cột LT.
Bạn đưa 1 file hồi "Chí Phèo ở truồng" rồi hỏi, ai mà biết file của bạn làm gì,.
Cột nào lấy từ đâu, cộng với cột nào lấy từ đâu?
Đọc lại từng dòng code để hiểu nó làm gì thì thà viết mới còn "sướng" hơn.
Bạn kiểm tra lại file này xem sao, nếu không đúng thì giải thích lại từ đầu, viết lại từ đầu.
Em giả lập một file lên đây, anh chị tạo giúp em sử dụng Dic như thế nào để ra kết quả như vùng đổ màu vàng ở sheet KQ nhé. Em cảm ơn ạ!
File "giả lập" của bạn mà áp dụng được vào file thật thì là "Siêu" luôn.
 

File đính kèm

Upvote 0
Bạn đưa 1 file hồi "Chí Phèo ở truồng" rồi hỏi, ai mà biết file của bạn làm gì,.
Cột nào lấy từ đâu, cộng với cột nào lấy từ đâu?
Đọc lại từng dòng code để hiểu nó làm gì thì thà viết mới còn "sướng" hơn.
Bạn kiểm tra lại file này xem sao, nếu không đúng thì giải thích lại từ đầu, viết lại từ đầu.

File "giả lập" của bạn mà áp dụng được vào file thật thì là "Siêu" luôn.
PHP:
 If Dic.Exists(sArr(I, 4)) Then
            Rws = Dic.Item(sArr(I, 4))
            For J = 6 To 9
                If tArr(Rws, J) > 0 Then dArr(K, J) = tArr(Rws, J)
            Next J
            For J = 7 To 16
                If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J)
            Next J
        End If

Vâng gần đúng rồi anh ơi.
Anh ơi đặt trường hợp các Selecct case cũng có kết quả thì sao ạ? Ví dụ ở Select Case P ra kết quả là 1 (bằng cách thử điền P vào cột K8) như vậy thì kết quả em cần là 1.7. Em thử viết lại là. Vì ở sheet nghỉ lẻ chỉ là nghỉ nửa buổi hay gì đó cần cộng thêm vào, còn cái chính trong sheet BCC nếu nghỉ nguyên ngày ví dụ Phép thì em điền P. Cái này Select case của anh đã tính đến. Nhưng nó không cộng tổng cùng với nghỉ lẻ mà nếu nghỉ lẻ thì sẽ chỉ lấy của nghỉ lẻ bỏ qua cái select case đã tính kia.
If tArr(Rws, J) > 0 Then dArr(K, J) =dArr(K, J)+ tArr(Rws, J) thì có đúng không?

Nếu đúng thì chỗ code:
If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J) em phải sửa tiếp như nào ạ??.
 
Lần chỉnh sửa cuối:
Upvote 0
PHP:
 If Dic.Exists(sArr(I, 4)) Then
            Rws = Dic.Item(sArr(I, 4))
            For J = 6 To 9
                If tArr(Rws, J) > 0 Then dArr(K, J) = tArr(Rws, J)
            Next J
            For J = 7 To 16
                If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J)
            Next J
        End If

Vâng gần đúng rồi anh ơi.
Anh ơi đặt trường hợp các Selecct case cũng có kết quả thì sao ạ? Ví dụ ở Select Case P ra kết quả là 1 (bằng cách thử điền P vào cột K8) như vậy thì kết quả em cần là 1.7. Em thử viết lại là. Vì ở sheet nghỉ lẻ chỉ là nghỉ nửa buổi hay gì đó cần cộng thêm vào, còn cái chính trong sheet BCC nếu nghỉ nguyên ngày ví dụ Phép thì em điền P. Cái này Select case của anh đã tính đến. Nhưng nó không cộng tổng cùng với nghỉ lẻ mà nếu nghỉ lẻ thì sẽ chỉ lấy của nghỉ lẻ bỏ qua cái select case đã tính kia.
If tArr(Rws, J) > 0 Then dArr(K, J) =dArr(K, J)+ tArr(Rws, J) thì có đúng không?

Nếu đúng thì chỗ code:
If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J) em phải sửa tiếp như nào ạ??.
Hổng biết luôn. Code cũ chạy ra kết quả cột nào, thế nào? Bbây giờ muốn cột nào có kết quả thế nào?,
Đã nói là chuyện của bạn chỉ bạn hiểu, người không trong ngành viết xong là "xóa bộ nhớ" luôn rồi.
 
Upvote 0
Vâng em mô tả lại nhé. Tại Sheet BCC có các ngày nghỉ (P, BH, KH...)ở các cột có tiêu đề WD. Với phần select case em thấy các ngày nghỉ này đã được cộng và cho ra kết quả bắt đầu từ cột EK đến EW của sheet BCC. Tuy nhiên có một số trường hợp họ nghỉ lẻ, Ví dụ em giả lập bạn có ID 136457 ở sheet N cột P
em ghi 0.7 nghĩ là bạn đó nghỉ 0.7 P. Như vậy em muốn ngoài cái P đã tính được ở sheet BCC thì cộng thêm cái lẻ này nữa anh ạ.

Ngoài ra em phân tích code của anh như này xem có đúng không anh nhé:
PHP:
        If Dic.Exists(sArr(I, 4)) Then 'Neu ton tai key sArr(I,4) thi
            Rws = Dic.Item(sArr(I, 4))  'Gan sArr(I,4) thanh Item
            For J = 6 To 9 'Xet cot tu 6 den 9 tuong duong cot EK den EO cua sheet BCC
                If tArr(Rws, J) > 0 Then dArr(K, J) = tArr(Rws, J)
            Next J
            For J = 7 To 16 'Xet cot tu 7 den 16--> cai nay em khong hieu em tuong tu 11 den 17?
                If tArr(Rws, J) > 0 Then dArr(K, J + 1) = tArr(Rws, J) 'Vu J+1 em cung khong hieu tai sao?
            Next J
        End If
 
Lần chỉnh sửa cuối:
Upvote 0
Hix, huhu ... Chỉnh giúp em với các anh ơi...!!
 
Upvote 0
Vâng em mô tả lại nhé. Tại Sheet BCC có các ngày nghỉ (P, BH, KH...)ở các cột có tiêu đề WD. Với phần select case em thấy các ngày nghỉ này đã được cộng và cho ra kết quả bắt đầu từ cột EK đến EW của sheet BCC. Tuy nhiên có một số trường hợp họ nghỉ lẻ, Ví dụ em giả lập bạn có ID 136457 ở sheet N cột P
em ghi 0.7 nghĩ là bạn đó nghỉ 0.7 P. Như vậy em muốn ngoài cái P đã tính được ở sheet BCC thì cộng thêm cái lẻ này nữa anh ạ.
Có vẻ "hơi bị hiểu chút chút"
Bạn kiểm tra lại file này
 
Upvote 0
Hi đúng rồi anh ạ nhưng em chưa hiểu cái vụ xét J từ 7 đến 16, và vụ J+1 anh giải thích cho em hiểu với nhé.
Hình như có nhầm lẫn ở bài trên, tôi xóa file đính kèm,, bạn xem lại flle này:
Số cột trong Code tôi có ghi nháp bên trên mỗi bảng.
Từ cột 6-9, 2 bảng giống nhau.
Từ cột 10-16 bảng này lại là 11-17 bảng kia. Bạn tự hiểu.
 

File đính kèm

Lần chỉnh sửa cuối:
Upvote 0
Hình như có nhầm lẫn ở bài trên, tôi xóa file đính kèm,, bạn xem lại flle này:
Số cột trong Code tôi có ghi nháp bên trên mỗi bảng.
Từ cột 6-9, 2 bảng giống nhau.
Từ cột 10-16 bảng này lại là 11-17 bảng kia. Bạn tự hiểu.

À, có phải cái xét từ 6 đến 9 và 10 đến 16 là xét cái cột bên sheet N đúng không anh. Và anh + thêm 1 là vì bên BCC bị ngăn cách cột tổng nên phải +1 để nhảy qua cột đó.
 
Upvote 0
Status
Không mở trả lời sau này.
Web KT

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

Back
Top Bottom