Tôi có một sổ làm việc Excel với nhiều bảng tính, một số trong số chúng có chứa một giá trị số trong ô A1
:
'DATA_1' 'DATA_2' 'DATA_3'
A A A
1 1.6 1 -0.8 1
Tôi muốn xác định số lượng A1
ô theo một công thức duy nhất trong toàn bộ sổ làm việc có chứa dữ liệu, vì vậy kết quả cho ví dụ trên phải là 2
do ô trong trang tính cuối cùng trống.
Vì số lượng bảng tính có thể thay đổi, tôi đang sử dụng hàm do người dùng xác định (UDF) trả về một mảng chứa tên của tất cả các trang tính:
Function SHEET_NAMES() As Variant
' returns names of all sheets as an array
Dim idx As Long, retArray() As String
Application.Volatile True
With ThisWorkbook.Sheets
ReDim retArray(.Count)
For idx = 1& To .Count
retArray(idx) = .Item(idx).Name
Next idx
SHEET_NAMES() = retArray
End With
End Function
UDF này đang hoạt động tốt, công thức {=SHEET_NAMES()}
trả về mảng dự kiến ( {"DATA_1","DATA_2","DATA_3"}
). (Lưu ý rằng UDF cần được coi là không thể chỉnh sửa.)
Ý tưởng của tôi bây giờ là sử dụng UDF cùng với các hàm ADDRESS()
và INDIRECT()
tham chiếu các ô A1
của tất cả các bảng tính có sẵn, để sử dụng ISNUMBER()
để kiểm tra xem có một số hợp lệ hay không, chuyển đổi boolean FALSE
/ TRUE
thành 0
/ 1
by N()
và cuối cùng, để sử dụng SUM()
để tổng hợp tất cả 0
/ 1
, như thế này:
{=SUM(N(ISNUMBER(INDIRECT(ADDRESS(ROW(A1);COLUMN(A1);;;SHEET_NAMES())))))}
Tuy nhiên, kết quả luôn luôn 0
, ngay cả khi không có bảng tính nào chứa một ô trống A1
.
Tôi phát hiện ra rằng ADDRESS()
hàm trả về mảng đúng các chuỗi, đại diện cho tài liệu tham khảo cho tất cả các tế bào A1
, đó là {"DATA_1!$A$1","DATA_2!$A$1","DATA_3!$A$1"}
.
INDIRECT()
trả về {#VALUE!,#VALUE!,#VALUE!}
vì nó không hỗ trợ các mảng rõ ràng, tuy nhiên hàm container ISNUMBER()
không hỗ trợ các mảng, do đó, điều này dường như thực hiện việc lặp lại các phần tử mảng một cách chính xác và kết quả là {TRUE,TRUE,FALSE}
.
Các N()
chức năng thực hiện việc chuyển đổi theo cách dự định, do đó nó kết quả trong {1,1,0}
.
Nhưng trận chung kết SUM()
luôn có kết quả 0
, bất kể có bao nhiêu tờ và có hay không một số hoặc tất cả chúng có chứa các số hợp lệ trong ô A1
. (Cũng giống như một sidenote: nếu tôi nhập công thức dưới dạng hàm không phải là mảng, kết quả chỉ phụ thuộc vào bảng tính đầu tiên.)
Tôi cố gắng để sử dụng NOT(ISBLANK())
và NOT(ISERROR())
thay vì ISNUMBER()
, và tôi đã cố gắng để thay đổi SUM(N(ISNUMBER()))
để SUM(COUNT())
, nhưng không thành công (tất cả các kết quả trong 0
, ngoại trừ NOT(ISBLANK())
mang đến cho 3
).
(Ngoài ra tôi thậm chí đã cố gắng để thay thế ROW(A1)
và COLUMN(A1)
do ROWS($A$1:A1)
và COLUMNS($A$1:A1)
, tương ứng, vì điều này nên khắc phục một vấn đề liên quan đến mảng của INDIRECT()
, theo một số trang web, nhưng không có sự thay đổi là tốt.)
Vì vậy, bạn có thể vui lòng cho tôi biết những gì tôi đang làm sai ở đây, và làm thế nào để vượt qua thất bại mà không mất linh hoạt?
(Nếu có thể, tôi muốn một giải pháp mà không sử dụng COUNTIF()
hoặc SUMIF()
bất kỳ chức năng nào khác yêu cầu một điều kiện nhất định được đưa ra dưới dạng chuỗi, để duy trì tính di động.)
0
có thể xuất hiện trong các tế bào; các --
cải boolean đến các số (tương tự N()
), phải không?
-
chuyển đổi False
thành 0
và True
thành -1
, và cái thứ hai -
chuyển đổi -1
thành 1
.
=SUM(--(N(INDIRECT(ADDRESS(ROW(A1),COLUMN(A1),,,SHEET_NAMES())))<>0))