Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/vba/15.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 VBA宏跳转到另一个宏?_Excel_Vba - Fatal编程技术网

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在“清除”列表框的同时短期内不要触发事件,然后再打开事件。