Excel VBA宏跳转到另一个宏?
这段代码有什么原因吗Excel VBA宏跳转到另一个宏?,excel,vba,Excel,Vba,这段代码有什么原因吗 Private Sub CT_Company_Loss_Change() With Application .Calculation = xlManual .EnableEvents = False .ScreenUpdating = False End With Dim stSQL As String, rst As ADODB.Recordset, k As Integer, vaData As Variant Dim objConn As
Private Sub CT_Company_Loss_Change()
With Application
.Calculation = xlManual
.EnableEvents = False
.ScreenUpdating = False
End With
Dim stSQL As String, rst As ADODB.Recordset, k As Integer, vaData As Variant
Dim objConn As ADODB.Connection
Dim ConnectionString As String, sCompany As String
ConnectionString = "Provider=sqloledb.1;data source=se-sqlct-0100;Initial catalog=AirCT2Loss;Integrated Security = SSPI;"
Set objConn = New ADODB.Connection
With CY_Program1
.Clear
.AddItem "Select Program"
.ListIndex = 0
End With
到达最后一行,然后跳到此宏:
Private Sub CY_Program1_Change()
With Application
.Calculation = xlManual
.EnableEvents = False
.ScreenUpdating = False
End With
Dim stSQL As String, rst As ADODB.Recordset, k As Integer, vaData As Variant
Dim objConn As ADODB.Connection
Dim ConnectionString As String, sCompany As String, sProgram As String
ConnectionString = "Provider=sqloledb.1;data source=se-sqlct-0100;Initial catalog=AirCT2Loss;Integrated Security = SSPI;"
Set objConn = New ADODB.Connection
我以前从未见过这种情况,而且我甚至没有使用call功能,那么是什么让它这么做的呢
提前感谢正如@sous2817所指出的,
CT\u Company\u Loss\u Change()
和CY\u program 1\u Change()
都是事件处理程序,这意味着当某些操作发生时,Excel会运行它们。我同意@sous2817的猜测,即“CT_Company_Loss”和“CY_Program1”都是控件,特别是,“CY_Program1”是一个列表框(从代码与它的交互方式可以看出)
以下代码行导致“CY_Program1”列表框发生“更改”:
因此,函数完成后,Excel接下来要做的就是触发“CY_Program1”列表框的“change”事件处理程序:CY_Program1_change()
更新 如果要在“清除”列表框时让事件处理程序忽略它,请尝试在函数的开头添加以下内容:
If CY_Program1.ListCount = 1 And CY_Program1.List(0) = "Select Program" Then
Exit Sub
End If
基本上,如果CY_Program1列表框刚刚被“清除”,它将在不运行其余事件处理程序代码的情况下退出。正如@sous2817所指出的那样,
CT_Company_Loss_Change()
和CY_Program1_Change()
都是事件处理程序,这意味着当某些操作发生时Excel将运行它们。我同意@sous2817的猜测,即“CT_Company_Loss”和“CY_Program1”都是控件,特别是,“CY_Program1”是一个列表框(从代码与它的交互方式可以看出)
以下代码行导致“CY_Program1”列表框发生“更改”:
因此,函数完成后,Excel接下来要做的就是触发“CY_Program1”列表框的“change”事件处理程序:CY_Program1_change()
更新 如果要在“清除”列表框时让事件处理程序忽略它,请尝试在函数的开头添加以下内容:
If CY_Program1.ListCount = 1 And CY_Program1.List(0) = "Select Program" Then
Exit Sub
End If
基本上,如果CY_Program1列表框刚刚被“清除”,它将在不运行其余事件处理程序代码的情况下退出。这就是在userforms(userform工作表代码)中启用或禁用事件的方式: (对于工作表,您可以应用相同的方法,但使用工作表代码) 在相同的用户表单代码中:
Private Sub CY_Program1_Change()
if events then 'so, if CY_Program1_Change is called/triggered, then if events is false it won't allow the code to run
'more code (...)
end if
end sub
这是在userforms(userform工作表代码)中启用或禁用事件的方式: (对于工作表,您可以应用相同的方法,但使用工作表代码) 在相同的用户表单代码中:
Private Sub CY_Program1_Change()
if events then 'so, if CY_Program1_Change is called/triggered, then if events is false it won't allow the code to run
'more code (...)
end if
end sub
你能告诉我们更多的细节吗?为什么你认为它会跳转到那个宏?每当列表框(或其他任何内容)发生更改时,CY_Program1_Change()都会触发…我猜它是一个控件。我在代码中看不到任何结束子控件,这是一个输入错误吗?没有输入错误只是显示代码从何处跳转。PowerUser-我不知道这工作正常,直到我尝试在启动宏之前清除组合框值。您能给我们提供更多详细信息吗?为什么你认为它会跳转到那个宏?每当列表框(或其他任何内容)发生更改时,CY_Program1_Change()都会触发…我猜它是一个控件。我在代码中看不到任何结束子控件,这是一个输入错误吗?没有输入错误,只是显示代码从何处跳转。PowerUser-我不知道这工作正常,直到我尝试在启动宏之前清除组合框值。感谢Blackhawk的解释,因此,由于CY_程序1由CT_Company_Loss驱动,用户每次从CT_Company_Loss中选择新值时,是否有办法清除CY_Prorgam1?还是我做得太多了?下拉列表是在工作表中还是在用户表单上?你不会总是在任何情况下都有这样的工作,请参阅我的example@PatrickLepelletier禁用事件是一个更优雅的解决方案!Carlos,有机会尝试一下Patrick的代码-基本上你告诉Excel在“清除”列表框的同时不要在短时间内触发事件,然后再打开事件。感谢Blackhawk的解释,因此,由于CY_程序1由CT_Company_Loss驱动,用户每次从CT_Company_Loss中选择新值时,是否有办法清除CY_Prorgam1?还是我做得太多了?下拉列表是在工作表中还是在用户表单上?你不会总是在任何情况下都有这样的工作,请参阅我的example@PatrickLepelletier禁用事件是一个更优雅的解决方案!Carlos,有机会尝试一下Patrick的代码-基本上是告诉Excel在“清除”列表框的同时短期内不要触发事件,然后再打开事件。