我试图将Word VBA程序转换为AppleScript并且只有部分运气。
这是VBA程序的第一个版本:
Public Sub postprocessMerges1()
Dim rng As Range
Selection.HomeKey unit:=wdStory
With Selection.Find
.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.Format = False
Do
.Text = "..."
.Execute
If .Found Then
.Parent.Select
Set rng = Selection.Range
rng.MoveStart unit:=wdParagraph, Count:=-1
rng.MoveEndUntil cset:=Chr(13)
rng.Text = formatAmounts(rng.Text)
End If
Loop While .Found
End With
End Sub
这是我对应的AppleScript:
on postprocessMerges()
tell application "Microsoft Word"
home key selection move unit a story extend by moving
set selFind to find object of selection
clear formatting selFind
set foundIt to true
repeat while foundIt
set foundIt to execute find selFind find text "..." wrap find stop with match forward without find format
if foundIt then
set foundRng to text object of selection
set foundRng to move start of range foundRng by a paragraph item count -1
set foundRng to move range end until foundRng characters {return}
set tt to (content of foundRng)
set (content of foundRng) to my formatAmounts(tt)
end if
end repeat
end tell
end postprocessMerges
好的,这样就可以了。但是,我希望它更好。脚本当前的编写方式,它实际上从命中跳转到命中,突出显示找到的文本并执行formatAmounts子例程生成的替换。不错,但是当你使用200页以上的文档时,看到屏幕上发生这种情况会有点乏味。
所以在VBA中,我可以这样做:
Public Sub postprocessMerges2()
With ActiveDocument.Content.Find
.ClearFormatting
.Forward = True
.Wrap = wdFindStop
.Format = False
Do
.Text = "..."
.Execute
If .Found Then
With .Parent
.MoveStart unit:=wdParagraph, Count:=-1
.MoveEndUntil cset:=Chr(13)
.Text = formatAmounts(.Text)
.Collapse direction:=wdCollapseEnd
End With
End If
Loop While .Found
End With
End Sub
这将执行与第一个程序完全相同的操作,但是它会在文档的内容范围而不是选择范围内执行,因此我不必看到Word从页面跳转到页面到页面。更为可取,但不是我在AS中能够效仿的东西。
具体来说,我似乎无法在每次循环中获得命中范围而不先选择它。 Word的AS字典中的查找对象没有像我在VBA中那样可以访问的父属性。
我有什么遗失的吗?我在第二个VBA过程中所做的是在AS中实际可复制的吗?
这是在OS X 10.9.3上使用Word 2011和AppleScript 2.3。
答案 0 :(得分:0)
这应该是评论,但是......
我在第二个VBA proc中做的是否可以在AS中复制?
让我这样说吧。我想你可能最终会在AS中使用Selection对象,而不是你在VBA中可能会做的事情。在这种情况下,在VBA中,Find.Execute应返回一个新的Range,但在AS中它只返回true / false。如果你在AS字典中查找它,看起来就像execute find应该返回一个“文本范围/插入点”,但它实际返回的是“执行查找”条目顶部描述中所述的内容。 ,即布尔值。 find对象没有范围。因此,很难看到如何获得刚刚找到的东西的范围。据我所知,在AS中使用execute find和从range对象派生的find对象仅在你可以指定replacment对象并在execute中执行整个替换的情况下才有用。
中阅读Matt Neuberg的评论也许有用