Как мне преобразовать этот код из VBA в Applescript? - PullRequest
0 голосов
/ 08 января 2020

Я пытаюсь преобразовать этот код из VBA в AppleScript 2.5.

Sub testMacro()
Application.ScreenUpdating = False
Dim InDoc As Document, OutDoc As Document, i As Long
Dim RngOut As Range, RngNm As Range, StrNm As String
Set InDoc = ActiveDocument
With InDoc
Set RngOut = ActiveDocument.Range(0, 0)
Dim obj As New DataObject
For i = 1 To 3
Set RngOut = RngOut.GoTo(What:=wdGoToPage, Name:=i)
Set RngOut = RngOut.GoTo(What:=wdGoToBookmark, Name:="\page")
RngOut.Copy
Set OutDoc = Documents.Add
With OutDoc
.Range.Paste
.Characters.Last.Delete
Set RngNm = .Paragraphs.First.Range
RngNm.End = RngNm.End - 1
StrNm = RngNm.Text
.Paragraphs.First.Range.Delete
obj.SetText StrNm
obj.PutInClipboard
.Close
End With
Next i
End With
Set RngOut = Nothing: Set RngNm = Nothing
Set InDoc = Nothing: Set OutDoc = Nothing
Application.ScreenUpdating = True
End Sub

Мне сказали, что я могу просто сделать следующее, но это не работает:

tell application "Microsoft Word"
    activate
    do Visual Basic "GetPage
    End Sub

    Sub GetPage()
        Application.ScreenUpdating = False
        Dim InDoc As Document, OutDoc As Document, i As Long
        Dim RngOut As Range, RngNm As Range, StrNm As String
        Set InDoc = ActiveDocument
        With InDoc
        Set RngOut = ActiveDocument.Range(0, 0)
        Dim obj As New DataObject
        For i = 1 To 3
        Set RngOut = RngOut.GoTo(What:=wdGoToPage, Name:=i)
        Set RngOut = RngOut.GoTo(What:=wdGoToBookmark, Name:=\"\page\")
        RngOut.Copy
        Set OutDoc = Documents.Add
        With OutDoc
        .Range.Paste
        .Characters.Last.Delete
        Set RngNm = .Paragraphs.First.Range
        RngNm.End = RngNm.End - 1
        StrNm = RngNm.Text
        .Paragraphs.First.Range.Delete
        obj.SetText StrNm
        obj.PutInClipboard
        .Close
        End With
        Next i
        End With
        Set RngOut = Nothing: Set RngNm = Nothing
        Set InDoc = Nothing: Set OutDoc = Nothing
        Application.ScreenUpdating = True"
end tell 

Я получаю эту ошибку: Ожидаемый конец строки и т. Д. c. но нашел идентификатор. и он выделяет следующее (которое я выделил жирным шрифтом): do Visual Basi c "GetPage

По сути, этот код должен получите первое слово каждой страницы документа и вставьте первое слово на последней странице, на которой он находится, в буфер обмена.

1 Ответ

1 голос
/ 11 января 2020

do Visual Basic не является командой AppleScript в словаре AS для Word, поэтому она не будет работать.

(Мало того, ваш код VBA в вашем примере в любом случае недопустим.)

run VB macro является командой AS для Word, поэтому, если у вас есть макрос VBA с именем GetPage, скажем, в вашем проекте Normal.dot, вы можете использовать этот AppleScript для его запуска:

tell application "Microsoft Word"
    run VB macro macro name "GetPage"
end tell

(ПРИМЕЧАНИЕ. Я предполагаю, что ваш код VBA будет работать в версии Word для Ma c. Я не пробовал его и исправлял, если это не было бы другим вопросом.)

Вот быстрый AppleScript, который я написал, который должен делать то, что вы хотите. Он захватывает первое слово каждой страницы и копирует их в буфер обмена. Имейте в виду, что у этого был минимальный уровень тестирования, но он работал с документом Word на 79 страниц, который у меня был.

use AppleScript version "2.5"
use scripting additions
use framework "Foundation"

to trimText:inText

    set _str to current application's NSString's stringWithString:inText
    set _whitespace to current application's NSCharacterSet's whitespaceAndNewlineCharacterSet()
    set _str to _str's stringByTrimmingCharactersInSet:_whitespace
    return _str as text

end trimText:

on run

    set wordList to {}
    set lastPage to false

    tell application "Microsoft Word"

        tell active document
            set firstWord to word 1

            repeat until lastPage
                set pageWord to my trimText:(content of firstWord)
                if pageWord ≠ "" then set end of wordList to pageWord
                set nextPage to go to next firstWord what goto a page item
                if (start of content of nextPage) is not equal to (start of content of firstWord) then
                    set firstWord to word 1 of nextPage
                else
                    set lastPage to true
                end if
            end repeat
        end tell

    end tell

    if (count of wordList) is greater than 0 then
        set {oldDelims, AppleScript's text item delimiters} to {AppleScript's text item delimiters, linefeed}
        set the clipboard to (wordList as text)
        set AppleScript's text item delimiters to oldDelims
    end if

end run
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...