Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/17.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/28.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
是否可以延迟工作表更改代码?excelvba_Vba_Excel_Excel 2013 - Fatal编程技术网

是否可以延迟工作表更改代码?excelvba

是否可以延迟工作表更改代码?excelvba,vba,excel,excel-2013,Vba,Excel,Excel 2013,我正在填写一些数据验证下拉列表,它们的值在表中。 我有一个按钮(链接到userforms)供用户向表中添加项。输入新值后,工作表的工作表更改代码将对表格进行排序。 因此,如果删除了某个值,则表将调整大小 但是现在我的问题是,当用户窗体中的按钮被单击时,首先一行被添加到表中,然后值被添加到该行中。在添加值之前,工作表\u Change已检测到新的空行并将其删除。 是否有可能推迟,或者有人知道更好的解决方案 userform的代码: Private Sub butAddProject_Click()

我正在填写一些数据验证下拉列表,它们的值在表中。
我有一个按钮(链接到userforms)供用户向表中添加项。输入新值后,工作表的工作表更改代码将对表格进行排序。
因此,如果删除了某个值,则表将调整大小

但是现在我的问题是,当用户窗体中的按钮被单击时,首先一行被添加到表中,然后值被添加到该行中。在添加值之前,工作表\u Change已检测到新的空行并将其删除。
是否有可能推迟,或者有人知道更好的解决方案

userform的代码:

Private Sub butAddProject_Click()

    Dim listSheet As Worksheet
    Dim listTable As listObject
    Dim newRow As ListRow
    Dim ProjectName As String

    ProjectName = txtAddProject.Text

    Set listSheet = Sheets("Projects-Tasks")
    Set listTable = listSheet.ListObjects(1)

    If ProjectName <> "" Then
        Set newRow = listTable.ListRows.Add
        newRow.Range(1, 1).Value = ProjectName
    Else
        MsgBox "Enter a project name first!"
    End If

    txtAddProject.Text = ""
    formAddProject.Hide

End Sub
Private Sub-butAddProject\u Click()
将列表表设置为工作表
将listTable设置为listObject
将newRow设置为ListRow
将项目名称设置为字符串
ProjectName=txtAddProject.Text
设置listSheet=工作表(“项目任务”)
Set listTable=listSheet.ListObjects(1)
如果项目名称为“”,则
Set newRow=listTable.ListRows.Add
newRow.Range(1,1).Value=ProjectName
其他的
MsgBox“首先输入项目名称!”
如果结束
txtAddProject.Text=“”
formAddProject.Hide
端接头
最后,工作表的代码将更改:

Private Sub Worksheet_Change(ByVal Target As Range)

    Dim ws As Worksheet
    Dim strList As String
    Set ws = Sheets("Projects-Tasks")
    strList = Cells(2, Target.Column).listObject.Name

    If strList <> "" Then
        Application.ScreenUpdating = False
            With ListObjects(strList).Sort
                .SortFields.Add _
                    Key:=Cells(3, Target.Column), _
                    SortOn:=xlSortOnValues, _
                    Order:=xlAscending
                .Header = xlYes
                .MatchCase = False
                .Orientation = xlTopToBottom
                .SortMethod = xlPinYin
                .Apply
            End With

        With ws.ListObjects(strList)
            .Resize .DataBodyRange.CurrentRegion
        End With

    End If

    Application.ScreenUpdating = True

End Sub
Private子工作表\u更改(ByVal目标作为范围)
将ws设置为工作表
模糊strList作为字符串
设置ws=工作表(“项目任务”)
strList=单元格(2,Target.Column).listObject.Name
如果strList为“”,则
Application.ScreenUpdating=False
使用ListObjects(strList)。排序
.SortFields.Add_
键:=单元格(3,Target.Column)_
SortOn:=xlSortOnValues_
顺序:=xl
.Header=xlYes
.MatchCase=False
.方向=xlTopToBottom
.SortMethod=xl拼音
.申请
以
使用ws.ListObjects(strList)
.Resize.DataBodyRange.CurrentRegion
以
如果结束
Application.ScreenUpdating=True
端接头
提前谢谢

Private Sub-butAddProject\u Click()
Private Sub butAddProject_Click()

    Dim listSheet As Worksheet
    Dim listTable As listObject
    Dim newRow As ListRow
    Dim ProjectName As String

    Application.EnableEvents=False 

    ProjectName = txtAddProject.Text

    Set listSheet = Sheets("Projects-Tasks")
    Set listTable = listSheet.ListObjects(1)

    If ProjectName <> "" Then
        Set newRow = listTable.ListRows.Add
        newRow.Range(1, 1).Value = ProjectName
    Else
        MsgBox "Enter a project name first!"
    End If

    txtAddProject.Text = ""
    formAddProject.Hide

    Application.EnableEvents=True


End Sub
将列表表设置为工作表 将listTable设置为listObject 将newRow设置为ListRow 将项目名称设置为字符串 Application.EnableEvents=False ProjectName=txtAddProject.Text 设置listSheet=工作表(“项目任务”) Set listTable=listSheet.ListObjects(1) 如果项目名称为“”,则 Set newRow=listTable.ListRows.Add newRow.Range(1,1).Value=ProjectName 其他的 MsgBox“首先输入项目名称!” 如果结束 txtAddProject.Text=“” formAddProject.Hide Application.EnableEvents=True 端接头
添加新行时关闭事件:

If ProjectName <> "" Then
    application.enableevents = False
    Set newRow = listTable.ListRows.Add
    application.enableevents = True
    newRow.Range(1, 1).Value = ProjectName
Else
如果项目名称为“”,则
application.enableevents=False
Set newRow=listTable.ListRows.Add
application.enableevents=True
newRow.Range(1,1).Value=ProjectName
其他的

我假设您在添加新值时仍希望它进行排序,因此我在添加新值的行之前重置事件。

您可以检查
Target.value=“”
?对不起,这是什么意思?我的意思是,如果更改了单元格(即
Target
),您是否可以跳过其余逻辑是空的?如果我这样做,错误将延迟1或2秒,但它无法解决问题,不过,谢谢;)值得注意的是,您可能希望添加一个错误处理程序,以确保事件始终处于打开状态。