Tự động lọc dữ liệu từ sheet này sang sheet khác (1 người xem)

  • Thread starter Thread starter thunga25
  • Ngày gửi Ngày gửi

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

thunga25

Thành viên hoạt động
Tham gia
12/5/12
Bài viết
118
Được thích
8
Mình có 1 vấn đề là: trong file mình đính kèm. khi mình kích vô sheet của từng người(tên cá nhân) thì nó mới lọc dữ liệu từ sheet ALL sang sheet từng cá nhân, nhưng giờ em muốn khi mình thêm 1 dòng dữ liệu trong sheet ALL mà trùng tên với dữ liệu đã có thì nó tự động lọc luôn chứ không cần phải bấm chọn vô sheet của tên đó nữa để khi nhập vào sheet ALL thì khi sang sheet THỐNG KÊ nó đã có dữ liệu rồi.Còn hiện tại thì mình phải kích vào sheet tên của từng người rồi sang sheet THỐNG KÊ mới có dữ liệu.
Anh/chị xem file đính kèm em với ạ.
Trong đó có sheet THỐNG KÊ, là sheet thống kê từ những sheet tên cá nhân.
 

File đính kèm

Mình có 1 vấn đề là: trong file mình đính kèm. khi mình kích vô sheet của từng người(tên cá nhân) thì nó mới lọc dữ liệu từ sheet ALL sang sheet từng cá nhân, nhưng giờ em muốn khi mình thêm 1 dòng dữ liệu trong sheet ALL mà trùng tên với dữ liệu đã có thì nó tự động lọc luôn chứ không cần phải bấm chọn vô sheet của tên đó nữa để khi nhập vào sheet ALL thì khi sang sheet THỐNG KÊ nó đã có dữ liệu rồi.Còn hiện tại thì mình phải kích vào sheet tên của từng người rồi sang sheet THỐNG KÊ mới có dữ liệu.
Anh/chị xem file đính kèm em với ạ.
Trong đó có sheet THỐNG KÊ, là sheet thống kê từ những sheet tên cá nhân.

làm một buttom nhấn vào nó chạy nha,
tôi không biết ý tưởng "tự động" của bạn làm sao? chẳng lẻ mỗi lần gõ dữ liệu vào là code chạy, nếu vậy nó chạy hoài hay sao?
Mã:
Sub loc()

Dim cll As Range, shname(), k As Long, ws As Worksheet, v As Variant
With Sheet3
    .[B4].Resize(.[b10000].End(3).Row).AdvancedFilter Action:=xlFilterInPlace, Unique:=True
    For Each cll In .[B5].Resize(.[b10000].End(3).Row - 4).SpecialCells(12)
        k = k + 1
        ReDim Preserve shname(1 To k)
        shname(k) = cll.Value
        Next
    .ShowAllData
End With
For Each v In shname
On Error GoTo tiep
With Sheets(v)
    Sheet3.[A4:I4].Copy .[A4]
    Sheet3.[IV1] = .[B4]: .[IV2] = v
    Sheet3.[A4:I10000].AdvancedFilter 2, .[IV1:IV2], .[A4:I4]
End With
tiep:
Next

End Sub

à, nhớ xóa hết mấy cái worksheet_change nha
 
Upvote 0
Mình có 1 vấn đề là: trong file mình đính kèm. khi mình kích vô sheet của từng người(tên cá nhân) thì nó mới lọc dữ liệu từ sheet ALL sang sheet từng cá nhân, nhưng giờ em muốn khi mình thêm 1 dòng dữ liệu trong sheet ALL mà trùng tên với dữ liệu đã có thì nó tự động lọc luôn chứ không cần phải bấm chọn vô sheet của tên đó nữa để khi nhập vào sheet ALL thì khi sang sheet THỐNG KÊ nó đã có dữ liệu rồi.Còn hiện tại thì mình phải kích vào sheet tên của từng người rồi sang sheet THỐNG KÊ mới có dữ liệu.
Anh/chị xem file đính kèm em với ạ.
Trong đó có sheet THỐNG KÊ, là sheet thống kê từ những sheet tên cá nhân.
Hình như mình đã từng từ chối không viết nổi code cho bài này.
Nhưng thôi cũng cố gắng chút coi sao vì yêu cầu của bạn khó quá mà
Copy hết code này bỏ vào sheet THONGKE
PHP:
Private Sub Worksheet_Activate()
Dim data(), kq(1 To 65536, 1 To 3), i, k, n
With Sheets("ALL")
   data = .Range(.[B5], .[C65536].End(3)).Value
End With
With CreateObject("scripting.dictionary")
   For i = 1 To UBound(data)
      If Not .exists(data(i, 2)) Then
         k = k + 1
         .Add data(i, 2), k
         kq(k, 1) = data(i, 1)
         kq(k, 2) = data(i, 2)
         kq(k, 3) = 1
      Else
         n = .Item(data(i, 2))
         kq(n, 3) = kq(n, 3) + 1
      End If
   Next
End With
[B6].Resize(k, 3) = kq
End Sub
 
Upvote 0
làm một buttom nhấn vào nó chạy nha,
tôi không biết ý tưởng "tự động" của bạn làm sao? chẳng lẻ mỗi lần gõ dữ liệu vào là code chạy, nếu vậy nó chạy hoài hay sao?
Mình làm theo cách của bạn thì ok, Nhưng lại có vấn đề: lúc thêm 1 người mới trong danh sách của sheet ALL rồi tạo sheet của người đó thì nó không lọc được vì ô IV1 không có dữ liệu, bình thường ô IV1 phải là "TênNV"(lấy của ô B4).
Bạn xem giúp mình với.
 
Lần chỉnh sửa cuối:
Upvote 0
Hình như mình đã từng từ chối không viết nổi code cho bài này.
Nhưng thôi cũng cố gắng chút coi sao vì yêu cầu của bạn khó quá mà
Hình như anh nghĩ ý của em theo chiều hướng phức tập thì phải, em nghĩ anh hiểu là bên sheet THỐNG KÊ tự lấy tên của các sheet tên nhân viên, nhưng không phải, tên nhân viên của sheet THỐNG KÊ là mình tự nhập vào, chứ tự động lọc từ các sheet thì lỡ muốn nhập họ và tên thì lại rắc rối.
Ý em là cái ô TỔNG SỐ CÔNG VIỆC(sheet THỐNG KÊ) nó sẽ tự động lọc khi mình nhập thêm công việc của nhân viên đó ở sheet ALL,muốn vậy thì sau khi nhập dữ liệu ở sheet ALL, em phải kích đến sheet của nhân viên mới thêm công việc để nó cập nhập TỔNG SỐ CÔNG VIỆC rồi kích sang sheet THỐNG KÊ thì nó mới thống kê TỔNG SỐ CÔNG VIỆC của nhân viên đó được,em muốn không cần kích vào sheet của nhân viên mới thêm công việc, mà khi nhập xong ở sheet ALL rồi sang sheet THỐNG KÊ, thì TỔNG SỐ CÔNG VIỆC của nhân viên mới nhập đã được cập nhật rồi.(Tức là bỏ qua bước kích vào từng sheet cá nhân,lọc khi kích vào sheet THỐNG KÊ).
Anh xem có được không ạ?
 
Lần chỉnh sửa cuối:
Upvote 0
làm một buttom nhấn vào nó chạy nha,
tôi không biết ý tưởng "tự động" của bạn làm sao? chẳng lẻ mỗi lần gõ dữ liệu vào là code chạy, nếu vậy nó chạy hoài hay sao?
...
à, nhớ xóa hết mấy cái worksheet_change nha

Chủ thớt muốn sheet nó tự động cập nhật lại mỗi lần bên sheet ALL có sự thay đổi. Theo tôi, có nghĩa là dùng cái sự kiện gì đó của sheet ALL.

... giờ em muốn khi mình thêm 1 dòng dữ liệu trong sheet ALL mà trùng tên với dữ liệu đã có thì nó tự động lọc luôn chứ không cần phải bấm chọn vô sheet của tên đó nữa...

Có lẽ là chủ thớt chỉ có ý tưởng chứ chưa hề làm bao giờ cho nên không biết là làm như thế có nghĩa là bắt Exxcel phải lọc liên tục.
 
Upvote 0
không phải lọc liên lục mà khi bấm vào sheet thống kê nó sẽ lọc TỔNG SỐ CÔNG VIỆC từ sheet ALL thôi. ý mình là như vậy.
 
Upvote 0
không phải lọc liên lục mà khi bấm vào sheet thống kê nó sẽ lọc TỔNG SỐ CÔNG VIỆC từ sheet ALL thôi. ý mình là như vậy.
Bạn đã chép code trên bài #3 của quanghai1969 vào sheet Thống kê chưa vậy?
Nếu chép rồi thì khi mở sheet Thống kê là có số liệu tổng rồi còn gì, đâu cần phải kích vào các sheet Tên NV làm gì.
 
Upvote 0
Bạn đã chép code trên bài #3 của quanghai1969 vào sheet Thống kê chưa vậy?
Nếu chép rồi thì khi mở sheet Thống kê là có số liệu tổng rồi còn gì, đâu cần phải kích vào các sheet Tên NV làm gì.
của anh quanghai1969 thì tốt rồi: là tự động cập nhật tên ở sheet All sang sheet THỐNG KÊ luôn, nhưng lỡ như bên sheet THỐNG KÊ ô Tên NV muốn điền cả họ và tên thì không được, nên ô đó mình muốn tự nhập tên
 
Lần chỉnh sửa cuối:
Upvote 0
anh Quanghai1969 có thể xem cái này cho em với được không ạ?
trong cái này khi gán ô IV=B4 thì nó ko nhận, đáng lý ra khi thêm sheet mới thì ô IV= Tên NV, nhưng em làm theo cách của Let'GâuGâu thì nó ô IV bị trống nên nó ko lộc được theo tên của sheet mới nhập.
 

File đính kèm

Upvote 0
anh Quanghai1969 có thể xem cái này cho em với được không ạ?
trong cái này khi gán ô IV=B4 thì nó ko nhận, đáng lý ra khi thêm sheet mới thì ô IV= Tên NV, nhưng em làm theo cách của Let'GâuGâu thì nó ô IV bị trống nên nó ko lộc được theo tên của sheet mới nhập.

Kà kà tôi bị lộn một tí.......
bạn sửa chổ này
Mã:
With Sheets(v)
    Sheet3.[A4:I4].Copy .[A4]
   [COLOR=#ff0000] .[IV1] = Sheet3.[B4]: .[IV2] = v[/COLOR]
    Sheet3.[A4:I10000].AdvancedFilter 2, .[IV1:IV2], .[A4:I4]
End With

code này nó có cái dở là nếu bạn có 2 tên mới mà chưa tạo sheet thì nó bị lỗi, nếu rảnh thì tôi làm chọ bạn, nếu có tên mà ko có sheet thì nó copy một sheet mới, nhưng bận quá.......hehe.
 
Upvote 0
của anh quanghai1969 thì tốt rồi: là tự động cập nhật tên ở sheet All sang sheet THỐNG KÊ luôn, nhưng lỡ như bên sheet THỐNG KÊ ô Tên NV muốn điền cả họ và tên thì không được, nên ô đó mình muốn tự nhập tên

chép code sau vào This wokbook
Mã:
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal r As Range)
On Error Resume Next
Set s = Sheets("ALL").UsedRange
If sh.Name = "ALL" Then
    If r.Address = "$I$" & s.Rows.Count Then _
        s.Rows(r.Row - s.Row + 1).Copy Sheets(CStr(r(1, -6))).UsedRange. _
        Offset(Sheets(CStr(r(1, -6))).UsedRange.Rows.Count).Resize(1):
    If r.Address = "$B$" & s.Rows.Count Then _
    If Sheets(CStr(r)) Is Nothing Then MsgBox "Add a new sheet"
End If
End Sub
code này chỉ cập nhật dòng dữ liệu mới nhất
khi nhập dữ liệu cho cột cuối thì nó sẽ tự copy toàn bộ dòng vào sheet tương ứng với tên NV
nếu nhập tên NV mới (cột B) thì sẽ nhận được thông báo tạo sheet mới cho NV đó
 
Lần chỉnh sửa cuối:
Upvote 0
chép code sau vào This wokbook
..........
code này chỉ cập nhật dòng dữ liệu mới nhất
khi nhập dữ liệu cho cột cuối thì nó sẽ tự copy toàn bộ dòng vào sheet tương ứng với tên NV
nếu nhập tên NV mới (cột B) thì sẽ nhận được thông báo tạo sheet mới cho NV đó
Mình chép vào This wokbook xong rồi thêm 1 tên mới mà không thấy thông báo tạo sheet mô hêt
 
Upvote 0
Hình như anh nghĩ ý của em theo chiều hướng phức tập thì phải, em nghĩ anh hiểu là bên sheet THỐNG KÊ tự lấy tên của các sheet tên nhân viên, nhưng không phải, tên nhân viên của sheet THỐNG KÊ là mình tự nhập vào, chứ tự động lọc từ các sheet thì lỡ muốn nhập họ và tên thì lại rắc rối.
Ý em là cái ô TỔNG SỐ CÔNG VIỆC(sheet THỐNG KÊ) nó sẽ tự động lọc khi mình nhập thêm công việc của nhân viên đó ở sheet ALL,muốn vậy thì sau khi nhập dữ liệu ở sheet ALL, em phải kích đến sheet của nhân viên mới thêm công việc để nó cập nhập TỔNG SỐ CÔNG VIỆC rồi kích sang sheet THỐNG KÊ thì nó mới thống kê TỔNG SỐ CÔNG VIỆC của nhân viên đó được,em muốn không cần kích vào sheet của nhân viên mới thêm công việc, mà khi nhập xong ở sheet ALL rồi sang sheet THỐNG KÊ, thì TỔNG SỐ CÔNG VIỆC của nhân viên mới nhập đã được cập nhật rồi.(Tức là bỏ qua bước kích vào từng sheet cá nhân,lọc khi kích vào sheet THỐNG KÊ).
Anh xem có được không ạ?

Cũng nói để bạn biết sự thật tại sao mình không tiếp tục viết code cho bài ở topic kia là vì mình đã cảm nhận được cái gì đó kỳ kỳ trong cái muốn của bạn. Chứ thật ra có gì là khó khăn đâu. Chỉ khó là ý tưởng của bạn nó sao sao ý. Nếu không sao sao thì chắc mọi người đã code ra đúng yêu cầu của bạn trong 1 hoặc 2 bài viết rồi. Thôi cứ cố diễn tã hết ý đi, chắc sẽ có code như ý thôi. Mình thì hơi bận nên chắc không tham chiến được rồi. Lúc nào rảnh sẽ chạy vào ngó miếng thôi.
 
Upvote 0
Kà kà tôi bị lộn một tí.......
bạn sửa chổ này
Mã:
With Sheets(v)
    Sheet3.[A4:I4].Copy .[A4]
   [COLOR=#ff0000] .[IV1] = Sheet3.[B4]: .[IV2] = v[/COLOR]
    Sheet3.[A4:I10000].AdvancedFilter 2, .[IV1:IV2], .[A4:I4]
End With

code này nó có cái dở là nếu bạn có 2 tên mới mà chưa tạo sheet thì nó bị lỗi, nếu rảnh thì tôi làm chọ bạn, nếu có tên mà ko có sheet thì nó copy một sheet mới, nhưng bận quá.......hehe.
Được rồi Let'GâuGâu ơi, cảm ơn bạn nhiều nha.
 
Upvote 0
code trên chỉ làm việc với sheet ALL, do vậy phải gõ tên NV mới vào cột B sheet ALL thì mới có thông báo . có thể bạn phải khởi động lại excel
File của mình làm y theo lời bạn đây.không thấy đoạn code của bạn chạy khi nhập quá 2 tên mà chưa tạo sheet cho họ, không thấy thông báo tạo sheet.
 

File đính kèm

Upvote 0
File của mình làm y theo lời bạn đây.không thấy đoạn code của bạn chạy khi nhập quá 2 tên mà chưa tạo sheet cho họ, không thấy thông báo tạo sheet.
code chỉ có hiệu lực khi bạn nhập tên tại dòng cuối cùng mà thôi, hiện tại dòng cuối trong bảng tính của bạn là B15 . nếu gõ dữ liệu từ B15 trở xuống thì dòng cuối là dòng mới nhập (dòng thấp nhất chứa ít nhất 1 ô có dữ liệu) nghĩa là bạn phải nhập liệu từ dòng B15 trở xuống, theo thứ tự từ trái qua phải
nếu bạn dùng code trên thì có thể bỏ qua tất cả các đoạn code khác vì lúc này không cần thao tác lọc mà các record sẽ tự chuyển đến các sheet tương ứng
 
Upvote 0

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

Back
Top Bottom