Hàm if điều kiện mảng

Liên hệ QC
Tôi tuân thủ nội quy khi đăng bài

vova2209

Thành viên tích cực
Tham gia
5/4/17
Bài viết
828
Được thích
110
Giới tính
Nam
Nghề nghiệp
Đường bộ
Anh chị giúp em!
Chỗ phần điều kiện trong mục bôi đỏ dưới, em chuyển thành "data name" thi hàm không chạy được. Anh chị giúp em xem có cách nào tối giản công thức ko để luôn data vào công thức, mỗi lần thêm dữ liệu lại phải kéo lại công thức

Untitled.jpg
 

File đính kèm

  • Book2.xlsx
    72.3 KB · Đọc: 13
Bạn thử cách sau:
1. Dùng define name để định nghĩa ItemList
2. Dùng công thức =IF(ISNUMBER(MATCH($E8, ItemList, 0)), INDIRECT("J"&ROW()), "")
 

File đính kèm

  • Book2_ed.xlsx
    70.3 KB · Đọc: 5
Anh chị giúp em!
Chỗ phần điều kiện trong mục bôi đỏ dưới, em chuyển thành "data name" thi hàm không chạy được. Anh chị giúp em xem có cách nào tối giản công thức ko để luôn data vào công thức, mỗi lần thêm dữ liệu lại phải kéo lại công thức

View attachment 300813
Bạn dùng mảng đó làm chi cho khổ vậy? Sao không liệt kê các mục đó trong 1 cột khác, rồi dùng công thức sau:

=COUNT(1/SEARCH($S$6:$S$33,E6))*J6
(Kết thúc bằng Ctrl+Shift+Enter, fill xuống)

Không cần dùng 'name' hoặc indirect() gì cả.

Thân
Bài đã được tự động gộp:

Vầy thì đúng hơn:
=COUNTIF($S$6:$S$33,TRIM(E6))*J6
Enter

Thân
 

File đính kèm

  • Book2(chinhlai).xlsx
    81.9 KB · Đọc: 11
Lần chỉnh sửa cuối:
Tôi không hiểu cái đoạn INDIRECT("J"&ROW()), vì hàm kéo 1 phát từ trên xuống dưới thì trỏ thẳng nó vào ô cột J cùng hàng chứ mắc gì dùng Indirect() cho nặng file.
 
Bạn dùng mảng đó làm chi cho khổ vậy? Sao không liệt kê các mục đó trong 1 cột khác, rồi dùng công thức sau:

=COUNT(1/SEARCH($S$6:$S$33,E6))*J6
(Kết thúc bằng Ctrl+Shift+Enter, fill xuống)

Không cần dùng 'name' hoặc indirect() gì cả.

Thân
Bài đã được tự động gộp:

Vầy thì đúng hơn:
=COUNTIF($S$6:$S$33,TRIM(E6))*J6
Enter

Thân
vâng cảm ơn bạn.. nhiều cách hay!
Bài đã được tự động gộp:

Tôi không hiểu cái đoạn INDIRECT("J"&ROW()), vì hàm kéo 1 phát từ trên xuống dưới thì trỏ thẳng nó vào ô cột J cùng hàng chứ mắc gì dùng Indirect() cho nặng file.
Indirect() hàm này dùng nặng bảng tính hơn à bạn, file mình hay dùng nhiều hàm này. để mình đổi lại chắc cải thiện thêm tốc độ
 
vâng cảm ơn bạn.. nhiều cách hay!
Bài đã được tự động gộp:


Indirect() hàm này dùng nặng bảng tính hơn à bạn, file mình hay dùng nhiều hàm này. để mình đổi lại chắc cải thiện thêm tốc độ
Đương nhiên là nặng hơn, nhưng ko rõ cải thiện được bao nhiêu, nhưng bạn cứ hiểu đơn giản là thay vì đi thẳng đến cột J, thì Excel nó phải tính toán ra xem địa chỉ ô ở đâu rồi mới đi đến đó nếu dùng Indirect.

Có 1 cách nữa bạn cũng thử: đặt tất cả các loại vật tư bạn cần lọc vào 1 sheet, đặt cho vùng đó 1 cái name (giả sử là Danhmuc), tại sheet Chiết tính, bạn đặt hàm Q7=If(countif(Danhmuc, E7)=1;J7;0). Trânh dùng các hàm mảng ra, nó nặng file và thông thường thì ít người biết đến nó nên trong trường hợp cần share file thì người không biết sẽ khó sử dụng hoặc kiểm tra.
 
Đương nhiên là nặng hơn, nhưng ko rõ cải thiện được bao nhiêu, nhưng bạn cứ hiểu đơn giản là thay vì đi thẳng đến cột J, thì Excel nó phải tính toán ra xem địa chỉ ô ở đâu rồi mới đi đến đó nếu dùng Indirect.
...
Indirect là hàm volatile.
Có thể tác giả muốn công thức tính lại mỗi lần có thay đổi (mục đích chính của volatile).

Indirect có làm nặng công thức bao nhiêu tôi không nói tới. Tôi chỉ lưu ý là hàm volatile không nên sử dụng bừa bải, vì chúng khá nặng tính toán.
 
vâng cảm ơn bạn.. nhiều cách hay!
Bài đã được tự động gộp:


Indirect() hàm này dùng nặng bảng tính hơn à bạn, file mình hay dùng nhiều hàm này. để mình đổi lại chắc cải thiện thêm tốc độ
Indirect sử dụng chủ yếu để trỏ dứ liệu vào nhiều column hoăc nhiều sheets khác nhau hoặc từ các file khác nhau. Trong trường hợp cùng 1 cột, chỉ thay đổi số dòng thì ko cần dùng.

Hàm Indirect ko làm nặng máy (đặc biệt các máy đời mới thì bạn sẽ gần như ko nhận biết nếu sử dụng indirect cho dưới khoảng 1 triệu formula) nhưng sẽ làm khó cho người dò lại công thức.
 
Indirect có hai công dụng chính và một công dụng phụ. Những cách dùng khác là mẹo.

Công dụng chính:
1. Dùng để xác định cứng vùng dữ liệu (range,cell,...) truy cập. Khi công thức được chép sang nơi khác
=INDIRECT("'Sheet2'!a1") luôn luôn trỏ vào 'Sheet2'!a1. Bất cứ bạn dời/copy công thức hay thay đổi bảng tính thế nào, nó vẫn nhất định trỏ vào chỗ đó.
2. Có vẻ hơi ngược lại với cách dùng 1. Ở đây Indirect cho phép tính ra vùng dữ liệu cần truy cập
=INDIRECT("'Sheet" & b2 & "'!b" & c2)
Nếu b2 chứa 2 và c2 chứa 5 thì hàm trên trả về 'Sheet2'!b5

Công dụng phụ là để lập name động. Ví dụ khi vùng dữ liệu truy cập thay đổi, thêm/bớt dòng/cột thường xuyên, name động sẽ tự dãn co theo.
 
Indirect có hai công dụng chính và một công dụng phụ. Những cách dùng khác là mẹo.

Công dụng chính:
1. Dùng để xác định cứng vùng dữ liệu (range,cell,...) truy cập. Khi công thức được chép sang nơi khác
=INDIRECT("'Sheet2'!a1") luôn luôn trỏ vào 'Sheet2'!a1. Bất cứ bạn dời/copy công thức hay thay đổi bảng tính thế nào, nó vẫn nhất định trỏ vào chỗ đó.
2. Có vẻ hơi ngược lại với cách dùng 1. Ở đây Indirect cho phép tính ra vùng dữ liệu cần truy cập
=INDIRECT("'Sheet" & b2 & "'!b" & c2)
Nếu b2 chứa 2 và c2 chứa 5 thì hàm trên trả về 'Sheet2'!b5

Công dụng phụ là để lập name động. Ví dụ khi vùng dữ liệu truy cập thay đổi, thêm/bớt dòng/cột thường xuyên, name động sẽ tự dãn co theo.
Bác oi hàm INDIRECT về cú pháp khó dùng và hay quên, vậy dùng Index() có hay hơn không hở bác?

 
Indirect là hàm volatile.
Có thể tác giả muốn công thức tính lại mỗi lần có thay đổi (mục đích chính của volatile).

Indirect có làm nặng công thức bao nhiêu tôi không nói tới. Tôi chỉ lưu ý là hàm volatile không nên sử dụng bừa bải, vì chúng khá nặng tính toán.
Em thường dùng indirect() trong trường hợp tạo vùng tham chiếu cho 1 name, nó cho phép thay đổi vùng tham chiếu của name, mà name này em lại dùng vào 1 việc khác là tạo 1 List data validation. Khi đó, list xổ ra sẽ luôn vừa vặn với vùng dữ liệu.
 
Em thường dùng indirect() trong trường hợp tạo vùng tham chiếu cho 1 name, nó cho phép thay đổi vùng tham chiếu của name, mà name này em lại dùng vào 1 việc khác là tạo 1 List data validation. Khi đó, list xổ ra sẽ luôn vừa vặn với vùng dữ liệu.
Mình cũng rất không thích vụ list data validation có dòng thừa.
Bạn có thể gửi file ví dụ nào đó để mình tham khảo học hỏi không ?
 
Mình cũng rất không thích vụ list data validation có dòng thừa.
Bạn có thể gửi file ví dụ nào đó để mình tham khảo học hỏi không ?
Bạn tham khảo file này. Mấu chốt ở đây là hàm Indirect() trong Refers to của name ListData.
 

File đính kèm

  • List Data Validation.xlsx
    8.5 KB · Đọc: 8
Bác oi hàm INDIRECT về cú pháp khó dùng và hay quên, vậy dùng Index() có hay hơn không hở bác?
Nếu bạn làm được thì đúng là hay hơn, tránh cái tội volatile của Indirect.
Riêng tôi thì thấy khi cần truy cập thật phức tạp thì bọn Indirect, Offset,... dễ hơn nhiều

Ở đây (GPE) có một bạn rất hay dùng Indirect, Offset,... Bạn thử hỏi ý kiến người ấy xem.

Chú thích về volatile:
Có một số công thức cần refresh liên tục. Khi dùng chúng, người ta thường nhét thêm một hàm volatile, Hmf này chả làm gì hết, chỉ kích động công thức thôi. Điển hình là công thức tính tên của sheet.
 
Nếu chỉ có 1 sheet, 1 cột thì dùng Offset cho đỡ nhức đầu, chưa cần tới Indirect.
Bạn tham khảo file này. Mấu chốt ở đây là hàm Indirect() trong Refers to của name ListData.

1715838851606.png

Indirect dùng cho động rộng hơn: Nhiều sheet, mỗi sheet 1 vùng nhỏ dữ liệu chạy lên chạy xuống trong bảng dữ liệu lớn.
File dưới đây là 1 thí dụ: khi chọn C1 là nhiệt độ:

1715829298220.png

Khi chọn C1 là lượng mưa, và thử kéo 3 thanh trượt

1715829414545.png
 

File đính kèm

  • BieudoMua-Nhietdo-Động.xlsm
    72.5 KB · Đọc: 5
Lần chỉnh sửa cuối:
Ở đây (GPE) có một bạn rất hay dùng Indirect, Offset,... Bạn thử hỏi ý kiến người ấy xem.
Tôi không phải "người ấy" nhưng tôi cũng có ý kiến: Chỉ dùng Indirect khi cần thiết, không phải vì nhanh chậm mà là nếu đơn giản được thì cứ đơn giản.
 
Web KT
Back
Top Bottom