Word 中的嵌套 IF 域 VBA
Nested IF field in Word VBA
我正在尝试创建一个单词插件,它从可能的合并字段列表中添加复杂的 IF 语句创建。
复杂是
{ IF { = OR ( { COMPARE { MERGEFIELD Field_1 } <= "Value" }, { COMPARE { MERGEFIELD Field_2 } >= "Value" } ) } = 1 "True Instructions" "False Instructions" }
我试图在 VBA 中完成这一切,但我的 Complex if 有问题,因为我无法让“}”在正确的位置结束。
如果我在末尾以外的任何其他位置使用终止符 "Selection.EndKey Unit:=wdLine",它会造成混乱并在该行放置所有 }。
这是我的代码:
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="IF "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=" = " & JointOperator1 & " ( "
'FIRST ARG
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False, Text:="MERGEFIELD " & FirstArg1
Selection.TypeText Text:=" "
Selection.TypeText Text:=ComparisonType1
Selection.TypeText Text:=" "
Selection.TypeText Text:=Chr(34) & SecondArg1 & Chr(34)
Selection.TypeText Text:=", "
'SECOND ARG
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False, Text:="MERGEFIELD " & FirstArg2
Selection.TypeText Text:=" "
Selection.TypeText Text:=ComparisonType2
Selection.TypeText Text:=" "
Selection.TypeText Text:=Chr(34) & SecondArg2 & Chr(34)
Selection.TypeText Text:=" ) "
Selection.TypeText Text:=" = 1 "
Selection.TypeText Text:=vbCrLf & " " & Chr(34)
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=strTempIfTrue
Selection.TypeText Text:=Chr(34) & " " & vbCrLf
Selection.TypeText Text:=" " & Chr(34)
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=strTempIfFalse
Selection.TypeText Text:=Chr(34)
Selection.EndKey Unit:=wdLine
Selection.TypeParagraph
这就是我在生成 "Complex if"
时得到的结果
{IF { = AND ( {COMPARE{MERGEFIELD FHB} = "T", { COMPARE {MERGEFIELD BLAH} = "F") = 1 "If True text" "If False Text"}}}}
但应该是这样的:
{IF { = AND ( {COMPARE{MERGEFIELD FHB} = "T" **}** , { COMPARE {MERGEFIELD BLAH} = "F" **}** ) **}** = 1 "If True text" "If False Text"}
如果有人能阐明这件事,我哪里错了。
或者如果有一种方法可以强制 Ending } 的位置,那就太好了
我是 VBA 的新手(我是 C++ 程序员)
所以我找到了解决问题的方法。
我用宏记录器(View>Macros>Record Macro...)这个词来记录我输入复杂的if语句,然后通过按Alt + F11并选择宏来查看宏,我只是简单地替换了一些带有我的变量的字符串。
这已经解决了问题。
希望这对其他人有帮助,让他们免去挠头的时间。
我没想到您可以记录这些操作以供以后查看。你每天都能学到新东西。
录音是这样的。
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="IF "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=" = AND ("
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=" COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="MERGEFIELD FHB"
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:=" = """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="T"
Selection.MoveRight Unit:=wdCharacter, Count:=3
Selection.TypeText Text:=", "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="MERGEFIELD Other"
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:=" <> """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="T"
Selection.MoveRight Unit:=wdCharacter, Count:=3
Selection.TypeText Text:=")"
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:=" = 1 """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="IfTrue"
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=" """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="IfFalse"
我正在尝试创建一个单词插件,它从可能的合并字段列表中添加复杂的 IF 语句创建。
复杂是
{ IF { = OR ( { COMPARE { MERGEFIELD Field_1 } <= "Value" }, { COMPARE { MERGEFIELD Field_2 } >= "Value" } ) } = 1 "True Instructions" "False Instructions" }
我试图在 VBA 中完成这一切,但我的 Complex if 有问题,因为我无法让“}”在正确的位置结束。
如果我在末尾以外的任何其他位置使用终止符 "Selection.EndKey Unit:=wdLine",它会造成混乱并在该行放置所有 }。
这是我的代码:
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="IF "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=" = " & JointOperator1 & " ( "
'FIRST ARG
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False, Text:="MERGEFIELD " & FirstArg1
Selection.TypeText Text:=" "
Selection.TypeText Text:=ComparisonType1
Selection.TypeText Text:=" "
Selection.TypeText Text:=Chr(34) & SecondArg1 & Chr(34)
Selection.TypeText Text:=", "
'SECOND ARG
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False, Text:="MERGEFIELD " & FirstArg2
Selection.TypeText Text:=" "
Selection.TypeText Text:=ComparisonType2
Selection.TypeText Text:=" "
Selection.TypeText Text:=Chr(34) & SecondArg2 & Chr(34)
Selection.TypeText Text:=" ) "
Selection.TypeText Text:=" = 1 "
Selection.TypeText Text:=vbCrLf & " " & Chr(34)
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=strTempIfTrue
Selection.TypeText Text:=Chr(34) & " " & vbCrLf
Selection.TypeText Text:=" " & Chr(34)
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=strTempIfFalse
Selection.TypeText Text:=Chr(34)
Selection.EndKey Unit:=wdLine
Selection.TypeParagraph
这就是我在生成 "Complex if"
时得到的结果{IF { = AND ( {COMPARE{MERGEFIELD FHB} = "T", { COMPARE {MERGEFIELD BLAH} = "F") = 1 "If True text" "If False Text"}}}}
但应该是这样的:
{IF { = AND ( {COMPARE{MERGEFIELD FHB} = "T" **}** , { COMPARE {MERGEFIELD BLAH} = "F" **}** ) **}** = 1 "If True text" "If False Text"}
如果有人能阐明这件事,我哪里错了。 或者如果有一种方法可以强制 Ending } 的位置,那就太好了 我是 VBA 的新手(我是 C++ 程序员)
所以我找到了解决问题的方法。
我用宏记录器(View>Macros>Record Macro...)这个词来记录我输入复杂的if语句,然后通过按Alt + F11并选择宏来查看宏,我只是简单地替换了一些带有我的变量的字符串。 这已经解决了问题。
希望这对其他人有帮助,让他们免去挠头的时间。
我没想到您可以记录这些操作以供以后查看。你每天都能学到新东西。
录音是这样的。
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="IF "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=" = AND ("
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:=" COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="MERGEFIELD FHB"
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:=" = """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="T"
Selection.MoveRight Unit:=wdCharacter, Count:=3
Selection.TypeText Text:=", "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="COMPARE "
Selection.Fields.Add Range:=Selection.Range, Type:=wdFieldEmpty, _
PreserveFormatting:=False
Selection.TypeText Text:="MERGEFIELD Other"
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:=" <> """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="T"
Selection.MoveRight Unit:=wdCharacter, Count:=3
Selection.TypeText Text:=")"
Selection.MoveRight Unit:=wdCharacter, Count:=2
Selection.TypeText Text:=" = 1 """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="IfTrue"
Selection.MoveRight Unit:=wdCharacter, Count:=1
Selection.TypeText Text:=" """""
Selection.MoveLeft Unit:=wdCharacter, Count:=1
Selection.TypeText Text:="IfFalse"