Excel 如何检测向列中输入数据的用户

Excel 如何检测向列中输入数据的用户,excel,vba,Excel,Vba,我有一个用户输入/管理数据的电子表格。他们将插入行,可能复制行,然后输入数据 有一列保存MembID值,当用户单击按钮运行宏时,会指定该列的值 宏时不时地检测到列中有重复的值,我很难看出这是怎么可能的,并怀疑用户正在手动在列中输入值 我希望能够检测到他们是否正在向该列中的单元格输入数据。任何检测方法都需要能够忽略宏对列所做的更改!这可能吗?我已经用下面的代码成功地完成了90%以上我所需要的 Option Explicit Public Sub Worksheet_Change(ByVal ta

我有一个用户输入/管理数据的电子表格。他们将插入行,可能复制行,然后输入数据

有一列保存MembID值,当用户单击按钮运行宏时,会指定该列的值

宏时不时地检测到列中有重复的值,我很难看出这是怎么可能的,并怀疑用户正在手动在列中输入值


我希望能够检测到他们是否正在向该列中的单元格输入数据。任何检测方法都需要能够忽略宏对列所做的更改!这可能吗?

我已经用下面的代码成功地完成了90%以上我所需要的

Option Explicit

Public Sub Worksheet_Change(ByVal target As Range)
Dim intersection As Range
Dim ThisCell As String
Dim iRowFirst As Integer
Dim iRow As Integer
Dim iCol As Integer
Dim sMessage As String
Dim iNoRows As Integer
Dim iMembColMembID As Integer
Dim iMembHeaderRow As Integer

' Find Column headings for "Membership" sheet
iMembHeaderRow = 1

Call FindHeader("Membership", iMembColMembID, iMembHeaderRow, "MembID")

Set intersection = Intersect(target, Range(Cells(1, iMembColMembID), Cells(2000, iMembColMembID)))

If Not intersection Is Nothing Then
    iRowFirst = target.Row
    iNoRows = target.Rows.Count

    sMessage = ""

    For iRow = iRowFirst To iRowFirst + iNoRows - 1
        ThisCell = Cells(iRow, iMembColMembID)

        If ThisCell <> "" Then
            If sMessage = "" Then
                sMessage = "The value for MembID has been changed for following row(s): "
            End If
            sMessage = sMessage & iRow & " "
        End If
    Next iRow
    If sMessage <> "" Then
        MsgBox sMessage
    End If
End If
End Sub
选项显式
公共子工作表\u更改(ByVal目标作为范围)
作为范围的暗淡交叉点
将此单元格设置为字符串
将iRowFirst设置为整数
Dim iRow作为整数
作为整数的Dim-iCol
作为字符串的模糊消息
将行设置为整数
Dim iMembColMembID作为整数
Dim IMEMBHEADEROW为整数
'查找“成员资格”表的列标题
iMembHeaderRow=1
致电FindHeader(“会员”,iMembColMembID,iMembHeaderRow,“MembID”)
设置相交=相交(目标、范围(单元格(1,iMembColMembID)、单元格(2000,iMembColMembID)))
若并没有交集就什么都不是了
iRowFirst=target.Row
iNoRows=target.Rows.Count
sMessage=“”
对于iRow=iRowFirst到iRowFirst+iNoRows-1
此单元格=单元格(iRow、iMembColMembID)
如果此单元格为“”,则
如果sMessage=”“,则
sMessage=“以下行的MembID值已更改:”
如果结束
sMessage=sMessage&iRow&“
如果结束
下一步
如果消息是“”,那么
MsgBox sMessage
如果结束
如果结束
端接头
我还将Application.EnableEvents.False放在添加新MembID值的宏的开头,然后在宏的末尾重新启用它

这会检测到用户向MembID列添加数据

唯一奇怪的是,如果您复制/插入多行,那么当宏被触发两次时,您将收到两条消息。此外,如果删除一行,它也会触发


但是,从长远来看,我可以接受这一点

Excel并不适合这样做,但您可以尝试一下工作表更改事件处理程序。