Các hàm mảng Excel - làm thế nào để đếm các ô không trống trên nhiều trang tính?


0

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à 2do ô 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()INDIRECT()tham chiếu các ô A1củ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/ TRUEthành 0/ 1by 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())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)COLUMN(A1)do ROWS($A$1:A1)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.)


1
Tôi tin rằng điều này hoạt động nếu không có số không:=SUM(--(N(INDIRECT(ADDRESS(ROW(A1),COLUMN(A1),,,SHEET_NAMES())))<>0))
Kyle

Vâng, nó hoạt động - cảm ơn, @Kyle; đây không phải là một giải pháp hoàn hảo mặc dù cũng 0có 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?
aschipfl

1
Đúng rồi. Cái đầu tiên -chuyển đổi Falsethành 0Truethành -1, và cái thứ hai -chuyển đổi -1thành 1.
Kyle

Câu trả lời:


1

Bạn có thể thử với mã này:

=SUMPRODUCT(SUBTOTAL(2;INDIRECT(ADDRESS(ROW();COLUMN();;;SHEET_NAMES))))


Cảm ơn bạn đã trả lời, nhưng tôi e rằng điều này không thể hoạt động vì các N()lực bổ sung kết quả INDIRECT()được chuyển đổi thành giá trị số, do đó, bên ngoài ISNUMBER()sẽ trả về TRUEcho mọi ô, do đó, áp dụng trên ví dụ từ câu hỏi 3, mặc dù vậy, kết quả này Tôi mong đợi 2(vì một trong ba ô quan tâm là trống) ...
aschipfl

Lời xin lỗi. Điểm tốt. Sở thích của bạn về việc không cho phép COUNTIF làm cho mọi thứ hơi phức tạp! Tôi có thể hỏi nếu số không là một khả năng trong các ô được tham chiếu không?
XOR LX

Có, số không được coi là số hợp lệ.
aschipfl

Ok, đã đăng một nỗ lực thứ hai. SUMPRODVEL phủ nhận sự cần thiết của CSE, mặc dù nếu bạn thực sự khăng khăng thì tất nhiên bạn có thể thay thế chức năng đó bằng SUM và cam kết một cách thích hợp.
XOR LX

@XORLX, cảm ơn, nó hoạt động như mong đợi! bạn có thể vui lòng 1. thêm thông tin nhận xét của bạn về CSE vào câu trả lời và 2. cung cấp một số giải thích về những gì xảy ra ở đây và tại sao điều này lại hiệu quả và tại sao công thức ban đầu của tôi lại không?
aschipfl

0

Bạn không cần tất cả các tên trang tính, chỉ đầu tiên và cuối cùng:

=COUNT(Sheet1:Sheet3!A1)

1
Điều này không trả lời câu hỏi, số lượng và tên của các tờ là động.
Kyle
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.