Hỏi về cách nhận biết dữ liệu đã được nhập từ các sheet trước (2 người xem)

Liên hệ QC

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

nggiahoang

Thành viên hoạt động
Tham gia
18/5/13
Bài viết
167
Được thích
108
Hỏi về cách nhận biết dữ liệu đã được nhập từ các sheet trước

Nhờ anh chị giúp cho em việc sau : Trong file em có 5 sheet có cấu trúc giống nhau ; từ sheet 1 đến sheet 4 dữ liệu đã được nhập theo 3 cột C, D, E trong 1 danh sách khoảng 50 em , những em nào đã nhập đầy đủ 3 cột sẽ được tô màu theo dòng ở 2 cột A và B .

Giờ em muốn tại sheet 5 sẽ nhập dữ liệu cho những em còn lại để đủ 100% mà không bị trùng với những em đã nhập xong từ trước ( từ sheet 1 đến sheet 4).

Cám ơn anh chị đã vào xem và làm giùm em bằng công thức, code hoặc bằng ….!
 

File đính kèm

Hỏi về cách nhận biết dữ liệu đã được nhập từ các sheet trước

Nhờ anh chị giúp cho em việc sau : Trong file em có 5 sheet có cấu trúc giống nhau ; từ sheet 1 đến sheet 4 dữ liệu đã được nhập theo 3 cột C, D, E trong 1 danh sách khoảng 50 em , những em nào đã nhập đầy đủ 3 cột sẽ được tô màu theo dòng ở 2 cột A và B .

Giờ em muốn tại sheet 5 sẽ nhập dữ liệu cho những em còn lại để đủ 100% mà không bị trùng với những em đã nhập xong từ trước ( từ sheet 1 đến sheet 4).

Cám ơn anh chị đã vào xem và làm giùm em bằng công thức, code hoặc bằng ….!

thử vậy xem
Mã:
G5=SUMPRODUCT(COUNTIFS(INDIRECT("Sheet"&ROW($1:$4)&"!$B$5:$B$53"),B5,INDIRECT("Sheet"&ROW($1:$4)&"!$f$5:$f$53"),3))

kéo xuống sẻ biết chú đã có tên chưa
 
Nó xuất hiện chữ #NAME? Ạ .nhờ bạn sửa giúp công thức trên.

bạn xài 2003?

vậy chạy code thử
Mã:
Sub sumifs2003()
Dim arr, ws5 As Variant, i, j As Long, ws As Worksheet, d As Object
Set d = CreateObject("scripting.dictionary")
ws5 = [b5:f53].Value

For Each ws In Worksheets
If ws.Index > 4 Then Exit For
With ws
arr = .[b5:f53].Value
    For i = 1 To UBound(arr)
        If Not d.Exists(arr(i, 1)) And arr(i, 5) = 3 Then
            d.Add arr(i, 1), ""
        End If
    Next
End With
Next

For j = 1 To UBound(ws5)
    If d.Exists(ws5(j, 1)) Then ws5(j, 5) = 1
Next

[b5:f53].Value = ws5
Set d = Nothing
End Sub
 
Cám ơn bạn Let"GauGau đã nhiệt tình hỗ trợ , đoạn code trên sẽ test và báo lại cho bạn vào sáng mai vì giờ đang ngồi trên tiệm nét mà tiệm thì kg cài office nên đã tải offce 2003 dạng nhỏ gọn , để tạm thời đọc file mà thôi ; vào cho hiệu lực chạy macro thì các nút bị ẩn mất tiêu.( đúng rồi máy nhà chỉ xài 2003 )
 
Code đã hoạt động tốt ,thử xóa tất cả các dòng nhập liệu cũ và thay những dòng mới trên mỗi sheet , chạy code cho ra kết quả chuẩn xác . Bạn cho mình hỏi thêm nếu ta đặt thêm code này tại sheet 10 thì có ra kết quả như trên không ?

Cám ơn bạn Let"GauGau !
 
Code đã hoạt động tốt ,thử xóa tất cả các dòng nhập liệu cũ và thay những dòng mới trên mỗi sheet , chạy code cho ra kết quả chuẩn xác . Bạn cho mình hỏi thêm nếu ta đặt thêm code này tại sheet 10 thì có ra kết quả như trên không ?

Cám ơn bạn Let"GauGau !

Mã:
Sub sumifs2003()
Dim arr, ws5 As Variant, i, j As Long, ws As Worksheet, d As Object
......................
[COLOR=#0000ff]ws5 = [b5:f53].Value[/COLOR]

For Each ws In Worksheets
[COLOR=#ff0000]If ws.Index > 4 Then Exit For[/COLOR]
...................................
End Sub

tôi ko hiểu ý bạn lắm.
tôi giải thích sơ qua code, bạn tùy chỉnh nha
1- phần màu xanh, là cái mảng mà bạn muốn xem có tên nào trùng với sheet trước ko. do tôi ko chỉ đinh rỏ nó ở sheet nào, vì vậy nó sẻ chọn sheet hiện hành.
vi dụ sheet hiện hành đang là sheet 5 thì nó chọn vùng [b5:f53] làm nguồn
2- phần mạp u đỏ: đó là nó lặp qua các sheet, để xem cái tên nào đả được nhập data rồi rồi nó nạp vào dictionary.
tôi chỉ giơi hạn ở 4 sheet. nếu bạn muốn làm 10 sheet thì chọn là 10 (chú ý nó là sheet index nha)
 
Cám ơn bạnLetGauGau đã giải thích cặn kẽ . Thực ra là như vầy : từ sh1 > sh5 là hết hk1 ( sh5 là sh tổng kết ) , qua sh6 >sh10 là hết hk2. code ở trên bạn giúp cho thì đã hoàn thành hk1 ; chính vì thế nên mình mới hỏi là copy đoạn code trên qua sh10 là lấy kết quả cho hk2 .Vậy thì trên file ta sẽ có đến 2 code kg biết là có xung đột lẫn nhau hay không đó mà
 
Mã:
Sub sumifs2003()
Dim arr, ws5 As Variant, i, j As Long, ws As Worksheet, d As Object
......................
[COLOR=#0000ff]ws5 = [b5:f53].Value[/COLOR]

For Each ws In Worksheets
[COLOR=#ff0000]If ws.Index > 4 Then Exit For[/COLOR]
...................................
End Sub

tôi ko hiểu ý bạn lắm.
tôi giải thích sơ qua code, bạn tùy chỉnh nha
1- phần màu xanh, là cái mảng mà bạn muốn xem có tên nào trùng với sheet trước ko. do tôi ko chỉ đinh rỏ nó ở sheet nào, vì vậy nó sẻ chọn sheet hiện hành.
vi dụ sheet hiện hành đang là sheet 5 thì nó chọn vùng [b5:f53] làm nguồn
2- phần mạp u đỏ: đó là nó lặp qua các sheet, để xem cái tên nào đả được nhập data rồi rồi nó nạp vào dictionary.
tôi chỉ giơi hạn ở 4 sheet. nếu bạn muốn làm 10 sheet thì chọn là 10 (chú ý nó là sheet index nha)

đáng để ngâm cứu đây, cho Mình coi ké
 
Ngoài cách trên của bạn Let"GauGau , ta còn có thể nhận biết bằng cách hiện màu tại sheet5 và sheet10 được không vậy các bạn ?
 
Code đã hoạt động tốt ,thử xóa tất cả các dòng nhập liệu cũ và thay những dòng mới trên mỗi sheet , chạy code cho ra kết quả chuẩn xác . Bạn cho mình hỏi thêm nếu ta đặt thêm code này tại sheet 10 thì có ra kết quả như trên không ?

Cám ơn bạn Let"GauGau !

đoạn code sau xài cho sheet 5 và sheet 10 (đặt sheet cần do), với điều kiện là các sheet có sheet index tăng từ 1 đến 10 nha
Mã:
Sub sumifs2003()
Dim arr, ws5 As Variant, i, j As Long, ws As Worksheet, d As Object
Set d = CreateObject("scripting.dictionary")
ws5 = ActiveSheet.[b5:f53].Value

For k = ActiveSheet.Index - 4 To Worksheets.Count
If k > ActiveSheet.Index - 1 Then Exit For

With Sheets(k)
    arr = .[b5:f53].Value
End With
    For i = 1 To UBound(arr)
        If Not d.Exists(arr(i, 1)) And arr(i, 5) = 3 Then
            d.Add arr(i, 1), ""
        End If
    Next
Next

For j = 1 To UBound(ws5)
    If d.Exists(ws5(j, 1)) Then ws5(j, 5) = 1
Next

ActiveSheet.[b5:f53].Value = ws5
Set d = Nothing
End Sub
 
đoạn code sau xài cho sheet 5 và sheet 10 (đặt sheet cần do), với điều kiện là các sheet có sheet index tăng từ 1 đến 10 nha
Mã:
Sub sumifs2003()
Dim arr, ws5 As Variant, i, j As Long, ws As Worksheet, d As Object
Set d = CreateObject("scripting.dictionary")
ws5 = ActiveSheet.[b5:f53].Value

For k = ActiveSheet.Index - 4 To Worksheets.Count
If k > ActiveSheet.Index - 1 Then Exit For

With Sheets(k)
    arr = .[b5:f53].Value
End With
    For i = 1 To UBound(arr)
        If Not d.Exists(arr(i, 1)) And arr(i, 5) = 3 Then
            d.Add arr(i, 1), ""
        End If
    Next
Next

For j = 1 To UBound(ws5)
    If d.Exists(ws5(j, 1)) Then ws5(j, 5) = 1
Next

ActiveSheet.[b5:f53].Value = ws5
Set d = Nothing
End Sub


Cám ơn bạn ! mình sẽ tét và báo cáo kết quả , giả như không ổn thì sẽ gởi file lên nhờ bạn giúp tiếp nhé.
 
Bạn LetGauGau ơi , không biết mình đã làm sai khâu nào mà test code thì vẫn chạy nhưng đếm bị thiếu.
Đầu tiên mở file ,xóa code cũ copy code mới vào sheet10 ; copy nút lệnh chạy code từ sheet5 sang sheet 10 .Nhập liệu thử mỗi sheet từ 1 đến 4 rồi nhần code thì kết quả hiện ra đếm lại là 11 còn sót 1 trường hợp chưa nhận biết ( chưa đủ ) , tương tự qua sheet 10 nhập liệu mỗi sheet 2 dòng từ sheet 6 đến sheet 9 ,nhấn code và đếm tổng cộng chỉ có 7 nghĩa là bị thiếu 1 trường hợp đã nhập.

Nhờ bạn xem lại giùm mình đã làm sai cái gì ?
 

File đính kèm

Bạn LetGauGau ơi , không biết mình đã làm sai khâu nào mà test code thì vẫn chạy nhưng đếm bị thiếu.
Đầu tiên mở file ,xóa code cũ copy code mới vào sheet10 ; copy nút lệnh chạy code từ sheet5 sang sheet 10 .Nhập liệu thử mỗi sheet từ 1 đến 4 rồi nhần code thì kết quả hiện ra đếm lại là 11 còn sót 1 trường hợp chưa nhận biết ( chưa đủ ) , tương tự qua sheet 10 nhập liệu mỗi sheet 2 dòng từ sheet 6 đến sheet 9 ,nhấn code và đếm tổng cộng chỉ có 7 nghĩa là bị thiếu 1 trường hợp đã nhập.

Nhờ bạn xem lại giùm mình đã làm sai cái gì ?

"Nguyễn Yến Nhi" bị duoble 2 lần ở sheet 2 và 4
vì vậy bạn đếm thì 12, nhưng thực ra thì chỉ có 11 cái tên thôi
 
Mình xóa hết tất cả dữ liệu đã nhập từ sh1 đến sh4 và từ sh6 đến sh9 , nhập lại cứ 5 em liền tù tì ,sh2 cũng 5 em .... ( kg trùng dòng ) .kết quả hoàn toàn chính xác ở cả 2 giai đoạn . Nhưng trong thực tế khi kiểm tra thì không liền lạc như vậy mà là bất kỳ như cac file trước đã gởi lên ; vậy thì sẽ gặp phải tình trạng nhập trùng 1em sẽ 2 lần trong 1 học kỳ là điều không tránh khỏi ( GV dạy 1 môn sẽ dạy nhiều lớp nên không nhớ nổi ) .Vậy có giải pháp cho việc này không hả bạn ?
 
Mỗi vấn đề luôn luôn sẽ có những giải pháp để giải quyết vấn đề. Giải pháp hay hoặc chưa hay ,hay nhiều hoặc hay ít….Trong quá trình đi tìm kết quả của bài toán “ nhận biết …” có phát sinh chuyện nhập trùng dữ liệu trong các sheet làm ảnh hưởng đến kết quả .Code trên của bạn LetGauGau đã giải quyết được “ kết quả “.
Nay nhờ các bạn giúp cho đoạn code vừa giải pháp chuyện “ nhập trùng “ đồng thời giải quyết luôn bài toán “ nhận biết “.
Cám ơn các bạn trước !
 

File đính kèm

Mình xóa hết tất cả dữ liệu đã nhập từ sh1 đến sh4 và từ sh6 đến sh9 , nhập lại cứ 5 em liền tù tì ,sh2 cũng 5 em .... ( kg trùng dòng ) .kết quả hoàn toàn chính xác ở cả 2 giai đoạn . Nhưng trong thực tế khi kiểm tra thì không liền lạc như vậy mà là bất kỳ như cac file trước đã gởi lên ; vậy thì sẽ gặp phải tình trạng nhập trùng 1em sẽ 2 lần trong 1 học kỳ là điều không tránh khỏi ( GV dạy 1 môn sẽ dạy nhiều lớp nên không nhớ nổi ) .Vậy có giải pháp cho việc này không hả bạn ?

đoạn code này giúp bạn biết những tên đã có xuất hiện ở những sheet nao
Mã:
Sub sumifs2003()
Dim arr, ws5 As Variant, tam(), i, j, k, n As Long, ws As Worksheet, d As Object
Set d = CreateObject("scripting.dictionary")
ws5 = ActiveSheet.[b5:f53].Value

For k = ActiveSheet.Index - 4 To Worksheets.Count
If k > ActiveSheet.Index - 1 Then Exit For

With Sheets(k)
    arr = .[b5:f53].Value
End With
    For i = 1 To UBound(arr)
        If arr(i, 5) = 3 Then
        If Not d.Exists(arr(i, 1)) Then
            n = n + 1
            d.Add arr(i, 1), n
            ReDim Preserve tam(1 To n)
            tam(n) = Sheets(k).Name
        Else
            tam(d.Item(arr(i, 1))) = tam(d.Item(arr(i, 1))) & ", " & Sheets(k).Name
        End If
        End If
    Next
Next

For j = 1 To UBound(ws5)
    If d.Exists(ws5(j, 1)) Then ws5(j, 5) = tam(d.Item(ws5(j, 1)))
Next

ActiveSheet.[b5:f53].Value = ws5
Set d = Nothing
End Sub
 
đoạn code này giúp bạn biết những tên đã có xuất hiện ở những sheet nao
Mã:
Sub sumifs2003()
Dim arr, ws5 As Variant, tam(), i, j, k, n As Long, ws As Worksheet, d As Object
Set d = CreateObject("scripting.dictionary")
ws5 = ActiveSheet.[b5:f53].Value

For k = ActiveSheet.Index - 4 To Worksheets.Count
If k > ActiveSheet.Index - 1 Then Exit For

With Sheets(k)
    arr = .[b5:f53].Value
End With
    For i = 1 To UBound(arr)
        If arr(i, 5) = 3 Then
        If Not d.Exists(arr(i, 1)) Then
            n = n + 1
            d.Add arr(i, 1), n
            ReDim Preserve tam(1 To n)
            tam(n) = Sheets(k).Name
        Else
            tam(d.Item(arr(i, 1))) = tam(d.Item(arr(i, 1))) & ", " & Sheets(k).Name
        End If
        End If
    Next
Next

For j = 1 To UBound(ws5)
    If d.Exists(ws5(j, 1)) Then ws5(j, 5) = tam(d.Item(ws5(j, 1)))
Next

ActiveSheet.[b5:f53].Value = ws5
Set d = Nothing
End Sub

Bạn ơi cho mình hỏi là đặt đoạn code trên vào chỗ nào để chạy được nó ( sheet ? module ? hay ....? ).Chiều tối sẽ báo cáo kết quả test , giờ sắp phải vào tiết rồi .Cám ơn bạn Let"GauGau nhé!
 
Web KT

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

Back
Top Bottom