AppleScripting MSWord查找操作

时间:2014-07-14 21:27:50

标签: ms-word applescript

我试图将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。

1 个答案:

答案 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中执行整个替换的情况下才有用。

this conversation

中阅读Matt Neuberg的评论也许有用