是否可以延迟工作表更改代码?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秒,但它无法解决问题,不过,谢谢;)值得注意的是,您可能希望添加一个错误处理程序,以确保事件始终处于打开状态。