Macro do Word para substituir palavras em intervalos específicos com um espaço em branco

0

Sou muito novo em macros no Word, mas quero automatizar um processo e vagar se alguém puder me ajudar.

Eu sou professora de idiomas. Eu quero pegar uma história que minha turma criou, selecionar cada oitava (ou enésima) palavra e recortar o documento. Eu quero então substituir a palavra extraída por um 'em branco' (ou seja, 8 sublinha a qual o aluno irá escrever) e depois colar a palavra extraída em algum outro lugar.

Eu tive uma confusão com isso e surgiu o seguinte:

Sub Blankify8()

 Blankify8 Macro


    Selection.MoveRight Unit:=wdWord, Count:=8
    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
    Selection.Cut
    Selection.TypeText Text:="____________ "
    Windows("Document4").Activate
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
    Selection.TypeParagraph
    Windows("Document3").Activate
End Sub

Existem alguns problemas com isso. Primeiro, prefiro que as palavras sejam coladas em uma caixa de texto ou tabela no mesmo documento e não coladas em outro documento. Eu não consegui descobrir como fazer isso. É claro que, se não houver nenhum documento '4' aberto no momento da execução da macro, ele também não funcionará.

O segundo problema é que apenas mantendo o controle e pulando 8 teclas pressionadas pelo cursor, às vezes, cortará um sinal de pontuação ou um retorno de carro, o que estraga o documento original. Eu só quero retirar palavras.

Além disso, gostaria de poder repetir o comando para que ele seja repetido até o final do documento.

E, finalmente, existe uma maneira de eu ter a macro perguntando ao usuário que intervalo eles querem usar para o número de etapas a serem ignoradas?

Para a pessoa que respondeu:

Muito obrigado, de fato.

Limitar a seleção a mais de 3 caracteres é melhor, mas quero que a macro corte palavras do texto indiscriminadamente (o objetivo é o ensino de idiomas e geralmente são as palavras menores que podem exigir ênfase em tal atividade).

Encontrei algum código escrito por outra pessoa que pode funcionar, mas não entendo como implementá-lo na minha macro com o restante dos comandos:

    Function IsLetter(strValue As String) As Boolean

Dim intPos As Integer
For intPos = 1 To Len(strValue)
    Select Case Asc(Mid(strValue, intPos, 1))
        Case 65 To 90, 97 To 122
            IsLetter = True
        Case Else
            IsLetter = False
            Exit For
    End Select
Next

End Function

    Sub Blank()

Dim OriginalStory As Document
Set OriginalStory = ActiveDocument
Dim WordListDoc As Document
Set WordListDoc = Application.Documents.Add

Windows(OriginalStory).Activate

sPrompt = "How many spaces would you like between each removed word?"
sTitle = "Choose Blank Interval"
sDefault = "8"
sInterval = InputBox(sPrompt, sTitle, sDefault)

Selection.HomeKey Unit:=wdStory

Do Until Selection.Bookmarks.Exists("\EndOfDoc") = True

Selection.MoveRight Unit:=wdWord, Count:=sInterval, Extend:=wdMove
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend

    If IsLetter = True Then

    Selection.Cut
    Selection.TypeText Text:="__________ "
    Windows(WordListDoc).Activate
    Selection.PasteAndFormat (wdFormatOriginalFormatting)
    Selection.TypeParagraph
    Windows(OriginalStory).Activate

    Else

    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdMove
    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend

    Loop

Loop

End Sub

A função deve ficar "acima" do resto do código, certo? Mas eu recebo um erro 'argumento não opcional' quando eu o executo. Quero destacar todas as enésimas seleções, verificar se é uma palavra real, se é recortar e colá-la no outro documento e, se não, passar para a próxima seleção e verificar até encontrar uma palavra.

    
por James 21.04.2017 / 07:14

1 resposta

0

First, I would rather the words are pasted into a textbox or table in the same document and not pasted into another document altogether.

Após a conclusão da macro, você pode adicionar apenas algumas linhas para copiar todo o conteúdo do novo documento para o antigo

Of course if there is no 'document 4' open at the time of running the macro it wouldn't function too.

Não se refere ao documento existente, crie um novo quando você iniciar sua macro

Dim NewDoc as Document
Set NewDoc = Application.Documents.Add

holding control and skipping on 8 cursor key presses will sometimes cut out a punctuation mark or a carriage return, which messes up the original document. I only want to pull out words.

Não é a solução mais elegante, mas você pode, por exemplo procure por palavras mais longas que por exemplo 3 caracteres, isso excluirá a maioria dos seus problemas.

...
Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Do until len(Selection) > 3 OR Selection.Bookmarks.Exists("\EndOfDoc")
    Selection.MoveRight Unit:=wdWord, Count:=1, Extend:=wdExtend
Loop
If Not Selection.Bookmarks.Exists("\EndOfDoc") Then
    Selection.Cut
...

Also, I would like to be able to loop the command so that it repeats until the end of the document.

Adicione um loop ao redor do seu loop:

Do 
    ...
Loop While Selection.Bookmarks.Exists("\EndOfDoc")

is there a way I can have the macro ask the user what interval they want to use for the number of steps to skip forward?

Você pode usar InputBox para solicitar a entrada do usuário:

Dim SkipWordCount as Integer

SkipWordCount = CInt(InputBox("Enter number of words to be skipped"))

Loop
    Selection.MoveRight Unit:=wdWord, Count:= SkipWordCount
    ...
    
por 25.04.2017 / 09:45