Случайные элементы пули в выделении - PullRequest
0 голосов
/ 03 июня 2018

Я пытаюсь достичь чего-то очень простого.Чтобы выбрать элементы списка маркеров, запустите макрос и сделайте их случайным образом.Я никогда не использовал VBA в MS-Word, поэтому я начал с очень маленьких шагов, но даже за этими, кажется, трудно следовать.Моя стратегия - вставлять элементы по одному.Текст каждого вновь добавленного абзаца будет текстом случайно выбранного элемента из выбора.Когда количество добавленных абзацев равно количеству выбранных элементов, я начинаю удалять исходные элементы в выделении.

Это мой первоначальный черновик.Это не идеально повторяет мою стратегию, но мне нужны ответы об основах, чтобы продолжить.

Sub test()
Dim pars As Paragraphs
Dim rng As Range

' The selection is items from a bullet list (4 items).
Set pars = Selection.Paragraphs

' I have to do that if I don't want to overwrite the last element, though it is never filled later.. why?
pars.Add

' Simulate some shuffling here..
pars.Add.Range.FormattedText = pars(2).Range.FormattedText
pars.Add.Range.FormattedText = pars(1).Range.FormattedText
pars.Add.Range.FormattedText = pars(3).Range.FormattedText
pars.Add.Range.FormattedText = pars(4).Range.FormattedText

' The total number of paragraphs should be 8..
MsgBox pars.Count

' Now remove the top 4 paragraphs to keep just the last ones I added..
For i = 1 To 4
    pars(1).Range.Delete
Next i

' I should get a message with 4 in it, instead I'm getting 1.. why??
MsgBox pars.Count

End Sub

Мой вопрос: каков процесс добавления абзацев?Как я могу удалить абзацы?

1 Ответ

0 голосов
/ 04 июня 2018

Ваш инстинкт об использовании объекта Range хорош, хотя ваш код на самом деле его не использует.Вместо использования Selection.Paragraphs установите Selection.Range в Range - Range будет содержать абзацы.Это оригинал, который вы позже удалите.

Объявите второй Диапазон как цель для новых абзацев, используя свойство Range.Duplicate, чтобы сделать «копию» исходного диапазона.«Свернуть» это до конца.Таким образом, когда вы добавляете абзацы, они «прикрепляются» к концу исходного диапазона.

Хорошее использование Range.FormattedText для «копирования» абзацев.Снова сверните целевой Range после каждого добавления, чтобы избежать замены того, что вы добавили в предыдущей итерации цикла.

В конце удалите исходный Range.

Sub ShuffleBullets1()
    Dim pars As word.Paragraphs
    Dim rngNewPars As word.Range
    Dim rngOldPars As word.Range
    Dim i As Long

    Set rngOldPars = Selection.Range
    Set rngNewPars = rngOldPars.Duplicate
    rngNewPars.Collapse wdCollapseEnd
    Set pars = rngOldPars.Paragraphs
    For i = pars.Count To 1 Step -1
        rngNewPars.FormattedText = pars(i).Range.FormattedText
        rngNewPars.Collapse wdCollapseEnd
    Next
    rngOldPars.Delete
End Sub
...