2011-10-18 49 views
8

Có cách nào nhận được một mảng trong Excel có kích thước nhỏ hơn một mảng bắt đầu trong một hàm trang tính ô không?Làm thế nào để bạn trích xuất một subarray từ một mảng trong một chức năng bảng tính?

Vì vậy, nếu tôi có:

{23, "", 34, 46, "", "16"} 

Tôi muốn kết thúc với:

{23, 34, 46, 16} 

mà tôi sau đó có thể thao tác với một số chức năng khác.

Kết luận: Nếu tôi làm nhiều việc này, tôi chắc chắn sẽ sử dụng giải pháp lược UDF của jtolle. Công thức mà PPC sử dụng rất gần nhưng thử nghiệm, tôi thấy nó có lỗi trong các vùng trống, bỏ lỡ giá trị đầu tiên, và có cách dễ dàng hơn để lấy số hàng, vì vậy đây là giải pháp cuối cùng của tôi:

=IFERROR(INDEX($A$1:$A$6, SMALL(IF(($A$1:$A$6<>""),ROW($A$1:$A$6)),ROW(1:6))),"") 

Công cụ nào phải được nhập dưới dạng công thức mảng (CTRL-SHIFT-ENTER). Nếu được hiển thị thì nó phải được nhập vào ít nhất một khu vực lớn bằng kết quả để hiển thị tất cả các kết quả.

+2

Tôi sẽ nói rằng điều đó là không thể nếu không có UDF. Tôi sẽ rất hài lòng nếu ai đó chứng minh tôi sai. – Excellll

+0

Câu hỏi hay. Tôi sẽ gắn cờ này với một vài công thức cực đoan, nhưng tôi đồng ý với Excellll về điều này – brettdj

+0

@Excellll - một biến thể công thức có thể được bao gồm bên dưới cũng có thể được sử dụng bên trong các hàm như SUM(). –

Trả lời

5

Nếu tất cả những gì bạn muốn làm là lấy một tập con của một mảng, và bạn đã biết vị trí của các phần tử bạn muốn, bạn chỉ có thể sử dụng INDEX với một mảng cho đối số chỉ mục. Đó là:

=INDEX({11,22,33,44,55},{2,3,5}) 

trả về {22,33,55}. Nhưng điều đó thường không hữu ích vì bạn không biết vị trí, và tôi không biết cách nào để có được chúng mà không có UDF.

Những gì tôi đã làm cho các loại hình mảng lọc trong bảng tính là viết một UDF với các hình thức sau đây:

'Filters an input sequence based on a second "comb" sequence. 
'Non-False-equivalent, non-error values in the comb represent the positions of elements 
'to be kept. 
Public Function combSeq(seqToComb, seqOfCombValues) 

    'various library calls to work with 1xn or nx1 arrays or ranges as well as 1-D arrays 

    'iterate the "comb" and collect positions of keeper elements 

    'create a new array of the right length and copy in the keeper elements 

End Function 

tôi chỉ giả đăng tải bởi vì mã thực tế của tôi là tất cả các cuộc gọi đến các chức năng thư viện, bao gồm cả các vị trí thu thập và các vị trí sao chép từ vị trí. Nó có lẽ sẽ che khuất ý tưởng cơ bản, điều này khá đơn giản.

Bạn muốn gọi như vậy một UDF như vậy:

=combSeq({23, "", 34, 46, "", "16"}, {23, "", 34, 46, "", "16"} <> "") 

hoặc

=combSeq(Q1:Q42, SIN(Z1:Z42) > 0.5) 

và sử dụng cơ mảng bình thường của Excel để tạo ra "chiếc lược". Đó là một cách nhẹ nhàng, thân thiện với Excel để nhận được rất nhiều lợi ích của chức năng tiêu chuẩn hơn filter(list-to-filter, test-function) mà bạn có thể thấy trong các hệ thống lập trình khác.

Tôi sử dụng tên "lược" vì "bộ lọc" thường có nghĩa là "bộ lọc có chức năng này" và với Excel, bạn phải áp dụng chức năng kiểm tra trước khi gọi hàm lọc. Ngoài ra nó có thể hữu ích để tính toán một "lược" như là một kết quả trung gian và sau đó sử dụng nó để ... er, lược ... nhiều danh sách.

+0

Tôi đã nghĩ rằng nó sẽ phải là một cái gì đó dọc theo những dòng này. Cảm ơn câu trả lời hoàn chỉnh. –

+0

@jtolle, tôi muốn giải pháp INDEX ({11,22,33,44,55}, {2,3,5}) của bạn đã hoạt động, nhưng đối với tôi nó chỉ trả về giá trị đầu tiên, 22. Nó không trả về một mảng . Bạn đã xác minh nó hoạt động chưa? Tôi có làm sai không? thx –

+0

@ johnywhy, bạn đã nhập nó như là một công thức mảng, có nghĩa là, với "Ctrl-Shift-Enter"? Bạn cũng phải có một phạm vi được chọn đủ lớn để trả về mảng, hoặc nó sẽ chỉ hiển thị nhiều như có chỗ cho. Thực hiện tìm kiếm trên "công thức mảng excel" để có thêm thông tin về điều này. – jtolle

5

Có câu trả lời trên trang web này: http://www.mrexcel.com/forum/showthread.php?t=112002. Không có nhiều lời giải thích mặc dù.

Giả sử bạn có dữ liệu có ô trống trên cột A và bạn đặt dữ liệu này vào cột B; mà sẽ lấy dữ liệu theo thứ tự bỏ qua những khoảng trống

=INDEX( $A$1:$A$6, 
     SMALL( 
      IF(
       ($A$2:$A$6<>""), 
       ROW($A$2:$A$6) 
      ), 
     ROW()-ROW($B$1) 
     ) 
    ) 

Dưới đây là lời giải thích:

  • ROW() - ROW ($ B $ 1) chỉ là một thủ thuật mà sẽ cung cấp bạn một số gia tăng (tức là 1 trong B1, 2 trong B2 ...)
  • NẾU (..., ROW ($ A $ 2: $ A $ 6)) là phần chính của mẹo: xây dựng một mảng của hàng n umbers nơi điều kiện IF là đúng (lưu ý rằng NẾU không có giá trị 'khác')
  • NHỎ (..) sẽ trả về giá trị khoá X nhỏ nhất của mảng đó (trong trường hợp của chúng tôi số của nonblank khoá X hàng), trong đó X là số hàng của ô hiện tại (1 trong B1 ...)
  • INDEX sau đó sẽ dịch từ số hàng để giá trị của nó
  • Lưu ý rằng INDEXROW bắt đầu một hàng phía trên bảng thực tế luôn có một offset> 0 (INDEX không thích số không)
+0

ROW() - ROW ($ B $ 1) cũng có thể được viết là ROWS ($ B $ 1: B1).Một mẹo khác, cùng một công việc – PPC

+0

Rất tuyệt! Nếu chỉ có Excel sẽ bao gồm một số loại chức năng lọc tích hợp, loại thể dục dụng cụ công thức này sẽ không cần thiết ... – jtolle

+0

@jtolle: Trong một số trường hợp, bạn có thể thêm công thức tùy chỉnh của mình dưới dạng macro. Bởi "Trong một số trường hợp", tôi có nghĩa là "nếu khách hàng của bạn không sợ khi họ nghe thấy từ" – PPC

1

Một khả năng giải pháp chức năng bảng tính:

=INDEX(A1:A6,N(IF(1,MODE.MULT(IF(A1:A6<>"",ROW(1:6)*{1,1}))))) 

Chức năng MODE.MULT trả về một mảng giảm chỉ số và N(IF(1,.)) được chèn để mảng được chuyển theo tham chiếu tới hàm INDEX.

+0

Điều này trông rất thú vị. Một vấn đề cho đến nay là thậm chí gói này trong một tuyên bố IFERROR, giống như INDEX của giải pháp của tôi, tôi vẫn nhận được lỗi # N/A trên các khoảng trắng. Tôi chắc chắn sẽ thích một lời giải thích tốt về cách xây dựng này đang làm việc, một liên kết sẽ được sử dụng tốt. –

+0

Để mảng nhập qua nhiều ô có thể thử như sau: 'IFERROR (IF (1, )," ")'. Googling cho 'Excel 'N (IF (1," 'trả về một vài liên kết nhưng tôi đã không tìm thấy một lời giải thích tốt cho hành vi chính xác này, dịch một số bài viết của Trung Quốc cũng có thể cung cấp thêm một số chi tiết. –

+0

xem thêm: http: //www.mrexcel.com/forum/excel-questions/904661-returning-sub-arrays-using-index.html –

Các vấn đề liên quan