excel - 如果内容被用户删除,则使用 VBA 填充单元格

标签 excel vba

我正在为我的同事设计一份时间报告。有些单元格包含(隐藏)公式但不 protected ,因为我需要用户仍然能够手动覆盖公式。

现在,如果用户输入他/她自己的内容,然后再次删除它,则单元格为空,这是我不想要的,因为它只会导致困惑。

我想编写一个 VBA 宏,它可以识别先前声明的范围中的单元格内容是否被删除/为空,如果它们被删除/为空,则应将另一个(受密码保护和隐藏)单元格中的公式复制到空单元格。

Private Sub Worksheet_Change(ByVal Target As Range)
Dim myRange As Range
Set myRange = Intersect(Range("F9:I108"), Target)    
If Not myRange Is Nothing Then

'I'm guessing something with WorksheetFunction and possibly CountA,
'but I don't know how to make it work

End If
End Sub

删除一个单元格(或多个单元格)的内容时应输入的公式始终位于第 117 行(同一工作表)。例如,如果用户删除 G50,则应将 G117 的公式复制到 G50 中,就像通常在 Excel 中复制公式一样(因此,如果 G117 中存在指向 A117 的非 $ 引用,则它应该指向 A50将公式复制到G50后)。

如果可能的话,我希望在没有循环的情况下工作——它们总是需要很长时间才能执行。

提前致谢!

最佳答案

这是一个 super 简单的示例,仅涉及 3 个单元格、A1A2 A3。您必须修改它以适应您的公式单元格。

我们首先创建一个 secret 工作表(称为 secret )。我们将主工作表中从 A1A3 的公式放入 secret 工作表中,但我们将它们存储为字符串而不是公式:

enter image description here

然后我们将以下工作表事件宏放入主工作表中:

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim rng As Range
    Set rng = Range("A1:A3")

    If Intersect(Target, rng) Is Nothing Then Exit Sub
    If Target.Count <> 1 Then Exit Sub
    If Target.Value <> "" Then Exit Sub

    Application.EnableEvents = False
        Target.Formula = Sheets("secret").Range(Target.Address).Value
    Application.EnableEvents = True

End Sub

子监视三个单元格的更改,如果其中任何一个单元格被清除,该公式将从 secret 工作表中恢复。

因为它是工作表代码,所以非常容易安装并且自动使用:

  1. 右键单击 Excel 窗口底部附近的选项卡名称
  2. 选择查看代码 - 这将打开一个 VBE 窗口
  3. 粘贴内容并关闭 VBE 窗口

如果您有任何疑问,请首先在试用工作表上尝试。

如果保存工作簿,宏将随之保存。 如果您使用 2003 年以后的 Excel 版本,则必须保存 文件为 .xlsm 而不是 .xlsx

删除宏:

  1. 如上所示调出 VBE 窗口
  2. 清除代码
  3. 关闭 VBE 窗口

要了解有关宏的更多一般信息,请参阅:

http://www.mvps.org/dmcritchie/excel/getstarted.htm

http://msdn.microsoft.com/en-us/library/ee814735(v=office.14).aspx

要了解有关事件宏(工作表代码)的更多信息,请参阅:

http://www.mvps.org/dmcritchie/excel/event.htm

必须启用宏才能使其工作!

关于excel - 如果内容被用户删除,则使用 VBA 填充单元格,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54807402/

相关文章:

excel - 无法在数组公式中实现 INDIRECT()

excel - VBA - 返回对工作簿的引用

excel - 无法引用工作表上的列表框

vba - 范围内不相交的地址

mysql - SQL错误日期与int不兼容

excel - 为什么此 PivotItem.Visible 调用会引发 TypeMismatch 错误?

excel - 如何使用 VBA 代码从列表中获取唯一的 30 个随机数

python - 在现有的 Excel 工作表上保存 Pandas 系列

excel - 如果行数和列数不断变化,是否有更快的方法将单元格值从一张表复制到另一张表

vba - VBA 中的动态变量