克里斯在工作中有一个很大的工作表,其中包含几个宏。其中一个删除一个单元格块,其余的向上移动。但是,有时用户不会使用宏,而是手动删除该块。如果删除将单元格向左移动而不是向上移动,将是一场灾难。

克里斯想知道是否存在一种使用宏来强制单元向上移动并阻止单元向左手动移动的方法。

与Excel中的许多其他功能一样,可以采用多种方法来解决此问题。我在这里不能做得太详细,因为最终选择的任何方法都将取决于工作表中信息的性质以及您要允许或不允许的内容。但是,以下各节可能会提供选择最适合您的方法所需的密钥。

保护工作表

一种简单(有效)的方法是设计工作表,以便对其进行保护。当然,您将确保用户应在其中输入信息的任何单元格都不受保护,但是否则,您的宏可以确保在激活工作表时对其进行保护。

这排除了用户手动从工作表中删除任何单元格的可能性。

这意味着,如果确实需要删除单元格范围,则用户(受保护)被迫选择要删除的宏。宏然后可以取消保护工作表,删除单元格的范围,然后重新保护它。

拦截删除_

另一种基于宏的方法是与BeforeDelete事件一起使用,以控制实际发生的情况。以下是一个简单的事件处理程序,它可能是您实际使用的基础:

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

事件处理程序仅将您要删除的范围仅与用户选择删除的范围进行向上比较。如果范围相同,则处理程序将删除该范围并将其向上移动。显然,您需要更改分配给delRng变量的范围,以匹配您要监视的范围。

重新映射删除键

说到删除,您还可以重新映射Delete键,以便它可以执行您想要的任何操作。您需要做的就是在ThisWorkbook代码模块中包含一个类似于以下内容的宏:

Private Sub Workbook_Open()

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

End Sub

这意味着在打开工作簿时,将重新映射Delete键,以便每当按下该键时,都会自动运行MyMacro(将其更改为所需的任何宏)。

请注意,此方法仅影响按Delete键。它不会影响以任何其他方式完成的删除。对于这些,您的宏仍将需要预料并处理逻辑。

完整的方法

这使我们采用了完整的方法。该方法仅意味着列出用户可以发起删除然后拦截这些方式的所有各种方式。该列表(和拦截)必须包含一些已经讨论过的方法,例如处理Delete键。您还需要弄清楚如何禁用或修改用户右键单击或用户从功能区中选择删除选项时发生的情况。

(您甚至可能希望从用户界面中删除与删除有关的选项。)

这种方法可能会很长,因为删除方法的详尽列表可能很难整理和处理。

注意:

如果您想知道如何使用此页面(或_ExcelTips_网站上的任何其他页面)中描述的宏,我准备了一个特殊页面,其中包含有用的信息。

_ExcelTips_是您进行经济高效的Microsoft Excel培训的来源。

本技巧(13632)适用于Microsoft Excel 2007、2010、2013、2016、2019和Office 365中的Excel。