Làm cách nào để đếm số lượng ô trên nhiều trang tính có giá trị nằm trong một phạm vi nhất định?


2

Tôi có một sổ làm việc Excel với nhiều bảng tính chứa dữ liệu như:

    'DATA_1'                        'DATA_2'                        'DATA_3'        
    A       B                       A       B                       A       B       
1   value1     1.6              1   value1     0.8              1   value1     2.0  
2   value2     2.5              2   value2     2.2              2   value2     0.5  
3   value3     3.4              3   value3     3.1              3   value3     3.2  

Có một bảng tính khác được gọi SUMMARY, trước mặt tất cả những người khác, trông giống như thế này:

    'SUMMARY'                       
    A       B       C       D       
5           min     max     count   
6   value1     1.0     1.8          
7   value2     1.5     2.5          
8   value3     2.0     3.0          

Các hàng 1đến 4mà không được hiển thị là trống rỗng và ẩn.

Như bạn có thể đã đoán, bây giờ tôi đang cố gắng điền đúng cột count( D). Nó nên chứa số lượng của tất cả các value?giá trị trong các DATA_?trang tính trong phạm vi tương ứng từ minđến maxgiới hạn (một giá trị bằng một trong hai giới hạn được xem xét trong phạm vi). Vì vậy, những gì tôi đang mong đợi cho dữ liệu mẫu đã cho là:

    D       
5   count   
6        1  
7        2  
8        0  

Những gì tôi có cho đến nay là một hàm do người dùng định nghĩa để lấy một mảng các tên bảng tính, hoạt động tốt:

Function SHEET_NAMES() As Variant
    ' returns names of all sheets as an array
    Dim index As Long, retArray() As String
    Application.Volatile True

    ReDim retArray(ThisWorkbook.Sheets.Count)
    For index = 1& To ThisWorkbook.Sheets.Count
        retArray(index) = ThisWorkbook.Sheets.Item(index).Name
    Next index
    SHEET_NAMES = retArray
End Function

Hơn nữa, tôi có thể truy cập thành công value1dữ liệu (một cách đại diện) trong tất cả các bảng tính với {=N(INDIRECT(ADDRESS(ROW(B1);COLUMN(B1);;;SHEET_NAMES())))}.

Tôi có thể kiểm tra các value1giá trị so với mingiới hạn của chúng với {=N(N(INDIRECT(ADDRESS(ROW(B1);COLUMN(B1);;;SHEET_NAMES())))>=B6)}. Khi chức năng mảng này được kéo dài trên 4 ô, kết quả là:

 0       1       0       1  

Tôi có thể kiểm tra các value1giá trị so với maxgiới hạn của chúng với {=N(N(INDIRECT(ADDRESS(ROW(B1);COLUMN(B1);;;SHEET_NAMES())))<=C6)}. Khi chức năng mảng này được kéo dài trên 4 ô, kết quả là:

 1       1       1       0  

Cuối cùng, tôi cũng có thể kiểm tra các ô cho các giá trị số với {=N(ISNUMBER(INDIRECT(ADDRESS(ROW(B1);COLUMN(B1);;;SHEET_NAMES()))))}. Khi chức năng mảng này được kéo dài trên 4 ô, kết quả là:

 0       1       1       1  

Xuất 0phát từ SUMMARYbảng tính có ô B1trống như đã đề cập.

Ý tưởng của tôi bây giờ là sử dụng chức năng SUMPRODUCTcuối cùng và vì vậy để có được số lượng cá nhân : {=SUMPRODUCT(N(N(INDIRECT(ADDRESS(ROW(B1);COLUMN(B1);;;SHEET_NAMES())))>=B6);N(N(INDIRECT(ADDRESS(ROW(B1);COLUMN(B1);;;SHEET_NAMES())))<=C6);N(ISNUMBER(INDIRECT(ADDRESS(ROW(B1);COLUMN(B1);;;SHEET_NAMES())))))}.
Tuy nhiên, mặc dù tôi mong đợi 1 = (0 * 1 * 0) + (1 * 1 * 1) + (0 * 1 * 1) + (1 * 0 * 1), điều này luôn có kết quả 0kỳ lạ. Vì vậy, bạn có thể vui lòng cho tôi biết tôi đang làm gì sai ở đây?

(Tôi muốn một giải pháp mà không sử dụng COUNTIF, COUNTIFS, SUMIF, SUMIFS, và chức năng tương tự khác mà cần điều kiện để được đưa ra như là một chuỗi, nếu có thể.)


Giá trị của bạn luôn ở cùng một vị trí trên mỗi tờ? Có bao nhiêu tờ là "nhiều"?
Kyle

Vâng, value?tất cả các trang tính trông giống hệt nhau, các giá trị đều ở cùng một vị trí, chỉ có các giá trị là khác nhau; số lượng tờ thay đổi từ 1 đến ~ 30 ...
aschipfl

@ ItWasMe, xin lỗi, nhưng tôi không thể làm theo ... bạn đang đề cập đến câu hỏi này của tôi phải không?
aschipfl

Câu trả lời:


0

Thay đổi UDF của bạn để trông như thế này:

Function SHEET_NAMES() As Variant
    ' returns names of all sheets as an array
    Dim index As Long, retArray() As String, i As Long
    index = 1
    i = 1
    Application.Volatile True

    ReDim retArray(1 To ThisWorkbook.Sheets.Count - 1)
    Do While index <= ThisWorkbook.Sheets.Count
        If ThisWorkbook.Sheets(index).Name <> "SUMMARY" Then
            retArray(i) = ThisWorkbook.Worksheets(index).Name
            i = i + 1
        End If
        index = index + 1
    Loop
    SHEET_NAMES = retArray
End Function

Sự thay đổi thực sự quan trọng duy nhất là tôi đã làm cho nó bỏ qua bảng TÓM TẮT.

Và sau đó sử dụng công thức mảng này, được điều chỉnh từ đây (xác nhận với ctrl + shift + enter):

=SUM(IF(N(INDIRECT(SHEET_NAMES()&"!B"&ROW()-5))>=B6,IF(N(INDIRECT(SHEET_NAMES()&"!B"&ROW()-5))<=C6,1,0),0))

Lưu ý rằng để làm việc này, dữ liệu của bạn trên bảng TÓM TẮT phải bắt đầu ở hàng 6 (như mẫu của bạn). Nếu không, bạn sẽ phải điều chỉnh ROW()-5bit để nó bằng 1 trên hàng đầu tiên của bạn. Nó phải hoạt động theo cách này bởi vì đó là những gì làm tăng hàng khi bạn tự động điền công thức xuống.

Chỉnh sửa: Giải quyết ý kiến ​​của bạn, sử dụng công thức này. Nó có thể được sử dụng với UDF ban đầu của bạn và sử dụng ADDRESS()để tạo các tài liệu tham khảo.

=SUM(IFERROR(IF(N(INDIRECT(ADDRESS(ROW(B1),COLUMN(B1),,,SHEET_NAMES())))>=B6,IF(N(INDIRECT(ADDRESS(ROW(B1),COLUMN(B1),,,SHEET_NAMES())))<=C6,1,0),0),0))

Khi tôi lồng cái khác IFvới ISNUMBERtruy vấn, tôi có thể tránh sửa đổi SHEET_NAMEShàm không? thật không may, loại trừ mã hóa cứng của (a) một số tờ nhất định không phải là một lựa chọn tốt cho tôi ...
aschipfl

... hơn nữa, có cần thiết phải loại bỏ ADDRESSchức năng không? theo như tôi thấy, phần đó hoạt động tốt ...
aschipfl

@aschipfl xem chỉnh sửa của tôi.
Kyle

Cảm ơn, @Kyle, tôi sẽ sớm kiểm tra nó ... bạn có biết tại sao SUMPRODUCTcách tiếp cận của tôi không thành công không?
aschipfl

@aschipfl Nó có liên quan đến đối số thứ ba của bạn, N(ISNUMBER(...phần mà tôi nghĩ bạn đang sử dụng để lọc ra bảng TÓM TẮT. Khi tôi sử dụng UDF của mình và lấy phần đó ra thì nó hoạt độ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.