2

我的 Excel 工作簿中有一些特殊的单元格,由我的 Excel 加载项管理。我想阻止用户更改这些单元格的内容,但我也想知道用户想要输入这些单元格的值。在 SheetChange 事件中,我可以检查哪些用户输入了我的特殊单元格,但是如何确定这些单元格中的 PREVIOUS 值并恢复用户更改?


这不是我的解决方案。如果我在 Excel 中锁定单元格,它将变为只读的 - 用户甚至无法尝试在此单元格中输入任何内容 - 在这种情况下,Excel 会弹出警告对话框。我的问题是我想捕捉用户输入我的单元格的内容,用这个值做一些事情,然后将单元格内容恢复为原始值。

4

5 回答 5

3

也许它适合捕获进入单元格的值:

Option Explicit
Dim LastText As String

Private Sub Workbook_SheetSelectionChange(ByVal Sh As Object, _
        ByVal Target As Excel.Range)
    LastText = Target.Value
End Sub

Private Sub Workbook_SheetChange(ByVal Sh As Object, _
        ByVal Source As Range)
    Debug.Print LastText; Source
End Sub
于 2008-11-17T13:17:53.987 回答
2

像这样的东西怎么样,它在 VBA 中,但应该很容易翻译成 C#

Option Explicit

' We are monitoring cell B2...

Private initialB2Value As Variant  ' holds the value for reinstatement when the user changes it

Private Sub Worksheet_Activate()
' record the value before the user makes any changes.
' Could be a constant value, or you could use .Formula to ensure a calculation is not lost
    initialB2Value = Range("B2").Value

End Sub

Private Sub Worksheet_Change(ByVal Target As Range)

Static alreadyChanging As Boolean 
' when we reset the cell, Worksheet_Change will fire again, so we'll use a flag
' to tell us if we should care or not...

    If alreadyChanging Then ' change is because of this code, no need to process
        alreadyChanging = False
        Exit Sub
    End If

    If IsEmpty(Intersect(Target, Range("B2"))) Then
    ' If the change is not happening to the range we are monitoring, ignore it
        Exit Sub
    End If

    ' Do something with the user's input here
    Debug.Print "User input " & Range("B2").Value & " into B2"

    ' before we reset the value, flag that we are changing the value in code
    alreadyChanging = True

    ' now apply the old value
    Range("B2").Value = initialB2Value

End Sub
于 2008-11-17T10:02:52.257 回答
1

如果您需要防止用户更改值,为什么不锁定单元格(右键单击、格式化单元格、锁定)然后保护工作表(工具-保护-保护工作表)。当以编程方式更改单元格时,更改锁定属性并在计算后将其更改回来

于 2008-11-17T09:30:06.770 回答
1

我通过Application.Undo检查更改是否无效来解决此问题。

于 2009-10-18T16:32:17.657 回答
0

我会将单元格的副本保留在隐藏的工作表上。

然后当用户更改一个单元格时,很容易在隐藏的工作表上找到匹配的单元格。

于 2008-11-17T12:33:19.723 回答