Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 我如何确定新的&;Excel中SheetChange事件上的上一个单元格值?_C#_Excel_Vsto - Fatal编程技术网

C# 我如何确定新的&;Excel中SheetChange事件上的上一个单元格值?

C# 我如何确定新的&;Excel中SheetChange事件上的上一个单元格值?,c#,excel,vsto,C#,Excel,Vsto,我的Excel工作簿中有一些特殊的单元格,这些单元格由我的Excel加载项管理。我想阻止用户更改这些单元格的内容,但我也想知道,用户希望为这些单元格输入什么值。在SheetChange事件中,我可以检查哪些用户输入了我的特殊单元格,但如何确定这些单元格中的先前值并还原用户更改 这不是我的解决办法。若我将单元格锁定在Excel中,它将变为只读-在这种情况下,用户甚至无法尝试在此单元格中输入任何内容-Excel弹出警告对话框。我的问题是,我想捕获用户输入到我的单元格中的内容,使用此值执行某些操作,

我的Excel工作簿中有一些特殊的单元格,这些单元格由我的Excel加载项管理。我想阻止用户更改这些单元格的内容,但我也想知道,用户希望为这些单元格输入什么值。在SheetChange事件中,我可以检查哪些用户输入了我的特殊单元格,但如何确定这些单元格中的先前值并还原用户更改



这不是我的解决办法。若我将单元格锁定在Excel中,它将变为只读-在这种情况下,用户甚至无法尝试在此单元格中输入任何内容-Excel弹出警告对话框。我的问题是,我想捕获用户输入到我的单元格中的内容,使用此值执行某些操作,然后将单元格内容还原为原始值。

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

类似的内容如何,在VBA中,但应该很容易转换为C#


我会在一张隐藏的纸上保存一份单元格的副本


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

也许在输入单元格时可以捕获值:

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

我使用
应用程序解决了这个问题。撤消检查更改是否无效。

所以缓存单元格值是唯一的解决方案。我将有数百个要缓存的单元格:-)考虑使用字典(或集合,但字典更快)来存储值,记住匹配的范围不需要是矩形的,例如范围(“A1:B4,C7:D8,E4,F7:G10”),这样就可以在一个交集中对其进行监控。
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