Chris có một bảng tính lớn bao gồm một số macro. Một trong số này sẽ xóa một khối ô và di chuyển phần còn lại lên trên. Tuy nhiên, đôi khi, người dùng sẽ không sử dụng macro và thay vào đó, xóa khối theo cách thủ công. Sẽ là một thảm họa nếu việc xóa di chuyển các ô sang trái thay vì lên trên.

Chris tự hỏi liệu có cách nào sử dụng macro để thực thi việc di chuyển lên trên của các ô và loại trừ chuyển động thủ công của các ô sang trái hay không.

Như với nhiều thứ trong Excel, có nhiều cách mà bạn có thể tiếp cận vấn đề này. Tôi không thể đi quá sâu vào chi tiết cụ thể ở đây, vì bất kỳ cách tiếp cận nào được chọn cuối cùng sẽ phụ thuộc vào bản chất của thông tin trong trang tính và những gì bạn muốn cho phép hoặc không cho phép. Tuy nhiên, các phần sau đây có thể cung cấp chìa khóa mà bạn cần để chọn cách tiếp cận phù hợp nhất với mình.

Bảo vệ Trang tính

Một cách tiếp cận đơn giản (và hiệu quả) là thiết kế trang tính của bạn để nó có thể được bảo vệ. Tất nhiên, bạn sẽ đảm bảo rằng bất kỳ ô nào người dùng nhập thông tin đều không được bảo vệ, nhưng nếu không thì macro của bạn có thể đảm bảo rằng khi trang tính được kích hoạt, nó sẽ được bảo vệ.

Điều này loại trừ khả năng người dùng xóa bất kỳ ô nào khỏi trang tính theo cách thủ công.

Điều này có nghĩa là nếu phạm vi ô cần được xóa, người dùng bị buộc (bởi sự bảo vệ) chọn macro của bạn để xóa. Sau đó, macro có thể bỏ bảo vệ trang tính, xóa phạm vi ô và bảo vệ lại nó.

Intercepting Deletes

Một cách tiếp cận dựa trên macro khác là làm việc với sự kiện BeforeDelete để kiểm soát những gì thực sự xảy ra. Sau đây là một trình xử lý sự kiện đơn giản có thể là cơ sở cho những gì bạn thực sự sử dụng:

Private Sub Worksheet_BeforeDelete()

Dim delRng As Range     Dim selRng As Range

On Error Resume Next     Set delRng = Range("C2:D5")  ' Change the range to the block                                  ' of cells to be deleted (manually                                  ' or by macro)

Set selRng = Application.Selection  ' Cells selected manually                                         ' by the user     If MyRng.Address = delRng.Address Then         Selection.Delete shift:=xlUp     End If End Sub

Trình xử lý sự kiện chỉ so sánh phạm vi bạn muốn xóa trở lên với phạm vi người dùng đã chọn để xóa. Nếu các phạm vi giống nhau, thì trình xử lý sẽ xóa phạm vi và di chuyển nó lên. Rõ ràng là bạn cần phải thay đổi phạm vi được gán cho biến delRng để phù hợp với phạm vi bạn muốn theo dõi.

Ghi lại phím Xóa

Nói về xóa, bạn cũng có thể ánh xạ lại phím Delete để nó làm bất cứ điều gì bạn muốn. Tất cả những gì bạn cần làm là đưa một macro như sau vào mô-đun mã ThisWorkbook:

Private Sub Workbook_Open()

Application.OnKey "{DELETE}", "MyMacro()"

End Sub

Điều này có nghĩa là khi sổ làm việc được mở, phím Delete được ánh xạ lại để bất cứ khi nào nó được nhấn, MyMacro (thay đổi điều này thành bất kỳ macro nào bạn muốn) sẽ tự động chạy.

Lưu ý rằng cách tiếp cận này chỉ ảnh hưởng đến việc nhấn phím Delete; nó không ảnh hưởng đến việc xóa được thực hiện theo bất kỳ cách nào khác. Đối với những điều đó, các macro của bạn vẫn cần dự đoán và xử lý logic.

Phương pháp tiếp cận hoàn chỉnh

Điều đó đưa chúng ta đến cách tiếp cận hoàn chỉnh. Cách tiếp cận này đơn giản có nghĩa là lập danh sách tất cả các cách khác nhau mà người dùng có thể bắt đầu xóa và sau đó chặn các cách đó. Danh sách (và các biện pháp ngăn chặn) nhất thiết phải bao gồm một số phương pháp đã được thảo luận, chẳng hạn như xử lý phím Delete. Bạn cũng sẽ cần tìm ra cách vô hiệu hóa hoặc sửa đổi những gì xảy ra khi người dùng nhấp chuột phải hoặc khi người dùng chọn tùy chọn xóa khỏi ruy-băng.

(Bạn thậm chí có thể muốn xóa các tùy chọn liên quan đến xóa khỏi giao diện người dùng.)

Cách tiếp cận này có thể khá dài, vì một danh sách đầy đủ các phương pháp xóa có thể tốn nhiều công sức để tập hợp và xử lý.

_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 (13632) áp dụng cho Microsoft Excel 2007, 2010, 2013, 2016, 2019 và Excel trong Office 365.