2016-10-08 20 views
5

Tôi đã có bảng tính sau đây của Google:Làm thế nào để tìm ra tế bào đầu tiên trong một hàng nơi giá trị là không có sản phẩm nào và kiểm tra xem số lượng ít hoặc bằng số lượng trong tế bào khác

item have ready need1 need2 need3 
A  1     2  1 
B  1   2  1  1 
C  2     2  

vv

tôi muốn điền ready cột như sau:

  • tìm cột đầu tiên trong need1, ..., needN dao động trong đó có một giá trị không trống
  • nếu giá trị được tìm thấy nhỏ hơn hoặc bằng giá trị trong cột have, hãy đặt ready cột thành thứ gì đó vui vẻ (ví dụ: yes)
  • nếu giá trị tìm thấy là lớn hơn giá trị trong have cột, không làm bất cứ điều gì

Vì vậy, trên đầu vào, khi chế biến sẽ trông như thế này:

item have ready need1 need2 need3 
A  1     2  1 
B  1   2  1  1 
C  2 yes   2  

Đối với người đầu tiên bước tôi tìm thấy một giải pháp được đề xuất, không phù hợp với tôi:

=INDEX(SORT(FILTER(D10:H10 , LEN(D10:H10)) , 
FILTER(COLUMN(D10:H10) , LEN(D10:H10)) , 0) , 1) 

(trả về #REF!) N ot chắc chắn có gì sai với nó hoặc làm thế nào để tiến hành bước tiếp theo.

Cảm ơn trước!

Trả lời

2

Nếu bạn biết bạn cần bao nhiêu cột hoặc thậm chí chỉ có bao nhiêu cột trên trang tính, điều này khá đơn giản. Nếu không và bạn cần phải xem xét toàn bộ hàng, bạn có thể phải thiết kế lại một chút để tránh tham chiếu vòng tròn từ ô có công thức là một phần của hàng đó.

Hai bước thứ hai của bạn khá đơn giản theo cách - bạn muốn một trong hai kết quả dựa trên điều kiện, vì vậy bạn sẽ muốn sử dụng =IF. Tình trạng của bạn là số 'cần' nhỏ hơn hoặc bằng số 'có', và bạn muốn nó nói 'có' nếu đó là sự thật, và không có gì nếu nó không phải là. Vì vậy, cung cấp cho chúng tôi:

=IF(need<=have,"Yes","") 

Các ví dụ dưới đây giả định bảng của bạn ở trên bắt đầu từ ô A1 ở phía trên bên trái, và cột cuối cùng trong bảng của bạn là Z

Tiếp theo chúng ta cần phải tìm 'cần' và 'có'. Tìm 'có' khá dễ dàng - chỉ là số trong cột B.

Tìm 'nhu cầu' hơi phức tạp hơn một chút. Bạn đã có ý tưởng đúng bằng cách sử dụng INDEXFILTER, nhưng công thức của bạn có vẻ hơi phức tạp một chút. Về cơ bản, chúng tôi có thể sử dụng FILTER để lọc ra các giá trị trống và INDEX để tìm giá trị đầu tiên còn lại. Đầu tiên, FILTER:

Phạm vi bạn muốn lọc là mọi thứ trong cùng một hàng từ cột D đến cột Z (hoặc bất kỳ cột cuối cùng nào) và điều kiện bạn muốn lọc là những ô giống nhau không để trống.Đối với công thức bạn đang gõ vào ô C2, cung cấp cho chúng tôi:

=FILTER(D2:Z2,D2:Z2<>"") 

Tiếp theo, INDEX: Nếu bạn cung cấp cho INDEX một mảng, một số hàng, và một số cột, nó sẽ cho bạn biết những gì đang có ô nơi hàng và cột đó gặp nhau. Như chúng tôi đã lọc ra những khoảng trống, chúng tôi chỉ muốn bất cứ điều gì còn lại trong cột đầu tiên của mảng lọc của chúng tôi, mà cho chúng ta:

=INDEX(FILTER(D2:Z2,D2:Z2<>""),1,1) 

Hoặc, như chúng ta chỉ có một dòng trong mảng của chúng tôi, và INDEX là khá thông minh, chỉ cần:

=INDEX(FILTER(D2:Z2,D2:Z2<>""),1) 

vì vậy, để mang lại cho nó tất cả cùng nhau, công thức thức của chúng tôi cho ô C2 là:

=IF(=INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes","") 

Sau đó, bạn chỉ cần kéo công thức xuống cho càng nhiều hàng như bạn nhu cầu. Nếu trang tính của bạn trở nên rộng hơn, chỉ cần thay đổi Z thành cột cuối cùng của bạn.

1

Khi bạn không biết kích thước của dải ô, hãy sử dụng các hàm row, column, rows, columns.


công thức đơn giản

Dưới đây là một ví dụ về những gì bạn đang tìm kiếm:

=if(INDEX(FILTER(OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1),OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)<>""),1)<=B2,"yes","") 

này một phần của công thức:

  • OFFSET(D2,,,1,COLUMNS(1:1)-column(D2)+1)

trả về phạm vi xuất phát từ tế bào nhất định (D2) đến hết tấm (COLUMNS(1:1)-column(D2)+1)


ArrayFormula

tôi đề nghị sử dụng ArrayFormula, nó sẽ mở rộng tự động:

=ARRAYFORMULA(if(REGEXEXTRACT(SUBSTITUTE(trim(transpose(query(transpose(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)),,COLUMNS(OFFSET(D2,,,COUNTA(A2:A),COLUMNS(1:1)-column(D2)+1)))))," ",", "),"\d+")*1<=OFFSET(B2,,,COUNTA(A2:A)),"yes","")) 

Giả định cột 'Mục' không có giá trị trống.

1

Giải pháp từ @Max Makhrov hoạt động và có lợi thế khi sử dụng một công thức cho toàn bộ cột. Tuy nhiên, nó giả định rằng tất cả các cột của bạn ở bên phải từ cột ready (D) của bạn sẽ là các cột need_.

Giải pháp từ @dmusgrave cũng hoạt động, miễn là bạn xóa thêm "=" trước INDEX: =IF(INDEX(FILTER(D2:Z2,D2:Z2<>""),1)<=B2,"Yes",""). Tuy nhiên, nó làm cho cùng một giả định, và cũng giới hạn tại cột Z.

giả định như vậy có vẻ hợp lý, nhưng nếu họ đang hạn chế bạn, dưới đây là cách bạn có thể có bất kỳ số lượng need_ cột bắt đầu từ bên phải của cột ready của bạn:

=IF(INDEX(FILTER(INDIRECT("D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&row()), INDIRECT("D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1,4)="need")))&row())<>""),1)<=B2,"Yes","")

Ý tưởng đơn giản để thay thế D2:Z2 (là trong dung dịch @ dmusgrave của) bằng cách:

INDIRECT("D"&ROW()&":"&CHAR(67+COLUMNS(FILTER($1:$1,LEFT($1:$1, 4)="need")))&row())

Explanati trên: Bạn bắt đầu từ D tại hàng hiện tại và bạn đi đến cột need_ cuối cùng trên cùng hàng hiện tại. CHAR(68)D, mà bạn thêm số cột có tiêu đề need.*, trừ một (do đó là 67).

Sử dụng cùng một logic, bạn có thể dễ dàng thực hiện công thức của bạn mạnh mẽ hơn/chung chung, chẳng hạn như không có need_ cột bắt đầu ngay hình cột ready vv

Các vấn đề liên quan