Как получить номер строки, затем циклически проходить через выбранный диапазон - PullRequest
0 голосов
/ 11 октября 2018

Я создаю макрос, который будет создавать документ Word из шаблона и перемещать информацию из каждой выбранной строки в Excel.Пока что документы создаются и информация перемещается, но из неправильных ячеек:

Например, когда я выбираю ячейки из C5 в C8, макрос создает 3 документа и заполняет их информацией от C1 до C3.Мне нужно, чтобы эти документы были заполнены информацией из выбранных строк.

Я понимаю, что мне нужно исправить ссылку, но я не могу придумать способ ссылки на выбранную строку диапазона, в которой в данный момент находится цикл.Пожалуйста, дайте мне совет.Мой код на данный момент:

Sub Move_info_UPDT()

Dim objWord
Dim objDoc
Dim i As Long

For i = 1 To Selection.Rows.Count

    Set objWord = CreateObject("Word.Application")
    Set objDoc = objWord.Documents.Add(Template:="C:\Users\grusa\Desktop\test2.dotx", NewTemplate:=False, DocumentType:=0)

    With objDoc
        'I need it to  be cell from the same row loop currently is
        ' now this line move info to first doc from C1, to second from C2 and etc.
        .ContentControls.Item(1).Range.Text = Worksheets("Lapas").Cells(i, "C").Value
    End With

    objWord.Visible = True

    Next

objWord.Visible = True

End Sub

Дополнительный вопрос: поскольку весь процесс может занять некоторое время, есть ли способ показать какую-то полосу загрузки, чтобы показать, что макрос работает?

Ответы [ 2 ]

0 голосов
/ 11 октября 2018

Вам нужно изменить цикл на абсолютный , не считая относительно по отношению к выбранному диапазону, как вы сделали.

Для информации о состоянии вы можете использовать Application.StatusBarчтобы показать рабочий шаг макроса в строке состояния Excel.

Option Explicit

Public Sub Move_info_UPDT()
    Dim objWord As Object
    Dim objDoc As Object

    Dim ProcessRange As Range
    Set ProcessRange = Selection

    Dim i As Long
    For i = ProcessRange.Row To ProcessRange.Rows.Count + ProcessRange.Row - 1
        Set objWord = CreateObject("Word.Application")
        Set objDoc = objWord.Documents.Add(Template:="C:\Users\grusa\Desktop\test2.dotx", NewTemplate:=False, DocumentType:=0)

        With objDoc
            'I need it to  be cell from the same row loop currently is
            ' now this line move info to first doc from C1, to second from C2 and etc.
            .ContentControls.Item(1).Range.Text = ProcessRange.Parent.Cells(i, "C").Value
        End With

        objWord.Visible = True
        Application.StatusBar = "Progress: " & i - ProcessRange.Row + 1 & " of " & ProcessRange.Rows.Count
        DoEvents 'keep Excel responsive
    Next i

    Application.StatusBar = ""
End Sub
0 голосов
/ 11 октября 2018

Вы можете использовать их для начала и конца цикла:

Dim FirstRow as Long
Dim LastRow as Long
FirstRow = Selection.Rows(1).Row
LastRow = FirstRow + Selection.Rows.Count

Затем цикл будет выглядеть так:

For i = FirstRow To LastRow
    ' ...
Next i
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...