【发布时间】:2017-05-26 05:37:50
【问题描述】:
我有一个带有可选参数的子程序
Public Sub FaR_Wild_Stories_Extras(ByVal rngStory As Word.Range, _
ByVal strSearch As String, ByVal strReplace As String, _
Optional extra1 As String = "", Optional extra2 As String = "")
With rngStory.Find
.ClearFormatting
.Replacement.ClearFormatting
.Text = strSearch
.Replacement.Text = strReplace
.Forward = True
.MatchWildcards = True
.MatchCase = True
.IgnorePunct = True
.IgnoreSpace = True
.Format = False
.Wrap = wdFindContinue
If extra1 <> "" Then eval(extra1)
If extra2 <> "" Then eval(extra2)
.Execute Replace:=wdReplaceAll
End With
End Sub
我希望能够将诸如“.font.size=14”或.MatchDiacritics = False 之类的内容放在extra1 中并对其进行评估,以便在调用查找和替换子例程时,如果有特定的额外参数我想要一次性包含在查找和替换中,我不必为它创建一个完整的单独子。
有没有办法做到这一点? Eval() 似乎在 word VBA 中不存在。 Object.string 是不可能的,除了复制子例程或拥有一个包含 10 个很少使用的可选参数的子例程之外,还有什么更聪明的方法可以构建我的代码吗?
对于更笼统的情况,是否可以像这样call一个sub,或者通过巧妙地传递参数来构造代码以达到相同的效果
...
call Example , true, ".prop1=5", ".prop2=6"
...
Sub Example1(x, Optional param1 As String, Optional param2 As String)
With Application.ExampleObject
.property1 = "foo"
.property2 = x
Expand (param1)
Expand (param2)
.excecute
End With
End Sub
【问题讨论】:
-
我认为应该是
Evaluate(),但我完全不确定这是否可行 -
evaluate() 是一个特定于 Excel 的函数,适用于工作表公式而不是 vba 代码(例如
evaluate("sum(a1:d4))") -
即使在 excel 中,eval/Evaluate 也只是一种调用函数的机制。您在示例中尝试做的是将属性设置为对象。据我所知,VBA 不支持这样的功能。要调整属性,您首先需要一个对象实例,然后反映它以替换/添加属性值。 .Net/Java 支持反射,VBA 不支持。
-
那么你建议我做什么?我可以为最终使用的每个属性组合创建一个新的子(涉及大量代码重复)?我可以为我将来可能会使用的每个属性创建一个带有一堆可选参数的 sub 的庞然大物(更好,但仍然丑陋)或者是否有更聪明的方法可以实现类似的目的,也就是说调用包含由多个参数定义的方法的子例程,而没有在子例程的参数中指定所有这些可能使用的参数?
-
@cyboashu 事实证明这实际上是可能的,请参阅下面的答案。
标签: vba replace eval ms-word execute