Excel 如何知道触发SelectionChange过程的前一行号?

Excel 如何知道触发SelectionChange过程的前一行号?,excel,vba,userform,Excel,Vba,Userform,我有一个Excel电子表格,每次移动活动单元格时都会调用SelectionChange过程 此过程执行一定数量的操作,并以用户窗体显示结果。用户可以通过命令按钮验证结果或取消 Selection.row提供目标单元格的行 如何检索刚刚离开的单元格的行号 下面的第一个代码块位于工作表代码中,第二个代码块是userform代码。这个测试用户表单只包含一个标签和一个按钮 按钮代码的第一行起作用,但给出了目标行。我希望第二行可以工作,但OldRow是空的,因此该行崩溃。如何使OldRow对userfor

我有一个Excel电子表格,每次移动活动单元格时都会调用
SelectionChange
过程

此过程执行一定数量的操作,并以用户窗体显示结果。用户可以通过命令按钮验证结果或取消

Selection.row
提供目标单元格的行

如何检索刚刚离开的单元格的行号

下面的第一个代码块位于工作表代码中,第二个代码块是userform代码。这个测试用户表单只包含一个标签和一个按钮

按钮代码的第一行起作用,但给出了目标行。我希望第二行可以工作,但OldRow是空的,因此该行崩溃。如何使OldRow对userform可见

Dim OldRow As Long

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Static OldRange As Range
    If Not OldRange Is Nothing Then
        ' do things
    End If
    MsgBox OldRow
    UserForm1.Show
    Set OldRange = Target.Cells(1, 1)
    OldRow = OldRange.Row
End Sub

我会那样做

Option Explicit

Dim PrevActiveCell As Range
Dim CurActiveCell As Range
Dim frm As New UserForm1

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Set PrevActiveCell = CurActiveCell
    Set CurActiveCell = ActiveCell

    If PrevActiveCell Is Nothing Then
        ' Either you forget to set CurActiveCell (when opening the workbook or ...)
        ' or you did reset the VBA project
    Else

        With frm
            .Caption = "Cur:" & CurActiveCell.Row & " Old: " & PrevActiveCell.Row
            .Show
        End With

    End If

End Sub
在表格中,我有这个代码

Option Explicit

Private Sub CommandButton1_Click()
    Hide
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer _
                                       , CloseMode As Integer)
    ' Prevent the form being unloaded
    If CloseMode = vbFormControlMenu Then Cancel = True

    ' Hide the Userform
    Hide

End Sub
PS在userform的代码中引用userform本身不是一个好主意。阅读材料和

Option Explicit

Private Sub CommandButton1_Click()
    Hide
End Sub
Private Sub UserForm_QueryClose(Cancel As Integer _
                                       , CloseMode As Integer)
    ' Prevent the form being unloaded
    If CloseMode = vbFormControlMenu Then Cancel = True

    ' Hide the Userform
    Hide

End Sub