【问题标题】:Merging 2 private sub VBA codes合并 2 个私有子 VBA 代码
【发布时间】:2019-02-15 23:45:18
【问题描述】:

我有 2 个独立工作的 Private Sub Worksheet_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

如果在 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

代码 2 使用列 I 并对值进行排序,因此如果 I 中有值,它将将该行移动到下一个可用行,如果单元格 I 为空白,则该行将有效地完成 I 列。

据我了解,您不能运行 2 个私有子代码,那么我将如何在同一张纸上同时运行这两个子代码?

谢谢!

【问题讨论】:

  • 从第一个呼叫第二个Sub?请注意,您通常不会“运行”Worksheet_Change - 它是一个事件处理程序。
  • 您是否尝试在Worksheet_Change 事件的末尾添加DoEvents
  • @Comintern 当我打电话时我收到一个错误“参数不是可选的”关于如何克服这个问题的任何想法?我的 VBA 并不出色 - 谢谢!
  • @Zac 我的 VBA 并不神奇,我只是在第一个代码的 Application.EnableEvents = True 之后添加 DoEvents 吗?
  • @DMO 你需要传递参数。

标签: vba excel


【解决方案1】:

因为你的第一个代码退出(Exit Sub),当它失败时Intersect,那么你必须在If语句上方调用你的第二个子例程。你必须将Target传递给它,就像:

 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

【讨论】:

  • 感谢您的发帖。我已经输入了第一个代码的范围,但是我在第二个范围(VBA noob)上遇到了问题,想知道您是否可以提供帮助,第二个代码正在 I 列中查找值,如果那里有一个值,它会移动到下一个可用的值行有效地将所有空白推到底部,从 A 开始整行。我不确定如何将其放入代码中。 - 谢谢!
  • 我喜欢你用 Sort 来做这件事。排序不起作用吗?如果空格在顶部,那么也许只需将xlAscending 更改为xlDescending。如果这不能解决问题,我认为这值得提出一个新问题。
  • 所以目前唯一起作用的是数字的自动生成。排序不起作用,但我认为这部分是因为我不确定如何设置范围?您的代码要求我包含第二个范围,但我不确定如何定义它?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-05-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-23
  • 2012-10-30
相关资源
最近更新 更多