【问题标题】:Combine criteria / macros VBA结合标准/宏VBA
【发布时间】:2021-03-29 18:04:34
【问题描述】:
Sub Macro_1()
Dim RowIndex, x As Integer
Dim RowArr() As String
RowIndex = "8,9,11,12,13,14,15,16,17"
RowArr = Split(RowIndex, ",")
Application.ScreenUpdating = False

  Sheets("Test").Select
  
  For x = 0 To UBound(RowArr)
    ActiveSheet.Rows().AutoFilter Field:=CInt(RowArr(x))
  Next
  ActiveSheet.Rows().AutoFilter Field:=10, Criteria1:="<>"
  Sheets("Test").Select
  Call SetClassFields("1")
  Call Macro_Filter
  Application.ScreenUpdating = True

End Sub
Sub Macro_2()
Dim RowIndex, x As Integer
Dim RowArr() As String
RowIndex = "8,9,10,12,13,14,15,16,17"
RowArr = Split(RowIndex, ",")
Application.ScreenUpdating = False

  Sheets("Test").Select
  
  For x = 0 To UBound(RowArr)
    ActiveSheet.Rows().AutoFilter Field:=CInt(RowArr(x))
  Next
  ActiveSheet.Rows().AutoFilter Field:=11, Criteria1:="<>"
  Sheets("Test").Select
  Call SetClassFields("2")
  Call Macro_Filter
  Application.ScreenUpdating = True

End Sub

您好,我有一张包含多个标准的表格。到目前为止,一次只需要过滤一个标准。现在应该过滤包含 X 的几个列。现在我正在考虑如何结合这两个宏,因为我还是一个初学者。谢谢你。最好的问候

【问题讨论】:

标签: excel vba


【解决方案1】:

好吧,即使您是初学者,您也应该知道您的代码是做什么的。看起来你放东西,并不真正知道它们做什么。例如,下面的代码什么都不做。

For x = 0 To UBound(RowArr)
  ActiveSheet.Rows().AutoFilter Field:=CInt(RowArr(x))
Next

可以安全移除。

这意味着xRowIndexRowArr也可以被删除,因为你不会在其他地方使用它们。

此外,无需使用.Select,因为无需实际选择即可引用任何工作表或范围。在您的代码中,我们可以看到Sheets("Test").Select 两次。第二个绝对什么都不做。建议删除第一个。当您删除时,在以下行中,您可以使用 Sheets("Test") 而不是 ActiveSheet,这是相同的引用,但没有不必要的 Sheets("Test").Select

您的固定宏可能如下所示:

Sub Macro_1()
  Application.ScreenUpdating = False
  
  Sheets("Test").Rows().AutoFilter Field:=10, Criteria1:="<>"
  Call SetClassFields("1")
  Call Macro_Filter
  
  Application.ScreenUpdating = True
End Sub

Sub Macro_2()
  Application.ScreenUpdating = False

  Sheets("Test").Rows().AutoFilter Field:=11, Criteria1:="<>"
  Call SetClassFields("2")
  Call Macro_Filter
  
  Application.ScreenUpdating = True
End Sub

我希望我是正确的,因为您可能出于示例目的缩短了代码...

现在,回答您的问题。我假设您一个接一个地运行您的脚本。所以主要代码部分可能只是放在一个脚本中,如下所示:

Sub Macro_3()
  Application.ScreenUpdating = False
  
  Sheets("Test").Rows().AutoFilter Field:=10, Criteria1:="<>"
  Call SetClassFields("1")
  Call Macro_Filter
  Sheets("Test").Rows().AutoFilter Field:=11, Criteria1:="<>"
  Call SetClassFields("2")
  Call Macro_Filter
  
  Application.ScreenUpdating = True
End Sub

如果你希望能够选择走哪条路径(OR条件),你需要给函数一个参数(让我们调用参数i)。

Sub caller()
  Call Macro_x(1)
End Sub

Private Sub Macro_x(i As Integer)
  Application.ScreenUpdating = False
  
  If i = 1 Then
    Sheets("Test").Rows().AutoFilter Field:=10, Criteria1:="<>"
  ElseIf i = 2 Then
    Sheets("Test").Rows().AutoFilter Field:=11, Criteria1:="<>"
  Else
    MsgBox "parameter i was not defined"
    Exit Sub
  End If
  Call SetClassFields(CStr(i))
  Call Macro_Filter
  
  Application.ScreenUpdating = True
End Sub

在这段代码中,您可以看到主函数 (caller) 和另一个 (Marcro_x),它在 caller 内部调用。调用 Macro_x - 12 时,必须在括号中提供参数。根据提供的参数,sub 会做一些稍微不同的事情。

【讨论】:

  • 我用我想象的 OR 应该如何实现更新了答案。
  • 非常感谢
猜你喜欢
  • 2010-12-25
  • 1970-01-01
  • 2011-11-23
  • 2018-04-14
  • 1970-01-01
  • 2017-10-27
  • 2016-02-27
  • 2018-10-03
  • 1970-01-01
相关资源
最近更新 更多