Chiêu thứ 47: Tạo dãy có thể mở rộng và thu hẹp
Nếu bạn có nhu cầu cần phải cập nhật và thêm dữ liệu, hoặc nếu bạn đang làm việc với biểu đồ và PivotTables, bạn sẽ muốn tạo một tên cho dãy động, mà bản thân nó có thể mở rộng hoặc thu hẹp cho phù hợp với dữ liệu của bạn.
Để hiểu hơn về cách hoạt động của tên dãy động, điều đầu tiên bạn cần phải làm quen chính là hàm OFFSET của Excel.
Chúng ta sẽ bắt đầu với một tên dãy động đơn giản. Giả sử như nếu trong cột A của bạn có 10 dòng liên tiếp chứa dữ liệu, tức là bạn phải có một cái tên của dãy A1:A10. Hãy làm theo bước sau để có được nó:
Vào thẻ Formulas, ở Defined Names, chọn Define Name (Excel 2003: Insert -> Name -> Define) và đánh MyRange vào dòng “Names:”. Tại dòng “Refers To:”, bạn hãy gõ =OFFSET($A$1,0,0,COUNTA($A$1:$A$100),1) và sau đó OK.
Bạn cần lưu ý rằng, khi bạn sử dụng hàm COUNTA, bạn phải cưỡng lại cơn cám dỗ thực hiện hết toàn bộ cột, bởi vì nếu làm như vậy, bạn đang vô tình bắt hàm COUNTA phải đếm cả hàng ngàn dòng một cách vô ích.
Sau khi bạn làm xong công việc trên, bạn hãy cho một vài dữ liệu vào cột A. MyRange sẽ thực hiện công việc hợp tất cả các dòng có dữ liệu liên tục lại với nhau, bắt đầu từ A1. Tuy vậy, tên dãy động sẽ không hiện ra trong hộp Name (Name box). Nhưng, bạn vẫn có thể biết được kết quả của MyRange bằng cách gõ thẳng tên MyRange vào hộp Name và nhấn Enter, lập tức sẽ xuất hiện một vùng chọn báo hiệu cho bạn biết. Tất nhiên, bạn cũng có thể vào thẻ Home, ở Editting, chọn Find & Select rồi chọn Go To…(Ctrl + G). Sau đó, bạn hãy gõ MyRange vào dòng “Reference:” và OK.
Bạn có thể thấy rằng, tên dãy động của bạn ở ví dụ trên đã được ẩn mình phía sau hàm COUNTA là tham số Height của hàm OFFSET.
Lưu ý rằng: hàm COUNTA sẽ đếm tất cả các ô không rỗng, bao gồm cả những ô có chứa công thức nhưng trả về giá trị rỗng.
Nếu bạn có một danh sách bao gồm các dữ liệu kiểu số, và ở cuối danh sách ấy lại có lưu dữ liệu kiểu chuỗi. Tất nhiên, bạn không muốn tên dãy động của bạn có chứa kiểu dữ liệu chuỗi ấy. Hãy dùng hàm COUNT thay vì hàm COUNTA vì hàm COUNT chỉ đếm các dữ liệu kiểu số mà thôi.
Trong ví dụ dưới đây, bạn sẽ dùng tên dãy động để định nghĩa một bảng dữ liệu mà bạn muốn nó động. Để làm điều đó, hãy điền công thức sau vào dòng “Refers To:”:
=OFFSET($A$1,0,0,COUNTA($A$1:$A$100),COUNTA($1:$1))
Với công thức này, tên dãy động của bạn sẽ mở rộng không chỉ theo chiều dọc mà còn theo chiều ngang nữa. Nếu bạn chắc chắn rằng số cột của bạn là cố định, bạn có thể thay hàm COUNTA thứ hai trong công thức bằng một số nào đó.
Một vấn đề khá rắc rối khi sử dụng tên dãy động cho bảng dữ liệu là nếu cột dài nhất trong bảng lại không phải là cột A như các bảng dữ liệu phổ biến khác, bạn sẽ làm gì? Để có thể khắc phục lỗi đó, hàm MAX sẽ là một sự lựa chọn tốt. Bạn hãy tạo một bảng dữ liệu như hình dưới đây:
Nếu bạn dùng COUNTA, bạn sẽ nhận được kết quả là 3 ở cột A và điều đó sẽ dẫn đến kết quả sai. Do đó, bạn cần dùng hàm MAX như sau:
=OFFSET($A$1,0,0,MAX($1:$1),COUNTA($1:$1))
Tiếp tục đến với một ví dụ khác, danh sách số của bạn lại có các ô rỗng và điều đó khiến cho bạn không thể sử dụng hàm COUNT cũng như COUNTA, bởi vì khi sử dụng, nó sẽ ra một kết quả hoàn toàn sai so với số dòng thực sự chứa dữ liệu. Để rõ hơn, bạn hãy tạo một bảng dữ liệu khác như hình dưới đây.
Bạn thấy đấy, bạn có tất cả 10 dòng chứa dữ liệu nhưng số thứ tự chỉ có 6, và do đó, tất nhiên, hàm COUNT sẽ trả về kết quả là 6. Để khắc phục vấn đề này, bạn hãy sử dụng hàm MATCH. Hàm MATCH sẽ trả về cho bạn một vị trí tương đối của một giá trị nào đó có trong mảng mà nó khớp với điều kiện có trong hàm. Với ví dụ này, nếu bạn sử dụng hàm này như thế này: =MATCH(6,$A$1:$A$100,0), kết quả bạn nhận được sẽ là 11 vì giá trị 6 nằm ở dòng 11 trong cột A.
Một điều dễ nhận thấy rằng, khi bạn sử dụng hàm MATCH như một phần của tên dãy động, con số cuối cùng của dãy chắc chắn là không dễ nhận biết. Bởi vậy, bạn cần yêu cầu hàm MATCH trả về giá trị gần đúng con số lớn nhất bằng cách chỉnh tham số cuối cùng của hàm là 1.
Như ví dụ trên, vì bạn đã yêu cầu tìm chính xác giá trị 6, nhưng nếu bạn không biết giá trị lớn nhất là bao nhiêu, bạn hãy làm thế này: =MATCH(1E+306,$A$1:$A$100,1)
Vậy, tổng kết lại phía trên, bạn sẽ có một công thức đầy đủ để điền vào dòng “Refers To:” là =OFFSET($A$1,0,0,MATCH(1E+306,$A$1:$A$100,1),1).
Một kiểu biến thể khác, không chỉ dữ liệu kiểu số nhưng còn bao gồm cả kiểu chuỗi nữa, và tất nhiên là có cả các ô rỗng xen giữa. Như vậy, hàm MATCH sẽ được thiết kế lại như sau: MATCH("*",$A$1:$A$100,-1).
Giờ đây bạn có thể dùng công thức dưới đây để vượt qua các ô rỗng và có thể lấy được toàn bộ dữ liệu bao gồm cả kiểu số lẫn kiểu chuỗi trong bảng dữ liệu của chính bạn:
=MAX(MATCH("*",$A$2:$A$100,-1),MATCH(1E+306,$A$2:$A$100,1))
Áp dụng vào bảng dữ liệu, bạn có thể dùng công thức như sau vào tên dãy động:
=OFFSET($A$2,0,0, MAX(MATCH("*",$A$2:$A$100,-1),MATCH(1E+306,$A$2:$A$100,1)),1)
Để tổng kết lại tất cả các điều trên, giả sử chúng ta có một bảng dữ liệu trên cột A, bạn hãy tạo một cái tên dãy động theo công thức như sau:
- Nếu toàn bộ bảng là dữ liệu kiểu số: =OFFSET($A$1,0,0,COUNT($A:$A),1)
- Nếu toàn bộ bảng là dữ liệu hoặc kiểu số hoặc kiểu chuỗi hoặc cả hai: =OFFSET($A$1,0,0,COUNTA($A:$A),1)
- Nếu bảng có ô rỗng và dòng cuối cùng của bảng là một dữ liệu kiểu số: =OFFSET($A$1,0,0,MATCH(1E+306,$A:$A))
- Nếu bảng có ô rỗng và dòng cuối cùng của bảng là một dữ liệu kiểu chuỗi: =OFFSET($A$1,0,0,MATCH("*",$A:$A,-1))
Ngoài ra, bạn cũng có thể vận dụng công thức cho một số trường hợp khác như:
- Mở rộng bảng theo chiều dọc với độ dài là giá trị từ một ô khác (chẳng hạn như B1): =OFFSET($A$1,0,0,$B$1,1)
- Mở rộng bảng theo chiều dọc với độ dài là tháng hiện tại: =OFFSET($A$1,0,0,MONTH(TODAY( )),1)
- Mở rộng bảng theo chiều dọc với độ dài là thứ tự tuần hiện tại trong năm: =OFFSET($A$1,0,0,WEEKNUM(TODAY( )),1)
Tất nhiên, nó đòi hỏi bạn phải cài đặt Analysis ToolPak. Bạn có thể chọn nó bằng cách chọn nút Office -> Excel Options -> Add-ins (Excel 2003: Tools -> Add-Ins).
Một bổ sung nho nhỏ về chiêu 47 (của Lê Duy Thương), đó là để có được một dãy động có khả năng mở rộng hay thu hẹp tùy ý, bạn cũng có thể sử dụng công cụ có sẵn của Excel, đó chính là Table. Bằng cách vào thẻ Insert -> Table, bạn hãy chọn dãy nguồn và từ đó, mỗi lần bạn thêm dữ liệu vào hàng kế tiếp hàng cuối cùng của bảng, lập tức bảng sẽ "phình to" ra thêm và thậm chí, nếu bạn áp dụng với Data Validation (dùng List trỏ vào bảng nguồn, giả sử như A2:A10) thì khi bảng phình to ra, Data Validation của bạn sẽ cho nguồn là A2:A11 tương ứng.