Trích lọc dữ liệu theo tên vật tư và theo tháng không dùng cột phụ (1 người xem)

Liên hệ QC

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

Phanhanhdai

Thành viên tiêu biểu
Tham gia
16/3/08
Bài viết
733
Được thích
1,876
Nghề nghiệp
Thiết kế công trình
Em có mảng bên trái thể hiện dữ liệu đầu vào. Em muốn bên phải sẽ tự động trích lọc theo Tên vật tư và tháng (Theo 2 điều kiện). Em nghĩ mãi mà không làm được. Các bác có cách gì giúp em với. Em cảm ơn các bác nhiều.
 

File đính kèm

Em có mảng bên trái thể hiện dữ liệu đầu vào. Em muốn bên phải sẽ tự động trích lọc theo Tên vật tư và tháng (Theo 2 điều kiện). Em nghĩ mãi mà không làm được. Các bác có cách gì giúp em với. Em cảm ơn các bác nhiều.

Bạn dùng hàm Vlookup trong excel ý. Đơn giản thôi mà. Chúc thành công /*+
 

File đính kèm

Lần chỉnh sửa cuối:
Lại Sumproduct thôi
Fill xuống !
Trích lọc chứ có phải tính toán không đâu!
Công thức cũng dể! Giới thiệu bạn cách dùng VBA nhé!
Chú ý: Dạng bài toán này có rất nhiều trên diển đàn rồi, nếu dử liệu của bạn nhiều thì nên sort cột NGAY THANG trước và dùng name động sẽ cho tốc độ cực nhanh
Xem file
 

File đính kèm

Cám ơn bác. Em đã dùng VBA nhưng máy của em mọi nguời hay diệt Virut (vì máy dùng chung) nên đôi khi hay bị mất dữ liệu. Bác có cách nào mà sử dụng Name được không ah? Em xin cảm ơn nhiều
 
Cám ơn bác. Em đã dùng VBA nhưng máy của em mọi nguời hay diệt Virut (vì máy dùng chung) nên đôi khi hay bị mất dữ liệu. Bác có cách nào mà sử dụng Name được không ah? Em xin cảm ơn nhiều
Tất nhiên là được! Tôi làm cho bạn bằng cách đơn giãn nhất, từ từ bạn hãy nghiên cứu thêm nhé!
Cách đang làm không phải là hoàn hảo nhất nhưng khá ngắn gọn! (càng hoàn hảo công thức càng dài)
 

File đính kèm

Cám ơn bác. Em đã dùng VBA nhưng máy của em mọi nguời hay diệt Virut (vì máy dùng chung) nên đôi khi hay bị mất dữ liệu. Bác có cách nào mà sử dụng Name được không ah? Em xin cảm ơn nhiều

Gửi bạn một cách khác.
BẠn xem file đính lèm nha
 

File đính kèm

Gửi bạn file mình làm, cách củ chuối, cách của anh hoangdanh282vn cao siêu quá. Em không tài nào hiểu được. Em phải cố gắng đuổi kịp các anh.
 

File đính kèm

Theo mình Cách của NDU vẫn hay hơn của Hoangdanh & toanho, Có nhất thiết phải gán macro không nhỉ?
 
Em chưa hiểu cách của Bác NDU có điểm gì chưa hoàn hảo. Các bác có thể chỉ ra trường hợp nào thì nó không đúng được không?
 
Gửi các bạn một cách làm khác bằng VBA :
PHP:
Option Explicit
Private Sub Worksheet_Change(ByVal Target As Range)
Dim r1, r2, r3, i As Long
Dim rng As Range
r1 = [A65536].End(xlUp).Row
If Not Intersect(Range("H1:J1"), Target) Is Nothing Then
    Range("A3:C" & r1).Copy
    [G3].PasteSpecial Paste:=xlPasteValues
    For i = 3 To r1
        Set rng = Range(Cells(i, 7), Cells(i, 10))
        If Cells(i, 7) <> Cells(1, 8).Value Or Month(Cells(i, 8)) <> Cells(1, 10).Value Then
        rng.ClearContents
        End If
    Next
    r2 = [I65536].End(xlUp).Row
        Range("G3:I" & r2).Sort Key1:=[G3], Order1:=xlAscending
    r3 = [I65536].End(xlUp).Row
        Cells(r3 + 1, 9).Value = Application.WorksheetFunction.Sum(Range(Cells(3, 9), Cells(r3, 9)))
        Cells(r3 + 1, 7).Value = "Tong Cong"
    [H1].Select
End If
End Sub
 

File đính kèm

Lần chỉnh sửa cuối:
Theo mình Cách của NDU vẫn hay hơn của Hoangdanh & toanho, Có nhất thiết phải gán macro không nhỉ?

Quả thiệt là file mình có để quên một em SUB nho nhỏ, nhưng nó không có liên quan gì đến công thức hay cách tính toán bạn à. CÔng thức mình làm là thuần mảng.
To PHanhanhdai : Chưa hoàn hảo là vì file mình hay còn có file khác hay hơn đó bạn à. Bác ấy khiêm tốn một tí thôi.
 
Bạn hoangdanh282vn xem lại nha! Code đặt gì mà kỳ lạ thế: Worksheet_Change sao đặt trong Module?
 
Lần chỉnh sửa cuối:
@To Hoangdanh :
Anh xem qua file đính kèm thấy vài ý nhỏ em xem sao :
1/ Em khai báo biến chưa hợp lý :
ví dụ : Dim Rng1, Rng2 As Range
Dim r1, r2, r3 As Long

Như vậy Rng1 nó không hiểu là Range đâu và r1, r2 nó cũng không hiểu là Long đâu mà nó sẽ hiểu là Var (tốn bộ nhớ à nha). Nên khai báo rõ ràng từng cái một :
Dim Rng1 as Range, Rng2 As Range
Dim r1 As Long, r2 As Long, r3 As Long
Và nếu là biến đối tượng thì trước khi thoát cũng nên giải phóng nó cho nhẹ bộ nhớ. Ví dụ :
Set Rng1 = Nothing
2/ Dùng Worksheet_Change thì nên kết hợp với EnableEvents
Application.EnableEvents = False
........................
........................
Application.EnableEvents = True
Thân!
TDN
 
@To Hoangdanh :
Anh xem qua file đính kèm thấy vài ý nhỏ em xem sao :


1/ Em khai báo biến chưa hợp lý :
ví dụ : Dim Rng1, Rng2 As Range
Dim r1, r2, r3 As Long
Như vậy Rng1 nó không hiểu là Range đâu và r1, r2 nó cũng không hiểu là Long đâu mà nó sẽ hiểu là Var (tốn bộ nhớ à nha). Nên khai báo rõ ràng từng cái một :​
Dim Rng1 as Range, Rng2 As Range
Dim r1 As Long, r2 As Long, r3 As Long
Mới biết vụ này lần đâu! Cứ nghĩ là người ta "gộp" lại rồi Dim 1 lần cho gọn! Nào ngờ...



@2/ Dùng Worksheet_Change thì nên kết hợp với EnableEvents
Application.EnableEvents = False​
........................​
........................​
Application.EnableEvents = True​
Thân!
TDN
Tại sao phải cần đến Application.EnableEvents nhỉ? Trong code đã có câu lệnh Intersect(Range("H1:J1"), Target) rồi mà
Tôi thường xài đến Application.EnableEvents khi ta áp đặt kết quả vào chính Target... Thầy Phước có thể giãi thích thêm vụ này dc ko?
Mến
ANH TUẤN
 
Lần chỉnh sửa cuối:
Sẵn đây cho em hỏi thêm tí.
Em thêm vào ScreenUpdating và đầu và cuối Sub thì màn hình lại nhấp nháy nhiều hơn khi không có mà không biết vì sao. Trong trường hợp này nếu thêm vào thì code sẽ chạy nhanh hơn không ạ. Tương tự đối với EnableEvents
- Nếu ta Set một vùng mới bằng với 2 vùng nào đó thì khi tính toán, mức độ ưu tiên khi tính toán đối với 2 vùng này như thế nào ạ ( VD khi tìm kiếm hay so sánh thì sẽ ưu tiên tính toán đối với vùng nào trước.
 
Tại sao phải cần đến Application.EnableEvents nhỉ? Trong code đã có câu lệnh Intersect(Range("H1:J1"), Target) rồi mà
Tôi thường xài đến Application.EnableEvents khi ta áp đặt kết quả vào chính Target... Thầy Phước có thể giãi thích thêm vụ này dc ko?
Mến
ANH TUẤN
Vì sự kiện Worksheet_Change sẽ thực hiện khi có sự thay đổi trên bảng tính, vì thế đôi khi vô tình ta buộc nó chạy nhiều lần không cần thiết. Vì vậy mình ngăn không cho nó thực hiện trong quá trình xử lý bằng câu lệnh trên anh à. Trong nhiều trường hợp nó cải thiện tốc độ chương trình đến kinh ngạc đó (giông giống như Caculation vậy)

TDN
 
Trong nhiều trường hợp nó cải thiện tốc độ chương trình đến kinh ngạc đó (giông giống như Caculation vậy)
Cái này đồng ý!
------------------
Còn vụ này:
Vì sự kiện Worksheet_Change sẽ thực hiện khi có sự thay đổi trên bảng tính, vì thế đôi khi vô tình ta buộc nó chạy nhiều lần không cần thiết. Vì vậy mình ngăn không cho nó thực hiện trong quá trình xử lý bằng câu lệnh trên anh à.
Tôi cũng đồng ý, nhưng ý tôi muốn nói trong file cụ thể của Hoangdanh282vn thì ko thể có chuyện "vô tình" dc... vì đã có điều kiện If Not Intersect(....) đặt ở đầu rồi, chỉ khi Target nằm trong vùng đ/k thì code mới làm việc cơ mà... Tôi nghĩ đại khái thế, ko biết có sai ko?
 
Tôi cũng đồng ý, nhưng ý tôi muốn nói trong file cụ thể của Hoangdanh282vn thì ko thể có chuyện "vô tình" dc... vì đã có điều kiện If Not Intersect(....) đặt ở đầu rồi, chỉ khi Target nằm trong vùng đ/k thì code mới làm việc cơ mà... Tôi nghĩ đại khái thế, ko biết có sai ko?

Mặc dù đã có rồi, nhưng nó vẫn phải chạy Sub Worksheet_Change sau đó là phải xét đến điều kiện IF

Như vậy nếu có sự thay đổi nhiều thì việc lặp đi lặp lại này cũng làm chậm đi chương trình nhiều.

Thân!
 
Cái này đồng ý!
------------------
Còn vụ này:

Tôi cũng đồng ý, nhưng ý tôi muốn nói trong file cụ thể của Hoangdanh282vn thì ko thể có chuyện "vô tình" dc... vì đã có điều kiện If Not Intersect(....) đặt ở đầu rồi, chỉ khi Target nằm trong vùng đ/k thì code mới làm việc cơ mà... Tôi nghĩ đại khái thế, ko biết có sai ko?
Nếu IF thoả thì tiếp theo chương trình sẽ được thực hiện và khi đó mọi sự thay đổi trên sheet cũng đều tác động tới Worksheet_Chage cả anh à.

TDN
 

File đính kèm

Bác
có thể làm như file của em đính kèm để đầu ra liên kết với đầu vào chứ không phải là một text để khỏi chạy lại macro được không?
Bạn sửa đoạn này:
If Not Intersect(Range("H1:J1"), Target) Is Nothing Then
Thành vầy:
If Not Intersect(Union(Range("A3:C1000"), Range("H1:J1")), Target) Is Nothing Then
Có điều tôi thấy code này nó chạy "cà giật" thế nào ấy!
 
Thử file này nha! (hết "cà giật")
 

File đính kèm

Các bác ứ hiểu ý em. Ý em là ta có thể làm bằng cách dùng VBA, nhưng kết quả tại cột I là công thức dưới dạng Function liên kết với dữ liệu đầu vào chứ không phải là Text trực tiếp đâu.
 
Các bác ứ hiểu ý em. Ý em là ta có thể làm bằng cách dùng VBA, nhưng kết quả tại cột I là công thức dưới dạng Function liên kết với dữ liệu đầu vào chứ không phải là Text trực tiếp đâu.
Chắc ý bạn muốn làm 1 hàm tự tạo?
Cũng dc nhưng theo tôi là không hay lắm cho trường hợp của bạn! Nên nhớ rằng khi trích ra dử liệu dạng Text như vậy thì file của bạn sẽ nhẹ nhàng hơn, dung lượng cũng nhỏ hơn!
Nếu muốn công thức thì cũng đã có file dùng công thức thường đấy! Sao bạn không dùng? Cần gì tự làm khó mình như thế
 
Cám ơn Bác đã hiểu ý em. Nhưng nếu em dùng Name để giải quyết thì công thức sẽ rất phức tạp. Nếu công công thức của em tại cột I nó rất đơn giản khi dùng VBA vì hai cột trước đã xác định. (Ví dụ như chỉ dựa vào kết quả hai cột trước rồi sau đó thêm hàm Vlookup vào cột I là tìm được). Các bác giúp em lồng công thức Vlookup vào trong VBA được không. Vì em không quen trong VBA (Em mới học).
 
Cám ơn Bác đã hiểu ý em. Nhưng nếu em dùng Name để giải quyết thì công thức sẽ rất phức tạp. Nếu công công thức của em tại cột I nó rất đơn giản khi dùng VBA vì hai cột trước đã xác định. (Ví dụ như chỉ dựa vào kết quả hai cột trước rồi sau đó thêm hàm Vlookup vào cột I là tìm được). Các bác giúp em lồng công thức Vlookup vào trong VBA được không. Vì em không quen trong VBA (Em mới học).
Vậy tôi cũng hiểu ý bạn rồi: Bạn muốn "ăn sẳn"... mang về xài luôn, tiện dụng và khỏi suy nghĩ
Tạm thời tôi cũng chưa nghĩ ra được UDF này (mặc dù thấy nó khá đơn giãn)
Tuy nhiên: "Ăn sẳn" đúng là khỏe thiệt, nhưng bất lợi ở chổ bạn sẽ chẳng bao giờ tiến bộ được! (Và GPE cũng mất hết ý nghĩa chia sẽ kiến thức)
Vài lời khó nghe, xin lổi nếu đã làm bạn phật lòng!
(Nói vậy thôi nhưng tôi sẽ lưu ý về yêu cầu của bạn và cố gắng trong khả năng của mình)
 
Cám ơn Bác. Vì em mới bước vào lập trình VBA nên trình độ còn hạn chế. Em sẽ cố gắng nghiên cứu ví dụ của các bác để sau này em có thể đóng góp nhiều hơn vì sự phát triển của Diễn đàn. Chúc các bác cuối tuần vui vẻ, hạnh phúc.
 
Các bác ứ hiểu ý em. Ý em là ta có thể làm bằng cách dùng VBA, nhưng kết quả tại cột I là công thức dưới dạng Function liên kết với dữ liệu đầu vào chứ không phải là Text trực tiếp đâu.

Dùng 1 hàm duy nhất :

Bạn thử tham khảo UDF này nhé (đặc chế theo trường hợp của bạn)
PHP:
Option Base 1
Function TongHop(MangDL As Range, HangHoa As String, Thang As Byte)
    Application.Volatile (False)
    Dim i As Long, iR As Long, m As Integer, Tim As Boolean, Ma As Range
    Dim MangTemp(1 To 10000, 3) As Variant
    If MangDL.Rows.Count = 0 Then Exit Function
    For i = 1 To MangDL.Rows.Count
        If MangDL(i, 1) = HangHoa Then
        If Thang = 0 Or Month(MangDL(i, 2)) = Thang Then
            iR = iR + 1
            MangTemp(iR, 1) = MangDL(i, 1)
            MangTemp(iR, 2) = MangDL(i, 2)
            MangTemp(iR, 3) = MangDL(i, 3)
        End If: End If
    Next
    TongHop = MangTemp
End Function

Thân!

Chú ý, đây là hàm mảng nên chọn khối xong bạn phải nhấn Ctrl + Shift + Enter

Thân!
 

File đính kèm

Tất nhiên là được! Tôi làm cho bạn bằng cách đơn giãn nhất, từ từ bạn hãy nghiên cứu thêm nhé!
Cách đang làm không phải là hoàn hảo nhất nhưng khá ngắn gọn! (càng hoàn hảo công thức càng dài)
Làm sao có chữ Tháng trong Tháng 3 vậy bạn,vui lòng chỉ giúp
 
ý bạn hỏi là chỉ gõ số 3 thôi mà nó hiện là tháng 3 ư?. Nếu đúng vậy, bạn muốn ô nào hiện như vậy thì trước tiên để chuột ở cell hiện hành hoặc bôi đen 1 vùng nếu muốn. sau đó bạn vào Fortmat/cell chọn thẻ number. Trong ô category bạn chọn custom. Trong ô Type, bạn nhấp chuột vào General rồi xóa chữ này đi. Thay bằng "Tháng" #. Sau đó ok
 
ý bạn hỏi là chỉ gõ số 3 thôi mà nó hiện là tháng 3 ư?. Nếu đúng vậy, bạn muốn ô nào hiện như vậy thì trước tiên để chuột ở cell hiện hành hoặc bôi đen 1 vùng nếu muốn. sau đó bạn vào Fortmat/cell chọn thẻ number. Trong ô category bạn chọn custom. Trong ô Type, bạn nhấp chuột vào General rồi xóa chữ này đi. Thay bằng "Tháng" #. Sau đó ok
Cảm ơn bạn đúng ý mình rồi
 
Tất nhiên là được! Tôi làm cho bạn bằng cách đơn giãn nhất, từ từ bạn hãy nghiên cứu thêm nhé!
Cách đang làm không phải là hoàn hảo nhất nhưng khá ngắn gọn! (càng hoàn hảo công thức càng dài)

Những dạng bài này nếu dùng VBA thì em đã có thể tự thao tác được rồi, nhưng em muốn nghiên cứu một chút về công thức excel để quyết định với bài toán cụ thể nên giải quyết theo cách nào tốt hơn.

Em giả sử ô I4 còn có sự lựa chọn là lọc cho toàn bộ các tháng trong năm (ứng với một loại vật tư) thì ta phải làm sao cho máy hiểu lọc tất cả phát sinh trong năm ah?
 

File đính kèm

Mình thử nhưng khi chọn Cát & chọn All không có vật tư
 

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

Back
Top Bottom