John có một macro thực hiện một số xử lý trên các trang tính khác nhau trong sổ làm việc. Anh ta muốn, ở đầu macro, lưu phạm vi ô (hoặc một ô) mà người dùng đã chọn. Anh ấy sử dụng ActiveCell.Address để xác định điều này. Sau đó, ở cuối macro, anh ta muốn trả lại cho người dùng cùng phạm vi đã chọn mà họ đã chọn ban đầu.

Vấn đề là, macro có thể được hoàn thành trên một trang tính hoàn toàn khác với nơi người dùng bắt đầu và ActiveCell.Address chỉ cung cấp địa chỉ ô chứ không phải tên trang tính và chắc chắn không phải là một dải ô. John băn khoăn về cách tốt nhất để lưu trữ những gì anh ta cần để anh ta có thể quay lại vị trí ban đầu của người dùng ở cuối macro.

Để có cơ hội tốt nhất đưa ai đó trở lại nơi họ bắt đầu, có ba yếu tố: sổ làm việc, trang tính và ô. Trên thực tế, phần tử cuối cùng này (ô) có thể hơi đơn giản, vì người dùng sẽ luôn chọn một ô (đây là ô được trả về bởi ActiveCell.Address), nhưng cũng có thể có một dải ô được chọn.

Đây là cách bạn nhận được tất cả bốn mục:

Dim rngOrigSelection As Range Dim rngOrigCell As Range Dim sOrigWS As String Dim sOrigWB As String

Set rngOrigSelection = Selection Set rngOrigCell = ActiveCell sOrigWS = ActiveSheet.Name sOrigWB = ActiveWorkbook.Name

Khi bạn muốn đưa người dùng trở lại vị trí của họ sau này, bạn có thể sử dụng loại mã này:

Workbooks(sOrigWB).Activate Sheets(sOrigWS).Select rngOrigSelection.Select rngOrigCell.Activate

Tất nhiên, Excel luôn có nhiều cách để bạn có thể hoàn thành bất kỳ nhiệm vụ nào. Trong trường hợp này, bạn có thể rút ngắn mã của mình bằng cách chỉ nhớ ô đang hoạt động và phạm vi đã chọn:

Dim rngOrigSelection As Range Dim rngOrigCell As Range

Set rngOrigSelection = Selection Set rngOrigCell = ActiveCell

Khi bạn muốn khôi phục người dùng về vị trí, bạn dựa vào đối tượng Parent có sẵn trong VBA:

rngOrigSelection.Parent.Parent.Activate rngOrigSelection.Parent.Select rngOrigSelection.Select rngOrigCell.Activate

Đối tượng Gốc của phạm vi lựa chọn mà bạn đã lưu là trang tính trong đó phạm vi đó được đặt và Đối tượng chính của đối tượng Gốc đó là sổ làm việc chứa trang tính.

Một cách tiếp cận khác là chỉ cần tạo, trong macro của bạn, một phạm vi được đặt tên đề cập đến bất kỳ thứ gì người dùng đã chọn:

ActiveWorkbook.Names.Add Name:="MyOrigPlace", RefersTo:=Selection

Sau khi xử lý xong, khi bạn sẵn sàng quay lại những gì người dùng đã chọn, bạn sử dụng mã này:

Application.Goto Reference:="MyOrigPlace"

ActiveWorkbook.Names("MyOrigPlace").Delete

Dòng đầu tiên quay lại vùng chọn và dòng thứ hai sau đó xóa phạm vi đã đặt tên. Hạn chế duy nhất của phương pháp này là ô hoạt động không được giữ lại; mã giả định rằng bạn muốn ô phía trên bên trái trong phạm vi là ô hoạt động khi hoàn tất. Bạn cũng nên biết rằng nếu quá trình xử lý của bạn xóa các ô tạo nên dải ô đã đặt tên, thì mã có thể không hoạt động bình thường — Excel không thể chuyển đến một nơi không còn tồn tại.

Tất nhiên, bạn có thể không phải nhớ bất kỳ vị trí nào, nếu bạn viết mã macro của mình một cách chính xác. Trong khi VBA cho phép bạn “di chuyển xung quanh” và chọn các khu vực khác nhau của trang tính và sổ làm việc của bạn, trong hầu hết các trường hợp, điều này không cần thiết. Ví dụ: bạn có thể chỉ cần làm việc với các phạm vi khác nhau và sau đó thực hiện công việc của mình trên các phạm vi đó mà không bao giờ thay đổi lựa chọn hiện tại hoặc ô đang hoạt động. Thật vậy, VBA cho phép bạn thay đổi, định dạng lại, sắp xếp, xóa và làm hầu hết mọi thứ bạn có thể tưởng tượng đối với các ô mà không thực sự cần phải chọn chúng.

_Lưu ý: _

Nếu bạn muốn biết cách sử dụng các macro được mô tả trên trang này (hoặc trên bất kỳ trang nào khác trên trang ExcelTips), tôi đã chuẩn bị một trang đặc biệt bao gồm thông tin hữu ích.

ExcelTips là nguồn của bạn để đào tạo Microsoft Excel hiệu quả về chi phí.

Mẹo này (6161) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365. Bạn có thể tìm thấy phiên bản của mẹo này cho giao diện menu cũ hơn của Excel tại đây: