VBA还原单元格

时间:2018-07-30 18:09:34

标签: excel vba

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

我到目前为止有什么 我也意识到我不需要多列D:仅D列就不需要G

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列中的单元格时,我想在“ Done”和S中的公式之间交换 大约有400行。

很抱歉,我正在尝试编辑评论而不是原始帖子。感谢您的帮助。

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

2 个答案:

答案 0 :(得分:1)

检查目标的当前值,如果该单元格已经包含 Done ,则还原为原始公式。

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

您只能双击一个单元格;不需要检查多个单元格为Target。

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

答案 1 :(得分:0)

我对您的问题的措辞有点困惑,但这是我对它的理解:

  • 用户双击范围
    • sub将范围的值更改为“完成”
  • 用户再次双击范围
    • sub将范围的值改回之前的值,并假定先前已对该子对象调用过

我的方法是简单地保留一个辅助工作表并在其中存储值,如下所示:

Private Sub Worksheet_BeforeDoubleClick( _ ByVal Target As Range, Cancel As Boolean)
    Dim rInt As Range, rCell As Range
    Set rInt = Intersect(Target, Range("D5:G400"))

    Dim backup As Excel.Worksheet
    Set backup = Worksheets("backup") ' be sure to create this worksheet beforehand

    If Not rInt Is Nothing Then
        For Each rCell In rInt
            If rCell.Text = "Done" Then
                rCell.Value = backup.Range(rCell)

            Else
                backup.Range(rCell).Value = rCell.Value
                rCell.Value = "Done"
            End If
        Next
    End If
    Set rInt = Nothing
    Set rCell = Nothing
    Cancel = True
End Sub

我实际上还没有测试过这段代码,并且我对Range对象有点粗略(我经常不使用VBA来处理excel,通常只使用字符串),所以您可能需要对其进行适当的编辑,但希望它能为您指明正确的方向。

我应该注意,您需要先使用我的代码在excel中创建额外的工作表。