Xin code tìm kiếm theo 2 điều kiện

Liên hệ QC

nhatchidao

Thành viên mới
Tham gia
27/5/08
Bài viết
19
Được thích
1
Chào các anh. Em mới vừa học êxcl nhưng gặp phải vấn đề hơi hóc búa. Em cần phải bổ sung vào VBA một công thức tìm kiếm giá trị min theo 2 điều kiện như file gửi kèm.

Anh chị nào rành VBA có thể viết giúp em không?
Em xin chân thành cảm ơn.

View attachment Hoi.rar
 
Chào các anh. Em mới vừa học êxcl nhưng gặp phải vấn đề hơi hóc búa. Em cần phải bổ sung vào VBA một công thức tìm kiếm giá trị min theo 2 điều kiện như file gửi kèm.

Anh chị nào rành VBA có thể viết giúp em không?
Em xin chân thành cảm ơn.

View attachment 18000

|
A​
|
B​
|
C​
|
D​
|
E​
|
F​
|
G​
|
H​
|
I​
|
J​
|
K​
|
6​
|
1​
|
FS​
||
0​
|||
0​
|
5​
|
0​
|
5​
|
79​
|
7​
|
2​
|SS|
2​
|
0​
| | |
2​
|
9​
|
2​
|
9​
|
35​
|
8​
|
3​
|FF|
2​
|
0​
| | |
6​
|
11​
|
6​
|
11​
|
37​
|
9​
|
4​
|FS| |
0​
| | |
11​
|
19​
|
11​
|
19​
|
42​
|
10​
|
5​
|FS| |
0​
| | |
19​
|
29​
|
19​
|
29​
|
50​
|
11​
|
6​
|FS| |
0​
| | |
29​
|
36​
|
29​
|
36​
|
60​
|
12​
|
9​
|SF| |
0​
| | |
29​
|
43​
|
29​
|
43​
|
70​
|
13​
|
7​
|FS|
7​
|
0​
| | |
43​
|
53​
|
43​
|
53​
|
74​
|
14​
|
7​
|FS|
7​
|| | |
43​
|
50​
|
43​
|
50​
|
77​
|
15​
|
7​
|FS|
7​
|| | |
43​
|
57​
|
43​
|
57​
|
43​
|
16​
|
11​
|FF| | | | |
43​
|
57​
|
43​
|
57​
|
70​
|
17​
|
16​
|FF| | | | |
64​
|
84​
|
64​
|
84​
|
64​
|
18​
|
11​
|FS|
0​
|
0​
| | |
57​
|
71​
|
57​
|
71​
|
57​
|
19​
|
14​
|FF| |
0​
| | |
57​
|
71​
|
57​
|
71​
|
57​
|
20​
|
15​
|FS| |
0​
| | |
71​
|
84​
|
71​
|
84​
|
71​
|
21​
|
5​
|FS|
5​
|
0​
| | |
24​
|
84​
|
24​
|
84​
|
24​
|
Theo mình tìm giá trị min của cột K khi cột BFS là ô K21 = 24 mới đúng chứ
Nếu là ô K21 = 24 thì dùng công thức
PHP:
=MIN(IF(B6:B21="FS",K6:K21)) Ctrl+Shift+Enter
 
Upvote 0
@boyxin: anh chưa xem kỹ điều kiện của em rồi. Yêu cầu tìm là min của cột K khi cột A là... và cột B là... Hai điều kiện này có thể thay đổi ở các ô khác nên cần thiết nhập cả điều kiện vào công thức.
Với điều kiện min cột K khi A là 7 và B là FS thì kết quả phải là 43.
 
Upvote 0
@boyxin: anh chưa xem kỹ điều kiện của em rồi. Yêu cầu tìm là min của cột K khi cột A là... và cột B là... Hai điều kiện này có thể thay đổi ở các ô khác nên cần thiết nhập cả điều kiện vào công thức.
Với điều kiện min cột K khi A là 7 và B là FS thì kết quả phải là 43.

Vậy thì thế này đã đúng chưa?
 

File đính kèm

Upvote 0
Dạ chắc chắn là đúng rùi.
Nhưng trong bảng tính của em đang lập thì không dùng cách này được ạ, vì em không thể tạo hết vùng điều kiện cho tất cả các công tác. Em đang tính cho tất cả các công tác chứ không phải chỉ riêng một công tác có điều kiện 7&FS.
Có cách nào để viết cái hàm có cú pháp như em xin được không ạ?
 
Upvote 0
Dạ chắc chắn là đúng rùi.
Nhưng trong bảng tính của em đang lập thì không dùng cách này được ạ, vì em không thể tạo hết vùng điều kiện cho tất cả các công tác. Em đang tính cho tất cả các công tác chứ không phải chỉ riêng một công tác có điều kiện 7&FS.
Có cách nào để viết cái hàm có cú pháp như em xin được không ạ?

Thì trong file đã gán điều kiện vào A1:B1, nếu muốn thay điều kiện khác thì chỉ việc lập công thức thay giá trị cho 2 ô này là OKIE, không phải chỉnh sửa công thức

BẠN LÀM THỬ XEM NÀO
 
Upvote 0
Thì trong file đã gán điều kiện vào A1:B1, nếu muốn thay điều kiện khác thì chỉ việc lập công thức thay giá trị cho 2 ô này là OKIE, không phải chỉnh sửa công thức

BẠN LÀM THỬ XEM NÀO

Hình như không được BOYXIN ơi,
Vùng khác / điều kiện khác nên không áp dụng
Nên chăng cần tổng quát hơn
 
Upvote 0
Dạ chắc chắn là đúng rùi.
Nhưng trong bảng tính của em đang lập thì không dùng cách này được ạ, vì em không thể tạo hết vùng điều kiện cho tất cả các công tác. Em đang tính cho tất cả các công tác chứ không phải chỉ riêng một công tác có điều kiện 7&FS.
Có cách nào để viết cái hàm có cú pháp như em xin được không ạ?
Tôi thấy dùng công thức như BoyXin dễ dùng hơn mà ngắn hơn.

Dùng UDF MinOf(VùngDK1,DK1,VùngDK2,DK2,VùngTính) thì cũng được mà dài hơn nhiều.
Bạn xem lại có cần thiết. Nếu cần dùng PP Find là OK.
 
Upvote 0
Chào các anh. Em mới vừa học êxcl nhưng gặp phải vấn đề hơi hóc búa. Em cần phải bổ sung vào VBA một công thức tìm kiếm giá trị min theo 2 điều kiện như file gửi kèm.

Anh chị nào rành VBA có thể viết giúp em không?
Em xin chân thành cảm ơn.

View attachment 18000

Bạn thử hàm này xem :
Function MinLookup(Vung As Range, Dk1 As Variant, Dk2 As Variant, ColNum As Byte) As Double
Dim Cell As Range, KQ As Double
MinLookup = 1E+15
For Each Cell In Vung.Resize(, 1)
KQ = Val(Cell.Offset(, ColNum - 1))
If Cell = Dk1 And Cell.Offset(, 1) = Dk2 And KQ < MinLookup Then MinLookup = KQ
Next
End Function
 

File đính kèm

Upvote 0
Gửi lại file

Dạ đây là file đầy đủ của em ạ.
View attachment Hoi_full.rar
cụ thể như vầy: tại ô P17 em có một công thức cần tính min của (74 trừ 7,77 trừ 7,43 trừ 7). Cả ba giá trị (74,77,43) đều thỏa điều kiện cột E là 7, cột F là FS. Do em dùng hàm vlookup2 nên nó chỉ nhận diện kết quả đầu tiên (tức là 74-7=67 như hiện giờ).

Em muốn mở rộng để nó tìm kết quả nhỏ nhất. tức là nó phải tìm được giá trị (43-7=36) mới là kết quả đúng nhất.
 
Upvote 0
Danh nên dùng Find để giảm bớt số lần for each. Mà nhanh hơn nữa.

Em cũng đã làm 1 bài về find, nhưng đối với dạng bài này thì không cần thiết, vừa dài lại vừa khó hiểu nên em xóa đi rồi.
Code trên vừa dễ hiểu lại ngắn gọn nên chắc bạn ấy dễ sử dụng hơn. Do dữ liệu không nhiều nên tốc độ cũng không giảm đi là bao.
 
Upvote 0
Em cũng đã làm 1 bài về find, nhưng đối với dạng bài này thì không cần thiết, vừa dài lại vừa khó hiểu nên em xóa đi rồi.
Code trên vừa dễ hiểu lại ngắn gọn nên chắc bạn ấy dễ sử dụng hơn. Do dữ liệu không nhiều nên tốc độ cũng không giảm đi là bao.
Cố gắng làm theo mình thấy tối ưu nhất, do ít hay nhiều dữ liệu.
Danh làm thử theo thuật giải sau thử:
- Find để tìm theo DK1
- If để tìm theo DK2
- Nếu OK thì đưa vào MyArr()
- Xét Min MyArr() là đáp án.
Anh chưa làm.
 
Upvote 0
Danh nên dùng Find để giảm bớt số lần for each. Mà nhanh hơn nữa.

Thực ra thì find cảm giác nhanh, nhưng bản chất thì FIND thì máy tính cũng phải dò tìm và so sánh đây là điều chắc chắn / họa chăng thì chỉ có Micro soft có thể ứng dụng thuật toán dò tìm nhanh hơn (đều này chưa chắc - vì tuỳ vào độ lớn của DL và DL đã sắp xếp chưa mà thuật toán ứng với nó sẽ được sử dụng)

Túm lại, thì dùng sao cho dễ hiểu và hiểu về bản chất là hay nhất a ah
 
Upvote 0
View attachment MinLookup_Hoi lai.rar

Anh xem lại giúp em kết quả ở ô R25 và S25. Sao nó ra 0 thế kia, đáng lẽ ô R25 phải là 71, ô S25 là 84 chứ.

Em có sửa code lại chút xíu thôi.
Xin cảm ơn.
 
Lần chỉnh sửa cuối:
Upvote 0
Upvote 0
Nhờ xem lại giúp code

Nhờ các anh xem lại giúp đoạn code sau:

Function MinLookup(VUNG As Range, DK1 As Variant, DK2 As Variant, ColNum As Byte) As Double
Dim Cell As Range, KQ As Double, min_value As Double
Dim vung1 As Range
Dim k As Integer
min_value = Cells(9, 3).Value
k = ActiveCell.Row
vung1 = ActiveSheet.Union(Range(Cells(11, VUNG.Column), Cells(k - 1, VUNG.Column)), Range(Cells(k + 1, VUNG.Column), Cells(11 + VUNG.Rows.Count, VUNG.Column)))
For Each Cell In vung1
If Cell = DK1 And Cell.Offset(, 1) = DK2 Then
KQ = Cell.Offset(, ColNum - 1).Value - Cell.Offset(, 2).Value
min_value = Application.WorksheetFunction.Min(KQ, min_value)
End If
MinLookup = min_value
Next
End Function

Em biến tấu code của anh Danh nhưng nó không ra kết quả mà báo value

Xin xem file gửi kèmView attachment test1.rar
 
Upvote 0
Set vung1 = Union(Range(Cells(11, VUNG.Column), Cells(k - 1, VUNG.Column)), Range(Cells(k + 1, VUNG.Column), Cells(11 + VUNG.Rows.Count, VUNG.Column)))
 
Upvote 0
em có hàm đếm theo 2 điều kiện ở trong file đính kèm có code nhu sau:
PHP:
Function countif3(VUNG As Range, DK3 As Variant, DK4 As Variant, FUNC As String, v As Byte) As Double
Dim Dem1 As Long, allactivitys As Integer, i As Integer
allactivitys = VUNG.Rows.Count
Select Case FUNC
Case "L"
Dem1 = 0
For i = 1 To allactivitys
If Cells(11 + i, VUNG.Column) = DK3 And Application.WorksheetFunction.Left(Cells(11 + i, VUNG.Column + 1), v) = DK4 Then
Dem1 = Dem1 + 1
End If
Next i
Case "R"
Dem1 = 0
For i = 1 To allactivitys
If Cells(11 + i, VUNG.Column) = DK3 And Application.WorksheetFunction.Right(Cells(11 + i, VUNG.Column + 1), v) = DK4 Then
Dem1 = Dem1 + 1
End If
Next i
End Select
countif3 = Dem1
End Function
View attachment test1.rar

Nhờ anh chị nào giúp sửa giùm. Nó không chạy mà báo value ạ.
em còn gà mờ lắm mong các anh giúp với.
Thanks

em đã chữa được rồi, nhờ mod xóa giúp bài này ạ.
 
Lần chỉnh sửa cuối:
Upvote 0
Web KT

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

Back
Top Bottom