在VBA中的命令中使用stringvariables

我试图得到一个string来处理一个代码,在那里我自动化多个标签被相同的标准过滤,以获得小计从其他工作表。
所以,我做了一些IfElse s来检查一些标准,并在分析之后尝试进行过滤,而不是必须使用多个If来执行多个AutoFilter

所以,下面的部分工作得很好,它相应地创build了string( subStr

 If subBacia = "TODOS" Then subStr = """<>""" Else subStr = """=" & subBacia & QUOTE & " , Operator:=xlOr, Criteria2:=" & QUOTE & "=TOTAIS" & QUOTE & "" End If 

但是,这个部分,我避免做多个if s,不工作:

 ActiveSheet.Range("$A$12:$EX$2025").AutoFilter Field:=4, Criteria1:=subStr 

我的想法是,最终会以build筑的低潮为例,具有多重标准:

 ActiveSheet.Range("$A$12:$EX$2025").AutoFilter Field:=4, Criteria1:="=AN6b" _ , Operator:=xlOr, Criteria2:="=TOTAIS"` 

那么,我做错了什么,或者我不知道该怎么做? 编辑:这里去完整的代码

 Sub Filter() Dim subBacia, encarregado As String Dim bm As String Dim subStr, encStr, bmStr As String 'Application.Calculation = xlCalculationManual 'Application.ScreenUpdating = False Sheets("Resumo").Select encarregado = Range("T3") subBacia = Range("T5") bm = Range("T4") Const QUOTE = """" On Error Resume Next If encarregado = "TODOS" And bm = "TODOS" And subBacia = "TODOS" Then Sheets("Dem. Rede").Select ActiveSheet.ShowAllData Sheets("Dem. Interceptor").Select ActiveSheet.ShowAllData Sheets("Dem.Ramal").Select ActiveSheet.ShowAllData Else If encarregado = "TODOS" Then encStr = """<>""" Else encStr = """=" & encarregado & QUOTE & " , Operator:=xlOr, Criteria2:=" & QUOTE & "=TOTAIS" & QUOTE & "" End If If bm = "TODOS" Then bmStr = """<>""" Else bmStr = """=" & bm & QUOTE & " , Operator:=xlOr, Criteria2:=" & QUOTE & "=TOTAIS" & QUOTE & "" End If If subBacia = "TODOS" Then subStr = """<>""" Else subStr = """=" & subBacia & QUOTE & " , Operator:=xlOr, Criteria2:=" & QUOTE & "=TOTAIS" & QUOTE & "" End If Debug.Print encStr Debug.Print bmStr Debug.Print subStr Sheets("Dem. Rede").Select ActiveSheet.Range("$A$12:$EX$2025").AutoFilter Field:=2, Criteria1:=bmStr ActiveSheet.Range("$A$12:$EX$2025").AutoFilter Field:=3, Criteria1:=encStr ActiveSheet.Range("$A$12:$EX$2025").AutoFilter Field:=4, Criteria1:=subStr Sheets("Dem. Interceptor").Select ActiveSheet.Range("$A$12:$EM$137").AutoFilter Field:=2, Criteria1:=bmStr ActiveSheet.Range("$A$12:$EM$137").AutoFilter Field:=4, Criteria1:=encStr ActiveSheet.Range("$A$12:$EM$137").AutoFilter Field:=3, Criteria1:=subStr Sheets("Dem.Ramal").Select ActiveSheet.Range("$B$11:$Z$1214").AutoFilter Field:=3, Criteria1:=bmStr ActiveSheet.Range("$B$11:$Z$1214").AutoFilter Field:=2, Criteria1:=encStr ActiveSheet.Range("$B$11:$Z$1214").AutoFilter Field:=1, Criteria1:=subStr Sheets("Cadastro Ramal").Select ActiveSheet.Range("$A$9:$K$841").AutoFilter Field:=2, Criteria1:=bmStr End If 'Application.Calculation = xlCalculationAutomatic 'Application.ScreenUpdating = True End Sub 

编辑:顺便说一句, Debug.Print例如返回: "=9" , Operator:=xlOr, Criteria2:="=TOTAIS"
或简单地"<>"
而这正是它应该的方式,但是,似乎我不能按照我所希望的方式连接代码中的string。

您不能dynamic构buildVBA代码片段,并使用它们来补充您硬编码的不完整的语句。 我不认为在任何地方工作。 你可以dynamic地创build一个完整的sub并执行它,但我不build议这样做。

但是,无论如何,您不需要dynamic生成代码。 你想要预先确定参数的值,所以明确地做到这一点。 诀窍是你将需要显式使用Missing特殊值来传递你不想要的参数:

 Private Type CriteriaTuple Criteria1 As Variant Operator As Variant Criteria2 As Variant End Type Private Function MissingValue(Optional ByVal DoNotPassAnything As Variant) As Variant If Not IsMissing(DoNotPassAnything) Then Err.Raise 5, , "I said do not pass anything" MissingValue = DoNotPassAnything End Function Sub Filter() .... dim subStr as CriteriaTuple if ... then subStr.Criteria1 = """<>""" subStr.Operator = MissingValue subStr.Criteria2 = MissingValue else subStr.Criteria1 = """<>""" subStr.Operator = xlOr subStr.Criteria2 = """=TOTAIS""" end if ... ActiveSheet.Range("$A$12:$EX$2025").AutoFilter Field:=4, Criteria1:=subStr.Criteria1, Operator:=subStr.Operator, Criteria2:=subStr.Criteria2 End Sub 

除非你能另外显示,否则我不认为你可以让VBA把你的string解释为参数列表。 我不明白你想用这种方法保存什么。