Как определить новое и предыдущее значение ячейки для события SheetChange в Excel? - PullRequest
2 голосов
/ 17 ноября 2008

В моих книгах Excel есть несколько специальных ячеек, которые управляются моей надстройкой Excel. Я хочу запретить пользователям изменять содержимое этих ячеек, но я также хочу знать, какое значение пользователи хотели бы внести в эти ячейки. В событии SheetChange я могу проверить, какие пользователи вошли в мои специальные ячейки, но как мне определить ПРЕДЫДУЩЕЕ значение в этих ячейках и ИЗМЕНИТЬ изменения пользователя?


Это не решение для меня. Если я блокирую ячейку в Excel, она становится доступной только для чтения - пользователь даже не может попытаться что-либо ввести в эту ячейку - в этом случае появляется всплывающее окно с предупреждением Excel. Моя проблема в том, что я хочу узнать, что пользователь ввел в мою ячейку, что-то сделать с этим значением, а затем вернуть содержимое ячейки к исходному значению.

Ответы [ 5 ]

3 голосов
/ 17 ноября 2008

Возможно, было бы целесообразно зафиксировать значение при вводе в ячейку:

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
2 голосов
/ 17 ноября 2008

Как насчет чего-то подобного, который есть в 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
1 голос
/ 17 ноября 2008

Если вам нужно запретить пользователям изменять значения, почему бы не заблокировать ячейки (щелкнуть правой кнопкой мыши, отформатировать ячейку, заблокировать), а затем защитить лист (рабочий лист tools-protection-protect). Когда ячейки изменяются программно, измените свойство locked и верните его обратно после вычисления

0 голосов
/ 18 октября 2009

Я решил эту проблему, используя Application.Undo, проверяя, является ли изменение недействительным.

0 голосов
/ 17 ноября 2008

Я бы оставил копию ячеек на скрытом листе.

Затем, когда пользователь меняет ячейку, легко найти соответствующую ячейку на скрытом листе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...