Ô không trống cuối cùng trong một cột


112

Có ai biết công thức để tìm giá trị của ô không trống cuối cùng trong một cột, trong Microsoft Excel không?


Tôi đang tìm kiếm VBA cho điều này.
David Heffernan

Câu trả lời:


76

Điều này hoạt động với cả văn bản và số và không quan tâm nếu có các ô trống, tức là, nó sẽ trả về ô không trống cuối cùng.

Nó cần được nhập theo mảng , nghĩa là bạn nhấn Ctrl-Shift-Enter sau khi nhập hoặc dán nó vào. Dưới đây là dành cho cột A:

=INDEX(A:A,MAX((A:A<>"")*(ROW(A:A))))

@ Jean-François, Xin lỗi, tôi đã thừa nhận điều đó trong một nhận xét tối qua nhưng đã nhầm lẫn đưa nó vào bài viết gốc. Nó hoạt động trong XL 2007 và 2010. Cảm ơn.
Doug Glancy

Không hoạt động với tôi trong Excel 2007. Tôi đã dán công thức chính xác. Tôi có một cột (A), nơi các giá trị là = ROW () tất cả các con đường xuống 127ish, và trở về công thức "1"
DontFretBrett

2
@DontFretBrett, Hãy chắc chắn nhập nó dưới dạng công thức mảng bằng Ctrl-Shift-Enter như được chỉ định trong câu trả lời.
Doug Glancy

@DougGlancy thất bại về phía tôi. Cảm ơn bạn!
DontFretBrett

1
Sự khác biệt quan trọng là cái này trả về một tham chiếu ô (vì vậy nó có thể được chuyển cho ví dụ CELL()hoặc OFFSET()), trong khi cái được ủng hộ nhiều hơn trả về một giá trị mà không cho bạn biết nó ở đâu.
GSerg

128

Sử dụng công thức đơn giản sau đây sẽ nhanh hơn nhiều

=LOOKUP(2,1/(A:A<>""),A:A)

Đối với Excel 2003:

=LOOKUP(2,1/(A1:A65535<>""),A1:A65535)

Nó mang lại cho bạn những lợi thế sau:

  • không phải là công thức mảng
  • không phải là công thức dễ bay hơi

Giải trình:

  • (A:A<>"") trả về mảng {TRUE,TRUE,..,FALSE,..}
  • 1/(A:A<>"")sửa đổi mảng này thành {1,1,..,#DIV/0!,..}.
  • LOOKUPmong đợi mảng được sắp xếp theo thứ tự tăng dần và có tính đến việc nếu LOOKUPhàm không thể tìm thấy kết quả khớp chính xác, nó sẽ chọn giá trị lớn nhất trong lookup_range(trong trường hợp của chúng tôi {1,1,..,#DIV/0!,..}) nhỏ hơn hoặc bằng giá trị (trong trường hợp của chúng tôi 2), công thức tìm thấy cuối cùng 1trong mảng và trả về giá trị tương ứng từ result_range(tham số thứ ba - A:A).

Cũng lưu ý nhỏ - công thức trên không tính đến các ô có lỗi (bạn chỉ có thể thấy nó nếu ô không trống cuối cùng có lỗi). Nếu bạn muốn tính đến chúng, hãy sử dụng:

=LOOKUP(2,1/(NOT(ISBLANK(A:A))),A:A)

hình ảnh dưới đây cho thấy sự khác biệt:

nhập mô tả hình ảnh ở đây


cảm ơn cho lời giải thích và hình ảnh đẹp. Vẫn còn một số câu hỏi vẫn còn mở: 1. Tài liệu để LOOKUPnói rằng đối số cuối cùng result_vectorlà tùy chọn. Tuy nhiên, nếu tôi bỏ qua nó, tôi nhận được một kết quả rất lạ mà tôi không hiểu.
Honza Zidek

2. Tài liệu cho biết "Nếu LOOKUPhàm không thể tìm thấy lookup_value, thì hàm khớp với giá trị lớn nhất trong lookup_vectorđó nhỏ hơn hoặc bằng lookup_value." Nếu tôi sử dụng =LOOKUP(2,A:A<>"",A:A)mà không thông #DIV/0!báo lỗi bởi 1/..., có vẻ như nó trả về một số giá trị ở giữa vectơ. Tôi đã không tìm thấy chức năng chính xác trong trường hợp này là gì.
Honza Zidek

1
Giải thích rất hay. Gần đây, tôi đã bỏ qua vài phút tính toán bằng cách chuyển công thức từ công thức mảng sang phiên bản không phải mảng, tôi luôn tìm kiếm logic hoạt động mà không yêu cầu công thức mảng.
tobriand

1
@Enissay, vâng, điều này sẽ trở lại số hàng =LOOKUP(2,1/(A:A<>""),ROW(A:A))nhưng thêm ROWchức năng sẽ thêm "biến động" hiệu ứng - Công thức sẽ được tính toán lại mỗi lần bất kỳ tế bào trên wroksheet thay đổi
Dmitry Pavliv

1
Này đó. Cảm ơn vì đã đăng bài này. Chỉ tò mò, tôi đã tìm thấy các công thức giống hệt nhau và gần giống từ ngữ tại exceljet.net/formula/get-value-of-last-non-empty-cell . Đó cũng là bạn hay ai khác? Không có kết nối rõ ràng.
Solomon Rutzky

24

Đây là một tùy chọn khác: =OFFSET($A$1;COUNTA(A:A)-1;0)


9
Điều này sẽ không hoạt động nếu có các ô có giá trị không phải số (sử dụng COUNTAthay vì COUNT). Chưa kể các ô trống.
Jean-François Corbett

3
Điều này nên ở trên cùng. nó đơn giản và không dựa vào các chi tiết khó hiểu của các hàm không phổ biến.
Tmdean

9
Nó không nên ở trên cùng vì nó là sai khi kết quả có các ô trống được nhúng.
Myrddin Emrys

17

Lấy cảm hứng từ sự dẫn dắt tuyệt vời từ câu trả lời của Doug Glancy, tôi đã nghĩ ra một cách để làm điều tương tự mà không cần công thức mảng. Đừng hỏi tôi tại sao, nhưng tôi muốn tránh sử dụng công thức mảng nếu có thể (không phải vì bất kỳ lý do cụ thể nào, đó chỉ là phong cách của tôi).

Nó đây:

=SUMPRODUCT(MAX(($A:$A<>"")*(ROW(A:A))))

Để tìm hàng không trống cuối cùng bằng cách sử dụng Cột A làm cột tham chiếu

=SUMPRODUCT(MAX(($1:$1<>"")*(COLUMN(1:1))))

Để tìm cột không trống cuối cùng sử dụng hàng 1 làm hàng tham chiếu

Điều này có thể được sử dụng thêm cùng với hàm chỉ mục để xác định hiệu quả các phạm vi được đặt tên động, nhưng đây là một cái gì đó cho một bài đăng khác vì điều này không liên quan đến câu hỏi ngay lập tức được giải quyết ở đây.

Tôi đã thử nghiệm các phương pháp trên với Excel 2010, cả "nguyên bản" và trong "Chế độ tương thích" (dành cho các phiên bản Excel cũ hơn) và chúng hoạt động. Một lần nữa, với những điều này, bạn không cần phải thực hiện bất kỳ tổ hợp phím Ctrl + Shift + Enter nào. Bằng cách tận dụng cách sản phẩm sumprod hoạt động trong Excel, chúng ta có thể giải quyết nhu cầu thực hiện các phép toán mảng nhưng chúng ta thực hiện mà không có công thức mảng. Tôi hy vọng ai đó ngoài kia có thể đánh giá cao vẻ đẹp, sự đơn giản và sang trọng của các giải pháp sản phẩm được đề xuất này nhiều như tôi. Mặc dù vậy, tôi không chứng thực hiệu quả bộ nhớ của các giải pháp trên. Chỉ là chúng đơn giản, đẹp mắt, phù hợp với mục đích sử dụng và đủ linh hoạt để mở rộng sử dụng sang các mục đích khác :)

Hi vọng điêu nay co ich!

Tất cả tốt nhất!


1
Về lý do tại sao sử dụng công thức không phải mảng, hãy xem câu trả lời này bên dưới .
sancho.s ReinstateMonicaCellio

17

Tôi biết câu hỏi này đã cũ, nhưng tôi không hài lòng với câu trả lời được cung cấp.

  • LOOKUP, VLOOKUP và HLOOKUP có vấn đề về hiệu suất và thực sự không nên sử dụng.

  • Các hàm mảng có rất nhiều chi phí và cũng có thể có các vấn đề về hiệu suất, vì vậy nó chỉ nên được sử dụng như một phương sách cuối cùng.

  • COUNT và COUNTA gặp sự cố nếu dữ liệu không liền nhau không trống, tức là bạn có khoảng trắng và sau đó dữ liệu lại trong phạm vi được đề cập

  • INDIRECT dễ bay hơi nên chỉ nên sử dụng nó như một phương sách cuối cùng

  • OFFSET dễ bay hơi vì vậy nó chỉ nên được sử dụng như một phương sách cuối cùng

  • bất kỳ tham chiếu nào đến hàng hoặc cột cuối cùng có thể (ví dụ: hàng thứ 65536 trong Excel 2003) không mạnh mẽ và dẫn đến chi phí tăng thêm

Đây là những gì tôi sử dụng

  • khi kiểu dữ liệu được trộn lẫn: =max(MATCH(1E+306,[RANGE],1),MATCH("*",[RANGE],-1))

  • khi được biết rằng dữ liệu chỉ chứa các số: =MATCH(1E+306,[RANGE],1)

  • khi được biết rằng dữ liệu chỉ chứa văn bản: =MATCH("*",[RANGE],-1)

MATCH có chi phí thấp nhất và không biến động, vì vậy nếu bạn đang làm việc với nhiều dữ liệu thì đây là cách tốt nhất để sử dụng.


Đây là một câu trả lời tốt (+1), nhưng vẫn còn một số sơ hở mà phương pháp này có thể bỏ sót. Ví dụ: nếu có các ô có giá trị logic ( TRUE/ FALSE), chúng sẽ không bị phát hiện. Mặc dù thực tế là câu trả lời này không có khả năng chống đạn, tôi vẫn nghĩ câu trả lời này có tác động ít nhất đến hiệu suất.
ImaginaryHuman072889

2
Đối sánh trả về một chỉ mục, không phải giá trị của ô. Bạn có thể sử dụng hàm chỉ mục để lấy giá trị. Ngoài ra, bạn có thể nên bao gồm một cái gì đó về những gì [RANGE] được cho là. Tôi đã chọn toàn bộ cột bằng cách sử dụng "N: N". Đây là một ví dụ phù hợp với tôi: =INDEX(N:N,MATCH(1E+306,N:N,1))
bơi lội vào

10

Điều này hoạt động trong Excel 2003 (& sau đó với chỉnh sửa nhỏ, xem bên dưới). Nhấn Ctrl + Shift + Enter (không chỉ Enter) để nhập giá trị này dưới dạng công thức mảng.

=IF(ISBLANK(A65536),INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535)))),A65536)

Lưu ý rằng Excel 2003 không thể áp dụng công thức mảng cho toàn bộ cột. Làm như vậy sản lượng #NUM!; kết quả không thể đoán trước có thể xảy ra! (CHỈNH SỬA : Thông tin xung đột từ Microsoft: Điều tương tự có thể đúng hoặc có thể không đúng với Excel 2007; sự cố có thể đã được khắc phục vào năm 2010. )

Đó là lý do tại sao tôi áp dụng công thức mảng cho phạm vi A1:A65535và xử lý đặc biệt cho ô cuối cùng, A65536trong Excel 2003. Không thể chỉ nói A:Ahoặc thậm chí A1:A65536khi ô sau tự động hoàn nguyên A:A.

Nếu bạn hoàn toàn chắc chắn A65536là trống, thì bạn có thể bỏ qua IFphần:

=INDEX(A1:A65535,MAX((A1:A65535<>"")*(ROW(A1:A65535))))

Lưu ý rằng nếu bạn đang sử dụng Excel 2007 hoặc 2010, số hàng cuối cùng là 1048576 không phải 65536, vì vậy hãy điều chỉnh ở trên cho phù hợp.

Nếu không có ô trống nào ở giữa dữ liệu của bạn, thì tôi chỉ sử dụng công thức đơn giản hơn =INDEX(A:A,COUNTA(A:A)),.


Đối với ROW thay vì cột, điều này đã hiệu quả với tôi=INDEX(19:19,COUNTA(19:19))
Serj Sagan

8

Một giải pháp thay thế không có công thức mảng, có thể mạnh hơn so với một câu trả lời trước đó với một giải pháp (gợi ý cho a) không có công thức mảng , là

=INDEX(A:A,INDEX(MAX(($A:$A<>"")*(ROW(A:A))),0))

Hãy xem câu trả lời này như một ví dụ. Kudos cho Bradbarry houdini , người đã giúp giải quyết câu hỏi này .

Các lý do có thể có để thích một công thức không phải là mảng được đưa ra trong:

  1. Trang chính thức của Microsoft (tìm "Nhược điểm của việc sử dụng công thức mảng").
    Công thức mảng có vẻ kỳ diệu, nhưng chúng cũng có một số nhược điểm:

    • Đôi khi bạn có thể quên nhấn CTRL + SHIFT + ENTER. Hãy nhớ nhấn tổ hợp phím này bất cứ khi nào bạn nhập hoặc chỉnh sửa công thức mảng.
    • Người dùng khác có thể không hiểu công thức của bạn. Công thức mảng tương đối không có tài liệu, vì vậy nếu người khác cần sửa đổi sổ làm việc của bạn, bạn nên tránh công thức mảng hoặc đảm bảo những người dùng đó hiểu cách thay đổi chúng.
    • Tùy thuộc vào tốc độ xử lý và bộ nhớ của máy tính của bạn, các công thức mảng lớn có thể làm chậm các phép tính.
  2. Công thức mảng Heresy .


Tôi không thể làm cho điều này hoạt động với cột D. Tôi đã thay thế tất cả các Alần xuất hiện bằng a D. Tôi đang làm gì sai?
Marc.2377

5

nếu bạn tìm kiếm trong Cột (A), hãy sử dụng:

=INDIRECT("A" & SUMPRODUCT(MAX((A:A<>"")*(ROW(A:A)))))

nếu phạm vi của bạn là A1: A10, bạn có thể sử dụng:

=INDIRECT("A" & SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10)))))

trong công thức này:

SUMPRODUCT(MAX(($A$1:$A10<>"")*(ROW($A$1:$A10))))

trả về số hàng không trống cuối cùng và gián tiếp () trả về giá trị ô.



2

=MATCH("*";A1:A10;-1) cho dữ liệu văn bản

=MATCH(0;A1:A10;-1) cho dữ liệu số


Vui lòng sử dụng các khối mã khi cung cấp đoạn mã trong câu trả lời của bạn.
β.εηοιτ.βε

Tôi nghĩ các công thức này sẽ cung cấp cho chúng ta ô không trống đầu tiên, không phải ô cuối cùng không trống.
Baodad

2

Ive đã thử tất cả các phiên bản không bay hơi nhưng Không một phiên bản nào ở trên hoạt động được .. excel 2003/2007 cập nhật. Chắc chắn điều này có thể được thực hiện trong excel 2003. Không phải là một mảng hoặc công thức chuẩn. Tôi chỉ nhận được lỗi trống, 0 hoặc # giá trị. Vì vậy, tôi sử dụng các phương pháp dễ bay hơi .. Điều này đã hiệu quả ..

= LOOKUP (2,1 / (T4: T369 <> ""), T4: T369)

@Julian Kroné .. Sử dụng ";" thay vì "," KHÔNG hoạt động! Tôi nghĩ rằng bạn đang sử dụng Libre Office không phải MS excel? LOOKUP rất khó chịu, tôi chỉ sử dụng nó như một phương sách cuối cùng


0

Đặt mã này trong một mô-đun VBA. Tiết kiệm. Trong các chức năng, người dùng xác định tìm kiếm chức năng này.

Function LastNonBlankCell(Range As Excel.Range) As Variant
    Application.Volatile
    LastNonBlankCell = Range.End(xlDown).Value
End Function

2
Đây không nhất thiết phải là ô trống CUỐI CÙNG, chỉ là ô trống TIẾP THEO bắt đầu ở trên cùng.
Á quân Portland

Câu hỏi là về một công thức, không phải VBA
Patrick Honorez

0

cho dữ liệu văn bản:

EQUIV("";A1:A10;-1)

cho dữ liệu số:

EQUIV(0;A1:A10;-1)

Điều này cung cấp cho bạn chỉ số tương đối của ô không trống cuối cùng trong phạm vi đã chọn (ở đây A1: A10).

Nếu bạn muốn nhận giá trị, hãy truy cập nó qua INDIRECT sau khi xây dựng-theo văn bản- tham chiếu ô tuyệt đối, ví dụ:

INDIRECT("A" & (nb_line_where_your_data_start + EQUIV(...) - 1))

0

Tôi cũng gặp vấn đề tương tự. Công thức này cũng hoạt động tốt như nhau: -

=INDIRECT(CONCATENATE("$G$",(14+(COUNTA($G$14:$G$65535)-1))))

14 là số hàng của hàng đầu tiên trong các hàng bạn muốn đếm.

Răng vuốt mãn tính


0

Tôi đã sử dụng HLOOKUP

A1có một ngày; A2:A8đã nắm bắt các dự báo vào các thời điểm khác nhau, tôi muốn

=Hlookup(a1,a1:a8,count(a2:a8)+1)

Điều này sử dụng công thức hlookup tiêu chuẩn với mảng tra cứu được xác định bởi số lượng mục nhập.


0

Nếu bạn biết rằng sẽ không có ô trống ở giữa, cách nhanh nhất là điều này.

=INDIRECT("O"&(COUNT(O:O,"<>""")))

Nó chỉ đếm các ô không trống và tham chiếu đến ô thích hợp.

Nó cũng có thể được sử dụng cho một phạm vi cụ thể.

=INDIRECT("O"&(COUNT(O4:O34,"<>""")+3))

Điều này trả về ô không trống cuối cùng trong phạm vi O4: O34.


0

Đối với Microsoft Office 2013

"Cuối cùng trừ một" của hàng không trống:

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-2,0)

Hàng không trống "cuối cùng":

=OFFSET(Sheet5!$C$1,COUNTA(Sheet5!$C:$C)-1,0)

0

Công thức này đã làm việc với tôi cho office 2010:

= LOOKUP (2; 1 / (A1: A100 <> ""); A1: A100)

A1: ô đầu tiên A100: tham chiếu đến ô cuối cùng trong so sánh


0

Tôi nghĩ rằng phản hồi từ W5ALIVE gần nhất với những gì tôi sử dụng để tìm dòng dữ liệu cuối cùng trong một cột. Tuy nhiên, giả sử tôi đang tìm kiếm hàng cuối cùng có dữ liệu trong Cột A, tôi sẽ sử dụng thông tin sau để tra cứu chung chung hơn:

=MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0))

MATCH đầu tiên sẽ tìm ô văn bản cuối cùng và MATCH thứ hai tìm ô số cuối cùng. Hàm IFERROR trả về 0 nếu MATCH đầu tiên tìm thấy tất cả các ô số hoặc nếu kết hợp thứ hai tìm thấy tất cả các ô văn bản.

Về cơ bản, đây là một biến thể nhỏ của giải pháp hỗn hợp văn bản và số của W5ALIVE.

Trong quá trình thử nghiệm thời gian, điều này nhanh hơn đáng kể so với các biến thể LOOKUP tương đương.

Để trả về giá trị thực tế của ô cuối cùng đó, tôi thích sử dụng tham chiếu ô gián tiếp như sau:

=INDIRECT("A"&MAX(IFERROR(MATCH("*",A:A,-1),0),IFERROR(MATCH(9.99999999999999E+307,A:A,1),0)))

Phương pháp được cung cấp bởi sancho.s có lẽ là một lựa chọn rõ ràng hơn, nhưng tôi sẽ sửa đổi phần tìm số hàng thành này:

=INDEX(MAX((A:A<>"")*(ROW(A:A))),1)

sự khác biệt duy nhất là ", 1" trả về giá trị đầu tiên trong khi ", 0" trả về toàn bộ mảng giá trị (tất cả trừ một trong số đó là không cần thiết). Tôi vẫn có xu hướng thích định địa chỉ ô cho hàm chỉ mục ở đó, nói cách khác, trả về giá trị ô bằng:

=INDIRECT("A"&INDEX(MAX((A:A<>"")*(ROW(A:A))),1))

Chủ đề tuyệt vời!


0

Nếu bạn không ngại sử dụng mảng, thì sau đây là một công thức rất đơn giản để giải quyết vấn đề:

= SUM (IF (A: A <> "", 1,0))

Bạn phải nhấn CTRL + SHIFT + ENTER vì đây là công thức mảng.


-1

Một cái đơn giản phù hợp với tôi:

=F7-INDEX(A:A,COUNT(A:A))

-1

Được rồi, tôi đã gặp vấn đề giống như người hỏi và đã thử cả hai câu trả lời hàng đầu. Nhưng chỉ nhận được lỗi công thức. Hóa ra rằng tôi cần phải trao đổi "," thành ";" để các công thức hoạt động. Tôi đang sử dụng XL 2007.

Thí dụ:

=LOOKUP(2;1/(A:A<>"");A:A)

hoặc là

=INDEX(A:A;MAX((A:A<>"")*(ROW(A:A))))

-3

Đối với theo dõi phiên bản (thêm chữ v vào đầu số), tôi thấy phiên bản này hoạt động tốt trong Xc (Trang tổng quan SAP)

="v"&MAX(A2:A500)

1
Có vẻ không đủ chung chung, vì nó dựa trên thứ tự tăng dần.
Nathan Tuggy
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.