Visual Basic for Applications (VBA) là một bộ phận của ngôn ngữ lập trình Visual Basic dành riêng để soạn thảo các lệnh macro trong bộ Office, giúp tăng cường sức mạnh và tự động hóa một số công việc lặp đi lặp lại. Sẽ là một thuận lợi lớn nếu bạn hiểu rõ cách thức VBA tham chiếu đến địa chỉ cell trong Excel. Bài viết này giới thiệu các thuộc tính (property) và phương thức (method) trong VBA liên quan đến tham chiếu địa chỉ cell.
Thuộc tính RANGE
Thuộc tính Range trả về một đối tượng, có thể là một cell đơn lẻ hoặc một dãy gồm nhiều cell. Trong lệnh gán giá trị của cell A1 vào cell A5 đưới đây, Range trả về giá trị chỉ gồm 1 cell:Worksheets("Sheet1").Range("A5").Value = Worksheets("Sheet1").Range("A1").Value
Khi dùng với kiểu không xác định, Range trả về một dãy cell trên sheet đang hoạt động. Để tránh kiểu "Râu ông nọ cắm cằm bà kia", bạn hãy kích hoạt một bảng tính bằng phương pháp Activate trước khi dùng thuộc tính Range mà không cần chỉ ra giới hạn cụ thể. Sau đây là cách điền vào vùng A1:H8 các số ngẫu nhiên bằng cách đặt công thức cho mỗi ô trong dãy mà trước đó sheet1 đã được kích hoạt:
Worksheets("sheet1").Activate
Range("A1:H8").Formula = "=rand()"
Bạn cũng có thể đặt tên cho dãy cell và chỉ cho VBA tham chiếu đến tên này. Ví dụ, bạn ra lệnh xóa nội dung của một dãy có tên "Criteria" bằng cách:
Worksheets(1).Range("criteria").ClearContents
Nếu bạn sử dụng một đối số (argument) mà đối số đó là địa chỉ dãy cell, bạn phải định rõ địa chỉ đó theo kiểu A1 (dùng kiểu R1C1 máy sẽ báo lỗi).
Thuộc tính Cells
Thuộc tính Cells sử dụng cú pháp Cells(row,column), với row là chỉ số hàng và column là chỉ số cột, để trả về một cell đơn lẻ. Chẳng hạn, bạn có thể gán giá trị 24 cho cell A1 bằng lệnh:
Worksheets(1).Cells(1, 1).Value = 24
Và gán một công thức cho cell A2:
ActiveSheet.Cells(2, 1).Formula = "=sum(b1:b5)"
Cho dù bạn có thể dùng công thức Range("A1") để trả về cell A1 (không hề sai!), nhưng dùng thuộc tính Cells thì tiện lợi hơn bởi bạn có thể sử dụng một biến số đại diện cho hàng hoặc cột phục vụ yêu cầu lập trình. Bạn hãy tham khảo ví dụ tạo tiêu đề cột và hàng trên Sheet1 sau đây, lưu ý sau khi bảng tính đã được kích hoạt, thuộc tính Cells có thể được sử dụng thoải mái mà không cần khai báo một sheet cụ thể nào vì nó trả về một cell trên sheet hoạt động.
Sub SetUpTable()
Worksheets("sheet1").Activate
For theYear = 1 To 5
Cells(1, theYear + 1).Value = 1990 + theYear
Next theYear
For theQuarter = 1 To 4
Cells(theQuarter + 1, 1).Value = "Q" & theQuarter
Next theQuarter
End Sub
Mặc dù bạn có thể sử dụng những hàm xử lý chuỗi của Visual Basic để thay đổi tham chiếu kiểu A1, nhưng để dễ hiểu hơn và rèn luyện kỹ năng lập trình của mình, bạn nên sử dụng kiểu Cells(1, 1).
Nếu bạn sử dụng cú pháp expression.Cells(row,column), với expression là một biểu thức trả về một đối tượng Range, và row và column là vị trí tương đối so với góc trên trái của dãy cell thì kết quả trả về là một bộ phận của dãy. Trong ví dụ dưới đây, VBA chỉ đến Cell(1,1) tức là cell C5 trên bảng tính:
Worksheets(1).Range("c5:c10").Cells(1, 1).Formula = "=rand()
Kết hợp Range and Cells
Phối hợp Range và Cells để tham chiếu đến một dãy cell, bạn hãy sử dụng cú pháp Range(cell 1, cell 2), với cell 1 và cell 2 là cell bắt đầu và cell kết thúc của dãy. Để đặt kiểu đường viền cho các cell bạn dùng lệnh sau:
With Worksheets(1)
.Range(.Cells(1, 1), .Cells(10, 10)).Borders.LineStyle = xlThick
End With
Ở đây cần lưu ý đến dấu chấm đằng trước thuộc tính Cells. Dấu chấm này quy định Worksheets(1) mà With đã nêu trước đó được áp dụng cho thuộc tính Cells để tiết kiệm chỗ và làm cho câu lệnh gọn hơn (nếu không có dấu chấm, thuộc tính Cells trả về các cell trên sheet hoạt động).
Thuộc tính Offset
VBA dùng thuộc tính Offset(r,c) để di chuyển đến một cell khác có vị trí cách r hàng và c cột so với cell hiện hành. Ví dụ dưới đây chọn một cell cách cell góc trên bên trái vùng hiện hành 3 hàng về phía dưới và 1 cột về bên phải. Bạn không thể chọn một cell không nằm trong sheet hoạt động, vì vậy trước đó bạn phải kích hoạt bảng tính bằng lệnh Activate.
Worksheets("sheet1").Activate
Selection.Offset(3, 1).Range("a1").Select
Phương thức Union
VBA sử dụng Union(range1, range2,...) để trả về một vùng hỗn hợp - là các vùng gồm hai hoặc nhiều khối cell tách biệt nhau. Trong ví dụ dưới, một đối tượng được định nghĩa gồm 2 vùng A1:B2 và C3:D4, sau đó chọn vùng đã được định nghĩa.
Dim r1 As Range, r2 As Range, myMultiAreaRange As Range
Worksheets("sheet1").Activate
Set r1 = Range("A1:B2")
Set r2 = Range("C3:D4")
Set myMultiAreaRange = Union(r1, r2)
myMultiAreaRange.Select
Nếu bạn làm việc với các vùng chọn chứa hai hay nhiều hơn một dãy cell, thuộc tính Areas rất hữu ích. Nó chia một vùng chọn hỗn hợp thành các đối tượng Range riêng biệt và sau đó trả về tập hợp các đối tượng đó. Bạn có thể sử dụng thuộc tính Count trên tập hợp đuợc trả về để kiểm tra một vùng chọn có chứa nhiều hơn một dãy cell hay không, như ví dụ sau đây:
Sub NoMultiAreaSelection()
numberOfSelectedAreas = Selection.Areas.Count
If numberOfSelectedAreas > 1 Then
MsgBox "You cannot carry out this command " & _
"on multi-area selections"
End If
End Sub.