合并2个专用子VBA代码

合并2个专用子VBA代码,vba,excel,Vba,Excel,我有两个私有子工作表_change(ByVal Target As Range)代码,它们自己工作。我需要他们在同一张纸上工作。每当我这样做时,第二个代码不会运行。我怎么合并这些呢 代码1: Private Sub Worksheet_Change(ByVal Target As Range) Dim rng As Range, cel As Range Set rng = Intersect(Target, Range([H2], Cells(Rows.Count,

我有两个私有子工作表_change(ByVal Target As Range)代码,它们自己工作。我需要他们在同一张纸上工作。每当我这样做时,第二个代码不会运行。我怎么合并这些呢

代码1:

Private Sub Worksheet_Change(ByVal Target As Range)
     Dim rng As Range, cel As Range
     Set rng = Intersect(Target, Range([H2], Cells(Rows.Count, 
     "H").End(xlUp)))

     If rng Is Nothing Then Exit Sub
     Application.EnableEvents = False
     rng.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]<>"""",R1C[6] & ""-"" &" & 
     "TEXT(COUNTA(R2C[-1]:RC[-1]),""0000"") & ""-"" & R1C[7],"""")"
     Application.EnableEvents = True
End Sub
Private子工作表\u更改(ByVal目标作为范围)
变暗rng As范围,cel As范围
设置rng=Intersect(目标、范围([H2])、单元格(行数、,
“H”)。结束(xlUp)
如果rng为空,则退出Sub
Application.EnableEvents=False
rng.Offset(,1).FormulaR1C1=“=IF(RC[-1]”,R1C[6]&“-&”和
“文本(COUNTA(R2C[-1]:RC[-1]),”“0000”“,”“R1C[7],”“”
Application.EnableEvents=True
端接头
如果H中提供了信息,则代码1使用P1和O1填充第I列中的自动编号 代码2:

Private Sub Move_blanks_To_Bottom(ByVal Target As Range)
    If Target.CountLarge > 1 Then Exit Sub
    If Target.Column <> 9 Then Exit Sub
    Range("A1", Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Sort 
    key1:=Range("I1"), order1:=xlAscending, Header:=xlYes
End Sub
Private Sub Move_blank_To_Bottom(ByVal Target作为范围)
如果Target.CountLarge>1,则退出Sub
如果目标为。第9列,则退出Sub
范围(“A1”,范围(“A”&行数).End(xlUp)).Resize(,11).排序
键1:=范围(“I1”),顺序1:=xl升序,标题:=xlYes
端接头
代码2使用列I并对值进行排序,因此,如果I中有值,则将行移动到下一个可用行,在该行中,列I有效地完成。如果单元格I为空,则将行移动到底部

据我所知,您不能运行2个私有子代码,那么我如何在同一张表上同时运行这两个子代码


谢谢

因为第一个代码退出(
Exit Sub)
Intersect
失败时,您必须调用该
If
语句上方的第二个子例程。您必须向其传递
目标
,以及:

 Call Move_blanks_To_Bottom(Target)
然而,我认为重写可能是最好的。与其到处退出子例程,不如将相关的代码位放在If语句中,这样例程可以运行到完成并优雅地退出:

Private Sub Worksheet_Change(ByVal Target As Range)

    Application.EnableEvents = False

    'Do logic for this first range
    Dim rng As Range
    rng = Range([H2], Cells(Rows.Count, "H").End(xlUp)))
    If Not Intersect(rng, Target) Is Nothing Then
        rng.Offset(, 1).FormulaR1C1 = "=IF(RC[-1]<>"""",R1C[6] & ""-"" &" & "TEXT(COUNTA(R2C[-1]:RC[-1]),""0000"") & ""-"" & R1C[7],"""")"   
    End If

    'now do logic for the second range (move_blanks_to_bottom)
    If Target.CountLarge = 1 And Target.Column = 9 Then
        Range("A1", Range("A" & Rows.Count).End(xlUp)).Resize(, 11).Sort key1:=Range("I1"), order1:=xlAscending, Header:=xlYes 
    End If

    Application.EnableEvents = True 
End Sub
Private子工作表\u更改(ByVal目标作为范围)
Application.EnableEvents=False
'对第一个范围执行逻辑
变暗rng As范围
rng=范围([H2],单元格(行数,“H”)。结束(xlUp)))
如果不相交(rng,目标)则为空
rng.Offset(,1).FormulaR1C1=“=IF(RC[-1]”,R1C[6]&“-&”文本(COUNTA(R2C[-1]:RC[-1]),“0000”)和“-&&R1C[7],”)
如果结束
'现在为第二个范围执行逻辑(将\u空格\u移动到\u底部)
如果Target.CountLarge=1,Target.Column=9,则
范围(“A1”,范围(“A”&行数)。结束(xlUp))。调整大小(,11)。排序键1:=范围(“I1”),顺序1:=xl升序,标题:=xlYes
如果结束
Application.EnableEvents=True
端接头

从第一个调用第二个
Sub
?请注意,您通常不会“运行”
Worksheet\u Change
——它是一个事件处理程序。您是否尝试过在
Worksheet\u Change
事件的末尾添加
DoEvents
?@comitern当我调用时,我得到一个错误“参数不是可选的”您知道如何克服这个问题吗?我的VBA并不惊人-谢谢@Zac my VBA并不令人惊讶,我只是在第一个代码的Application.EnableEvents=True之后添加DoEvents吗?@DMO您需要传递参数。谢谢您的发布。我已经输入了第一个代码的范围,但是第二个范围(VBA noob)有问题,我想知道您是否可以提供帮助,第二个代码正在第i列中查找值,如果有值,它将移动到下一个可用行,有效地将所有空格推到底部,从a开始移动整行。我不知道该如何把它写进代码中谢谢我喜欢你这样做。这样不行吗?如果空格在顶部结束,那么可能只需将
xlAscending
更改为
xlAscending
。如果这不起作用,我认为这是一个值得提出的新问题。因此,目前唯一有效的部分是数字的自动生成。排序不起作用,但我认为这部分是因为我不确定如何设置范围?您的代码要求我包含第二个范围,但我不确定如何定义它?