Câu trả lời:
Đ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))))
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.
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:
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!,..}
.LOOKUP
mong đợi mảng được sắp xếp theo thứ tự tăng dần và có tính đến việc nếu LOOKUP
hà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 1
trong 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:
LOOKUP
nói rằng đối số cuối cùng result_vector
là 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.
LOOKUP
hà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ì.
=LOOKUP(2,1/(A:A<>""),ROW(A:A))
nhưng thêm ROW
chứ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
Đây là một tùy chọn khác: =OFFSET($A$1;COUNTA(A:A)-1;0)
COUNTA
thay vì COUNT
). Chưa kể các ô trống.
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!
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.
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.
=INDEX(N:N,MATCH(1E+306,N:N,1))
Đ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:A65535
và xử lý đặc biệt cho ô cuối cùng, A65536
trong Excel 2003. Không thể chỉ nói A:A
hoặc thậm chí A1:A65536
khi ô sau tự động hoàn nguyên A:A
.
Nếu bạn hoàn toàn chắc chắn A65536
là trống, thì bạn có thể bỏ qua IF
phầ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))
,.
=INDEX(19:19,COUNTA(19:19))
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 Brad và barry 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:
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:
A
lần xuất hiện bằng a D
. Tôi đang làm gì sai?
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ị ô.
=INDEX(A:A, COUNTA(A:A), 1)
lấy từ đây
=MATCH("*";A1:A10;-1)
cho dữ liệu văn bản
=MATCH(0;A1:A10;-1)
cho dữ liệu số
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
Đặ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
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))
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
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.
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
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!
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.
Đượ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))))
Đố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)