Một mảng để tìm ô không trống trước đó trong cột khác


7

Trong Bảng tính Google, không sử dụng Tập lệnh ứng dụng, v.v., có thể đạt được những điều sau với một công thức duy nhất, chẳng hạn như arrayformula(hoặc có thể mmulthoặc một cái gì đó lạ, nhưng không điền vào) ở đầu Cột B?:

kịch bản:

Cột A: các ô trống hoặc không trống

mục tiêu:

Cột B: chứa ô không trống cuối cùng của cột A

thí dụ:

input | output
===============
    a | a
------+--------
      | a
------+--------
      | a
------+--------
    5 | 5
------+--------
      | 5
------+--------
    c | c
------+--------
    c | c
------+--------
      | c
------+--------
    a | a
------+--------

Câu trả lời:


9

Câu trả lời ngắn

=ArrayFormula(vlookup(ROW(1:10),{IF(LEN(A1:A10)>0,ROW(1:10),""),A1:A10},2))

Giải trình

Giả sử dữ liệu đầu vào trong Column Abảng dưới đây và công thức trên nằm trong ô B1.

Lưu ý: Để giúp đánh giá công thức dễ dàng hơn, Column A(đầu vào) không lặp lại các giá trị nhưng nó sẽ hoạt động với bất kỳ loại giá trị nào (chữ, số, ký hiệu, lặp lại, chưa sắp xếp, v.v.)

      |    A       B   
  === + ======= =======
   1  |    a       a   
   2  |            a   
   3  |    b       b   
   4  |            b   
   5  |            b   
   6  |    c       c   
   7  |    d       d   
   8  |    e       e   
   9  |            e   
  10  |    f       f   

VLOOKUP đã được chọn vì nó có thể được sử dụng để tìm các giá trị gần đúng và nó có thể trả về nhiều giá trị (mảng).

Vì các giá trị đầu vào có thể xuất hiện theo bất kỳ thứ tự nào, thay vì sử dụng các giá trị thực tế, số hàng được sử dụng cho các ô không trống và các ô trống đã gán một chuỗi trống "".

Nó được sử dụng LENthay ISBLANKvì bởi vì các ô có công thức trả về chuỗi trả về chuỗi rỗng FALSEvà điều này có thể gây ra sự cố trong một số trường hợp phổ biến.

IF(LEN(A1:A10)>0,ROW(1:10),"")

LƯU Ý: Trong trường hợp bạn muốn lưu ba ký tự, tham số thứ hai ( ""ký tự là dấu tách tham số ,) có thể bị xóa. Khi phân tích phần này của công thức, các ô trống sẽ trở lại FALSE.

Khi VLOOKUPyêu cầu cột tra cứu là cột đầu tiên, thay vì một phạm vi, một mảng được thực hiện "bán thủ công" đã được sử dụng.

{IF(LEN(A1:A10)>0,ROW(1:10),""),A1:A10}

Cách tiếp cận trên giúp chúng tôi tiết kiệm tế bào và thời gian xử lý.


1
Có thể được thực hiện ngắn hơn một chút bằng cách bỏ qua ""trong lệnh if (mặc định đối số bị bỏ trống).

Thật thông minh, tôi thấy bạn tạo một hàng ánh xạ bảng tra cứu tạm thời thành các giá trị ({IF (...), ...} bao gồm các hàng 1-> a, 3-> b, 6-> c, ... với một số hàng trống), sau đó thực hiện tra cứu. Cảm ơn bạn cũng đã giải thích! Tuy nhiên, ý bạn là gì "Để dễ đánh giá nó hơn, cột A (đầu vào) không lặp lại các giá trị"? Điều này dường như để xử lý các giá trị trùng lặp (abcae ...), phải không?
ninjagecko

@ninjagecko: Tôi đã nói về dữ liệu đầu vào mẫu. Tôi đã đề cập đến điều này bởi vì OP bao gồm dữ liệu lặp đi lặp lại. Tôi sẽ điều chỉnh lại phần đó để làm cho rõ ràng hơn.
Rubén

@ Bình thường: Tôi đã không bỏ qua ""nhưng đã thêm một ghi chú về điều đó và được thay thế ROW(A1:A10)bằng ROW(1:10). :)
Rubén

1
@ninjagecko: Có thể việc sử dụng trong câu trả lời của tôi về thuật ngữ "đánh giá" đang gây nhầm lẫn do lý lịch của bạn. Trong hồ sơ Ứng dụng web của bạn, bạn không chia sẻ nhiều về nó, nhưng tôi có thể thấy rằng bạn có 35k danh tiếng trong SO, vì vậy tôi nghĩ rằng bạn sử dụng "đánh giá" thường xuyên như một cái gì đó được thực hiện bởi một máy. Trong trường hợp của tôi, lần đầu tiên tôi nghĩ về nó một cái gì đó được thực hiện bởi con người. Trong trường hợp này, "ai" là người xây dựng / áp dụng công thức, đặc biệt là những người chưa sử dụng trước vlookup và mảng cùng nhau trong Google Sheets.
Rubén

2

Ngoài bài đăng trước, công thức dưới đây sẽ cho phép sử dụng phạm vi kết thúc mở để đầu ra sẽ 'tự động mở rộng' khi các giá trị mới được thêm vào cột được tham chiếu (A trong ví dụ bên dưới).

=ArrayFormula(
   if(row(A2:A) <= max(if(not(isblank(A2:A)),row(A2:A))),
      vlookup(row(A2:A),filter({row(A2:A),A2:A},len(A2:A)),2),
   )
 )

EDIT: nếu bạn không muốn đầu ra bị giới hạn ở hàng cuối cùng của sourcedata, bạn có thể 'mã hóa cứng' hàng cuối như thế này:

=ArrayFormula( if(row(A:A) <= 20, vlookup(row(A:A),filter({row(A:A),A:A},len(A:A)),2), ) )

Một lưu ý của công thức này là nó "dừng" ở hàng cuối cùng của nguồn dữ liệu. Tôi nghĩ rằng điều này nên được đề cập trong câu trả lời.
Rubén

@ Rubén: Tôi nghĩ rằng có thể dễ dàng sửa đổi. Giả sử bạn muốn đầu ra tiếp tục sau hàng cuối cùng của dữ liệu nguồn (ví dụ: hàng 20), bạn có thể thay đổi công thức thành = ArrayFormula (if (row (A: A) <= 20, vlookup (row (A: A) ), bộ lọc ({hàng (A: A), A: A}, len (A: A)), 2),))
JPV 3/03/2016

Điều đó cũng nên được đề cập trong câu trả lời.
Rubén

1
@ Rubén: Tôi vừa làm. ;-)
JPV 3/03/2016

-1

Bạn có thể thử công thức này:

=ArrayFormula(if(ISBLANK(A1:A10);INDEX(A1:A10;ROW()-1;COLUMN());A1:A10))
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.