首页 > 解决方案 > VBA 还原单元格

问题描述

我目前正在双击以将单元格值更改为完成(在范围内)但我希望能够在以后随时双击该单元格并恢复为原始公式。目前这只是用 "DONE" 替换单元格。我需要它来检查 C5 列的状态并替换原始公式。我将公式保存在每个单元格的另一列( S5 )。

到目前为止,我还意识到我不需要它用于多列 D:G 不需要只是 D 列

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
    Dim rInt As Range
    Dim rCell As Range

    Set rInt = Intersect(Target, Range("D5:G400"))
    If Not rInt Is Nothing Then
        For Each rCell In rInt
            rCell.Value = "Done"
        Next
    End If
    Set rInt = Nothing
    Set rCell = Nothing
    Cancel = True
End Sub

每行都有对应的日期 C 列有一个开始日期 01/06/2018
D 列 =(WORKDAY(C5,1,$BJ$2:$BJ$58)) S 列有 D 的存储公式 =(WORKDAY(C5, 1,$BJ$2:$BJ$58))

当我双击 D 列中的一个单元格时,我想在“完成”和 S 中的公式之间交换大约 400 行。

对不起,多帖子,我试图编辑评论而不是原始帖子。感谢您的帮助。

您编写的代码有点工作,但 D 列中的值返回为 =(WORKDAY(xer5,1,$BJ$2:$BJ$58))

标签: excelvba

解决方案


如果单元格已包含Done,请检查 Target 的当前值并恢复为原始公式。

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)

    If not Intersect(Target, Range("D5:G400")) is nothing then
        cancel = true
        select case lcase(target.value)
            case "done"
                target.formular1c1 = range("S5").formular1c1
                'option for formula from corresponding row in column S
                'target.formular1c1 = cells(target.row, "S").formular1c1
            case else
                'next line to go with option above
                'cells(target.row, "S").formular1c1 = target.formular1c1
                target = "Done"
        end select
    end if

End Sub

您只能双击单个单元格;检查多个单元格作为目标是不必要的。

xlR1C1 样式公式不会更改列下的任何行,除非您已将所有内容设为绝对参考。我发现您不太可能输入 396 个绝对参考公式,因此 S 列中的任何公式都应该适用于 D5:G400 中的任何单元格。


推荐阅读