Trước khi bạn đọc bài này xin bạn vui lòng đọc bài sau trên báo PCWorld VN
http://www.pcworld.com.vn/pcworld/magazine.asp?t=mzdetail&atcl_id=5f5e5c565b5f5d
LÀM VIỆC VỚI ĐỐI TƯỢNG RANGETại sao lại làm việc với đối tượng Range? Nếu các bạn đọc nhiều sách viết về VBA, không ít thì nhiều các Tác giả đều chú trọng đến đối tượng Range. Cũng dễ hiểu thôi, vì khi làm việc với VBA trong Excel thì đây là đối tượng bạn phải thường xuyên làm việc. Nếu bạn hiểu rỏ đối tượng này thì bạn sẽ thao tác VBA trong Excel để giải quyết được nhiều vấn đề.
Bạn có thể xem định nghĩa của đối tượng này trong Help, ở đây tôi xin giới thiệu một cách đơn giản để bạn dễ hiểu đối tượng này thôi. Đối tượng Range có thể là một ô (cell) hay nhiều ô trong một worksheet.
Bạn có thể tham chiếu đến đối tượng này như sau:
Range("A1:C5")
Nếu bạn đã tạo ra tên của đối tượng Range, thì bạn có thể tham chiếu như sau:
Range("PriceList")
(Để tạo tên của một vùng, bạn dùng Insert→Name→Define)
Bạn có thể tham chiếu đến vùng không nằm trong ActiveWorksheet như sau:
Worksheets("Sheet1").Range("A1:C5")
Bạn cũng có thể tham chiếu đến đối tượng Range không ở ActiveWorkbook như sau
Workbooks("Budget.xls").Worksheets("Sheet1").Range("A1:C5")
Đối tượng Range, có thể bao gồm một hay nhiều hàng
Range("3:3")
Trong trường hợ trên là tham chiếu đến hàng thứ 3.
Tương tự bạn có thể tham chiếu đến nhiều cột
Range("D")
Bạn cũng có thể làm việc với nhiều ô không liên tục.
Range("A1:B8,D9:G16")
Cuối cùng khi ta nói đến đối tượng Range, thì có nghĩa cũng giống như những đối tượng khác cũng có các thuộc tính (properties) và phương thức (method).
Một số cách tham chiếu đến đối tượng Range khác
Thuộc tính Cells
Ngòai cách dùng Range (keyword) bạn cũng có thể tham chiếu đến Range, thông qua thuộc tính Cells.
Thuộc tính Cells dùng 2 đối số (argument): row và column. Ví dụ sau tham chiếu đến ô C2 ở Sheet2:
Worksheets("Sheet2").Cells(2,3)
Bạn cũng có thể dùng thuộc tính Cells để tham chiếu đến nhiều ô như sau:
Range(Cells(1,1),Cells(10,10))
Ví dụ trên tham chiếu đến 100 ô, từ ô A1(hàng 1, cột 1) đến ô J10(hàng 10, cột 10)
Hai ví dụ sau cho cùng một kết quả:
Range("A1:J10").Value=99
Range(Cells(1,1),Cells(10,10)).Value=99
Nó gán giá trị 99 cho các ô trong vùng qua thuộc tính Value.
Thuận lợi của việc dùng thuộc tính Cells là bạn không cần phải đặt chính xác như "A1:J10", mà bạn có thể truyền tham số hàng và cột như ví dụ ở trên.
Thuộc tính Offset
Cũng tương tự như thuộc tính Cells ở trên thuộc tính Offset cũng dùng 2 đối số. Đối số thứ nhất: số hàng để di chuyển đi. Đối số thứ hai: số cột để di chuyển đi.
Ví dụ từ ô A1 bạn di chuyển xuống dưới 1 hàng và di chuyển qua bên phải 2 cột (tức là ô C2), được thể hiện như sau:
Range("A1").Offset(1,2)
Nếu bạn truyền cho đối số thứ nhất giá trị âm, có nghĩa là bạn di chuyển về phía bên trên. Nếu bạn truyền cho đối số thứ hai giá trị âm, có nghĩa là bạn di chuyển về phía bên trái. Ví dụ ngược lại với ở trên:
Range("C2").Offset(-1,-2)
Tức là tham chiếu đến ô A1. Ở đây bạn cũng chú ý là nếu bạn truyền tham số dẫn đến ô không thực (ví dụ nằm trên ô A1 chẳng hạn!) thì sẽ báo lỗi.
Và dĩ nhiên bạn cũng có thể truyền giá trị 0 cho hai đối số.
Dùng thuộc tính Offset là một cách hữu ích khi bạn truyền tham số chứ không phải một giá trị chính xác nào.
Tham chiếu đến các hàng và các cột
Bạn có thể tham chiếu đến một khỏang bao gồm một hay nhiều cột như sau:
Columns("A:C")
Hay tham chiếu đến nhiều hàng như sau:
Rows("1:5")
Một số thuộc tính hữu ích của đối tượng Range
Đối tượng Range có rất nhiều thuộc tính. Ở đây tôi chỉ xin giới thiệu một số thuộc tính hữu ích và hay dùng.
Chú ý: một số thuộc tính là read-only, điều này có nghĩa là bạn không thể thay đổi nó. Ví dụ, mỗi đối tượng Range có thuộc tính Address bạn có thể tham chiếu đến nó nhưng không thể thay đổi.
Thuộc tính Value
Thuộc tính Value đại diện cho giá trí được chứa trong một ô. Đây là thuộc tính read-write.
Ví dụ sau thể hiện giá trị chứa trong ô A1 tại Sheet1:
Msgbox Worksheets("Sheet1").Range("A1").Value
Bạn chỉ có thể đọc giá trị tại một ô, do đó nếu bạn viết như đọan mã sau sẽ gây ra lỗi:
Msgbox Worksheets("Sheet1").Range("A1:C3").Value
Tuy nhiên bạn có thể gán giá trị cho nhiều ô cùng một lúc như sau:
Worksheets("Sheet1").Range("A1:C3").Value=123
Đây là thuộc tính mặc định của đối tượng Range, do đó hai đọan mã sau sẽ cho giá trị như nhau:
Worksheets("Sheet1").Range("A1").Value=75
Worksheets("Sheet1").Range("A1")=75
Thuộc tính Text
Thuộc tính Text trả về một chuổi đại diện cho chữ (text) được thể hiện trong một ô, chú ý giá trị text này đã được định dạng. Đây là thuộc tính read-only. Giả sử ô A1 chứa giá trị 12.3, nhưng đã được định dạng để thể hiện $12.3. Ví dụ sau sẽ thông báo giá trị $12.3 của ô A1.
Msgbox Worksheets("Sheet1").Range("A1").Text
Nhưng ví dụ sau đây chỉ thể hiện giá trị 12.3
Msgbox Worksheets("Sheet1").Range("A1").Value
Thuộc tính Count
Thuộc tính này trả về giá trị là số lượng ô trong một khỏang (tất cả các ô chứ không phải chỉ các ô rỗng). Đây là thuộc tính read-only.
Thuộc tính Column và Row
Thuộc tính Column trả về giá trị được đại diện cho cột của một ô. Tương tự thuộc tính Row trả về giá trị được đại diện cho hàng của một ô. Hai thuộc tính này thuộc dạng read-only.
Ví dụ sau sẽ thông báo giá trị là 6:
Msgbox Sheest("Sheet1").Range("F3").Column
Ví dụ sau sẽ thông báo giá trị là 3:
Msgbox Sheest("Sheet1").Range("F3").Column
Chú ý: Nếu có nhiều ô trong một khỏang thì thuộc tính Column sẽ trả về giá trị thể hiện cột đầu tiên của khỏang đó. Tương tự với thuộc tính Row trong trường hợp này. Bạn đừng có nhầm lẫn giữa thuộc tính Column và Columns hay Row và Rows.
Thuộc tính Address
Thuộc tính Address là thuộc tính dạng read-only, thể hiện địa chỉ của ô đối với đối tượng Range theo dạng địa chỉ tuyệt đối (absolute notation). Ví dụ sau đây sẽ cho kết quả là $A$1:$E$5
Msgbox Range(Cells(1,1),Cells(5,5)).Address
Thuộc tính HasFormula
Thuộc tính này thuộc dạng read-only, thuộc tính này trả về giá trị True nếu một ô (single-cell) có chứa công thức, ngược lại trả về False. Nếu một khỏang có nhiều hơn một ô, thì VBA sẽ chỉ trả về True nếu tất cả các ô trong khỏang này đều có chứa công thức. Nếu có những ô trong một khỏang có công thức và các ô khác không có công thức thì thuộc tính này trả về Null.
Chú ý bạn khai báo biến dùng cho thuộc tính này, nếu không sẽ tạo ra lỗi sai kiểu dữ liệu.
Thuộc tính Font
Như bạn cũng đã biết, thuộc tính có thể trả về một đối tượng. Đối tượng Font có nhiều thuộc tính hữu ít cho việc định dạng.
Ví dụ sau trả về đối tượng Font của một khỏang:
Range("A1").Font
Ví dụ sau thiết lập thuộc tính Bold (kiểu chữ in đậm) của đối tượng Font của một khỏang:
Range("A1").Font.Bold=True
Thuộc tính Interior
Thuộc tính này cũng tương tự như thuộc tính Font ở trên sẽ trả về đối tượng Interior.
Ví dụ sau, sẽ thay đổi màu background của ô A1 sang màu đỏ (màu đỏ có ColorIndex=3)
Range("A1").Interior.ColorIndex=3
ColorIndex sẽ có giá trị từ 1 đến 56 tương tự với các màu trong bảng màu của Excel. Để dễ nhớ, bạn cũng có thể dùng các giá trị hằng số như: vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan hay vbWhite.
Thuộc tính Formula
Thuộc tính Formula đại diện cho công thức trong một ô. Đây là thuộc tính dạng read-write. Ví dụ sau đưa công thức tính tổng vào ô A13:
Range("A13").Formula= "=Sum(A1:A12)"
Chú ý rằng công thức là chuỗi ký tự và được nằm trong dấu ngoặc kép "
Thuộc tính NumberFormat
Thuộc tính NumberFormat đại diện cho định dạng số của đối tượng Range (chú ý là chuỗi ký tự) như ví dụ sau:
Columns("A:A").NumberFormat="0.00%"
Đây là thuộc tính dạng read-write.
http://www.pcworld.com.vn/pcworld/magazine.asp?t=mzdetail&atcl_id=5f5e5c565b5f5d
LÀM VIỆC VỚI ĐỐI TƯỢNG RANGETại sao lại làm việc với đối tượng Range? Nếu các bạn đọc nhiều sách viết về VBA, không ít thì nhiều các Tác giả đều chú trọng đến đối tượng Range. Cũng dễ hiểu thôi, vì khi làm việc với VBA trong Excel thì đây là đối tượng bạn phải thường xuyên làm việc. Nếu bạn hiểu rỏ đối tượng này thì bạn sẽ thao tác VBA trong Excel để giải quyết được nhiều vấn đề.
Bạn có thể xem định nghĩa của đối tượng này trong Help, ở đây tôi xin giới thiệu một cách đơn giản để bạn dễ hiểu đối tượng này thôi. Đối tượng Range có thể là một ô (cell) hay nhiều ô trong một worksheet.
Bạn có thể tham chiếu đến đối tượng này như sau:
Range("A1:C5")
Nếu bạn đã tạo ra tên của đối tượng Range, thì bạn có thể tham chiếu như sau:
Range("PriceList")
(Để tạo tên của một vùng, bạn dùng Insert→Name→Define)
Bạn có thể tham chiếu đến vùng không nằm trong ActiveWorksheet như sau:
Worksheets("Sheet1").Range("A1:C5")
Bạn cũng có thể tham chiếu đến đối tượng Range không ở ActiveWorkbook như sau
Workbooks("Budget.xls").Worksheets("Sheet1").Range("A1:C5")
Đối tượng Range, có thể bao gồm một hay nhiều hàng
Range("3:3")
Trong trường hợ trên là tham chiếu đến hàng thứ 3.
Tương tự bạn có thể tham chiếu đến nhiều cột
Range("D")
Bạn cũng có thể làm việc với nhiều ô không liên tục.
Range("A1:B8,D9:G16")
Cuối cùng khi ta nói đến đối tượng Range, thì có nghĩa cũng giống như những đối tượng khác cũng có các thuộc tính (properties) và phương thức (method).
Một số cách tham chiếu đến đối tượng Range khác
Thuộc tính Cells
Ngòai cách dùng Range (keyword) bạn cũng có thể tham chiếu đến Range, thông qua thuộc tính Cells.
Thuộc tính Cells dùng 2 đối số (argument): row và column. Ví dụ sau tham chiếu đến ô C2 ở Sheet2:
Worksheets("Sheet2").Cells(2,3)
Bạn cũng có thể dùng thuộc tính Cells để tham chiếu đến nhiều ô như sau:
Range(Cells(1,1),Cells(10,10))
Ví dụ trên tham chiếu đến 100 ô, từ ô A1(hàng 1, cột 1) đến ô J10(hàng 10, cột 10)
Hai ví dụ sau cho cùng một kết quả:
Range("A1:J10").Value=99
Range(Cells(1,1),Cells(10,10)).Value=99
Nó gán giá trị 99 cho các ô trong vùng qua thuộc tính Value.
Thuận lợi của việc dùng thuộc tính Cells là bạn không cần phải đặt chính xác như "A1:J10", mà bạn có thể truyền tham số hàng và cột như ví dụ ở trên.
Thuộc tính Offset
Cũng tương tự như thuộc tính Cells ở trên thuộc tính Offset cũng dùng 2 đối số. Đối số thứ nhất: số hàng để di chuyển đi. Đối số thứ hai: số cột để di chuyển đi.
Ví dụ từ ô A1 bạn di chuyển xuống dưới 1 hàng và di chuyển qua bên phải 2 cột (tức là ô C2), được thể hiện như sau:
Range("A1").Offset(1,2)
Nếu bạn truyền cho đối số thứ nhất giá trị âm, có nghĩa là bạn di chuyển về phía bên trên. Nếu bạn truyền cho đối số thứ hai giá trị âm, có nghĩa là bạn di chuyển về phía bên trái. Ví dụ ngược lại với ở trên:
Range("C2").Offset(-1,-2)
Tức là tham chiếu đến ô A1. Ở đây bạn cũng chú ý là nếu bạn truyền tham số dẫn đến ô không thực (ví dụ nằm trên ô A1 chẳng hạn!) thì sẽ báo lỗi.
Và dĩ nhiên bạn cũng có thể truyền giá trị 0 cho hai đối số.
Dùng thuộc tính Offset là một cách hữu ích khi bạn truyền tham số chứ không phải một giá trị chính xác nào.
Tham chiếu đến các hàng và các cột
Bạn có thể tham chiếu đến một khỏang bao gồm một hay nhiều cột như sau:
Columns("A:C")
Hay tham chiếu đến nhiều hàng như sau:
Rows("1:5")
Một số thuộc tính hữu ích của đối tượng Range
Đối tượng Range có rất nhiều thuộc tính. Ở đây tôi chỉ xin giới thiệu một số thuộc tính hữu ích và hay dùng.
Chú ý: một số thuộc tính là read-only, điều này có nghĩa là bạn không thể thay đổi nó. Ví dụ, mỗi đối tượng Range có thuộc tính Address bạn có thể tham chiếu đến nó nhưng không thể thay đổi.
Thuộc tính Value
Thuộc tính Value đại diện cho giá trí được chứa trong một ô. Đây là thuộc tính read-write.
Ví dụ sau thể hiện giá trị chứa trong ô A1 tại Sheet1:
Msgbox Worksheets("Sheet1").Range("A1").Value
Bạn chỉ có thể đọc giá trị tại một ô, do đó nếu bạn viết như đọan mã sau sẽ gây ra lỗi:
Msgbox Worksheets("Sheet1").Range("A1:C3").Value
Tuy nhiên bạn có thể gán giá trị cho nhiều ô cùng một lúc như sau:
Worksheets("Sheet1").Range("A1:C3").Value=123
Đây là thuộc tính mặc định của đối tượng Range, do đó hai đọan mã sau sẽ cho giá trị như nhau:
Worksheets("Sheet1").Range("A1").Value=75
Worksheets("Sheet1").Range("A1")=75
Thuộc tính Text
Thuộc tính Text trả về một chuổi đại diện cho chữ (text) được thể hiện trong một ô, chú ý giá trị text này đã được định dạng. Đây là thuộc tính read-only. Giả sử ô A1 chứa giá trị 12.3, nhưng đã được định dạng để thể hiện $12.3. Ví dụ sau sẽ thông báo giá trị $12.3 của ô A1.
Msgbox Worksheets("Sheet1").Range("A1").Text
Nhưng ví dụ sau đây chỉ thể hiện giá trị 12.3
Msgbox Worksheets("Sheet1").Range("A1").Value
Thuộc tính Count
Thuộc tính này trả về giá trị là số lượng ô trong một khỏang (tất cả các ô chứ không phải chỉ các ô rỗng). Đây là thuộc tính read-only.
Thuộc tính Column và Row
Thuộc tính Column trả về giá trị được đại diện cho cột của một ô. Tương tự thuộc tính Row trả về giá trị được đại diện cho hàng của một ô. Hai thuộc tính này thuộc dạng read-only.
Ví dụ sau sẽ thông báo giá trị là 6:
Msgbox Sheest("Sheet1").Range("F3").Column
Ví dụ sau sẽ thông báo giá trị là 3:
Msgbox Sheest("Sheet1").Range("F3").Column
Chú ý: Nếu có nhiều ô trong một khỏang thì thuộc tính Column sẽ trả về giá trị thể hiện cột đầu tiên của khỏang đó. Tương tự với thuộc tính Row trong trường hợp này. Bạn đừng có nhầm lẫn giữa thuộc tính Column và Columns hay Row và Rows.
Thuộc tính Address
Thuộc tính Address là thuộc tính dạng read-only, thể hiện địa chỉ của ô đối với đối tượng Range theo dạng địa chỉ tuyệt đối (absolute notation). Ví dụ sau đây sẽ cho kết quả là $A$1:$E$5
Msgbox Range(Cells(1,1),Cells(5,5)).Address
Thuộc tính HasFormula
Thuộc tính này thuộc dạng read-only, thuộc tính này trả về giá trị True nếu một ô (single-cell) có chứa công thức, ngược lại trả về False. Nếu một khỏang có nhiều hơn một ô, thì VBA sẽ chỉ trả về True nếu tất cả các ô trong khỏang này đều có chứa công thức. Nếu có những ô trong một khỏang có công thức và các ô khác không có công thức thì thuộc tính này trả về Null.
Chú ý bạn khai báo biến dùng cho thuộc tính này, nếu không sẽ tạo ra lỗi sai kiểu dữ liệu.
Thuộc tính Font
Như bạn cũng đã biết, thuộc tính có thể trả về một đối tượng. Đối tượng Font có nhiều thuộc tính hữu ít cho việc định dạng.
Ví dụ sau trả về đối tượng Font của một khỏang:
Range("A1").Font
Ví dụ sau thiết lập thuộc tính Bold (kiểu chữ in đậm) của đối tượng Font của một khỏang:
Range("A1").Font.Bold=True
Thuộc tính Interior
Thuộc tính này cũng tương tự như thuộc tính Font ở trên sẽ trả về đối tượng Interior.
Ví dụ sau, sẽ thay đổi màu background của ô A1 sang màu đỏ (màu đỏ có ColorIndex=3)
Range("A1").Interior.ColorIndex=3
ColorIndex sẽ có giá trị từ 1 đến 56 tương tự với các màu trong bảng màu của Excel. Để dễ nhớ, bạn cũng có thể dùng các giá trị hằng số như: vbBlack, vbRed, vbGreen, vbYellow, vbBlue, vbMagenta, vbCyan hay vbWhite.
Thuộc tính Formula
Thuộc tính Formula đại diện cho công thức trong một ô. Đây là thuộc tính dạng read-write. Ví dụ sau đưa công thức tính tổng vào ô A13:
Range("A13").Formula= "=Sum(A1:A12)"
Chú ý rằng công thức là chuỗi ký tự và được nằm trong dấu ngoặc kép "
Thuộc tính NumberFormat
Thuộc tính NumberFormat đại diện cho định dạng số của đối tượng Range (chú ý là chuỗi ký tự) như ví dụ sau:
Columns("A:A").NumberFormat="0.00%"
Đây là thuộc tính dạng read-write.