Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/23.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
Excel 如何在列表中捕获新行添加?_Excel_List_Events - Fatal编程技术网

Excel 如何在列表中捕获新行添加?

Excel 如何在列表中捕获新行添加?,excel,list,events,Excel,List,Events,每当用户在Excel 10工作表上的列表中添加新行时(即worksheet.ListObjects()返回的列表实例),我希望在Excel 10工作表中执行VBA事件处理程序,例如,在列表的最后一行下输入数据(这将通过向列表中添加新行来扩展列表) 如何操作?除其他外,我希望为新行的特定单元格设置默认值 我目前的想法是处理工作表的更改,并检查目标参数是否在我感兴趣的列表对象的范围内 但是,我如何确定用户是否正在使用其单元格更改创建新行,并将其与列表中现有单元格的编辑区分开来 我可能只是有点笨而已。

每当用户在Excel 10工作表上的列表中添加新行时(即
worksheet.ListObjects
()返回的列表实例),我希望在Excel 10工作表中执行VBA事件处理程序,例如,在列表的最后一行下输入数据(这将通过向列表中添加新行来扩展列表)

如何操作?除其他外,我希望为新行的特定单元格设置默认值

我目前的想法是处理
工作表的更改
,并检查
目标
参数是否在我感兴趣的
列表对象的
范围内

但是,我如何确定用户是否正在使用其单元格更改创建新行,并将其与列表中现有单元格的编辑区分开来


我可能只是有点笨而已。我希望可以捕获列表事件,但我找不到任何事件。

我想你是对的,
ListObject
没有事件。使用
工作表\u Change
似乎是正确的方法。要检测新行与现有行编辑,您需要滚动您自己的方法

我建议跟踪
ListObjects
中的行数,以便检测它们何时更改。为此,请尝试为每个
列表项目添加一个隐藏的
命名范围
,以保存当前行数。在文件打开时填充它们,并在
工作表\u Change
上测试它们

这将在文件打开时添加或更新隐藏的命名范围(添加到工作簿模块)

这将检测所做的更改类型。我已将其设置为工作簿级别的事件,因此所有工作表只需要一个事件。(添加到工作簿模块)

Private子工作簿\u SheetChange(ByVal sh作为对象,ByVal Target作为范围)
作为ListObject的Dim oList
名称为Dim nm
将strName设置为字符串
对于sh.ListObjects中的每个oList
strName=oList.Name&“行”
如果不是,则Application.Intersect(Target,oList.DataBodyRange)什么都不是
设置nm=无
出错时继续下一步
设置nm=Me.Names(strName)
错误转到0
如果nm不算什么,那么
Set nm=Me.Names.Add(strName,CStr(oList.ListRows.Count))
可见光=假
如果结束
如果oList.ListRows.Count Val(替换为(nm.Value,“=”,”),则
nm.referesto=CStr(oList.ListRows.Count)
MsgBox“List”和oList.Name&“changed”和vbCrLf&“newline”
其他的
MsgBox“列表”和oList.Name&“已更改”和vbCrLf&“现有行”
如果结束
如果结束
下一个
端接头

注意:这不适用于更改现有ListObject的名称的情况。这是留给读者的练习

太糟糕了,似乎没有更好的了。更紧凑的方式。但是,嘿,谢谢。
Private Sub Workbook_Open()
    Dim oList As ListObject
    Dim sh As Worksheet
    Dim nm As Name
    Dim strName As String

    For Each sh In Me.Worksheets
    For Each oList In sh.ListObjects
        'oList.ListRows.Count
        strName = oList.Name & "Rows"
        Set nm = Nothing
        On Error Resume Next
        Set nm = Me.Names(strName)
        On Error GoTo 0
        If nm Is Nothing Then
            Set nm = Me.Names.Add(strName, CStr(oList.ListRows.Count))
        Else
            nm.RefersTo = CStr(oList.ListRows.Count)
        End If
        nm.Visible = False
    Next oList, sh
End Sub
Private Sub Workbook_SheetChange(ByVal sh As Object, ByVal Target As Range)
    Dim oList As ListObject
    Dim nm As Name
    Dim strName As String

    For Each oList In sh.ListObjects
        strName = oList.Name & "Rows"
        If Not Application.Intersect(Target, oList.DataBodyRange) Is Nothing Then
            Set nm = Nothing
            On Error Resume Next
            Set nm = Me.Names(strName)
            On Error GoTo 0
            If nm Is Nothing Then
                Set nm = Me.Names.Add(strName, CStr(oList.ListRows.Count))
                nm.Visible = False
            End If
            If oList.ListRows.Count <> Val(Replace(nm.Value, "=", "")) Then
                nm.RefersTo = CStr(oList.ListRows.Count)
                MsgBox "List " & oList.Name & " changed" & vbCrLf & "New Line"
            Else
                MsgBox "List " & oList.Name & " changed" & vbCrLf & "Existing Line"
            End If
        End If
    Next
End Sub