Цикл по именованному диапазону

У меня есть named range для списка файлов отчетов, которые я создал. Они хранятся в папке, которая соответствует имени их файла.

нравится - -

Список файлов - это Named Range под названием order

а

б

c

и они хранятся в такой папке:

\ папка \ a \ a_support.xls

\ папка \ b \ b_support.xls

\ папка \ c \ c_support.xls

Я пытаюсь скопировать каждый файл xls в мастер-лист. Список не в алфавитном порядке, поэтому мне нужно просмотреть список и импортировать в том порядке, который у меня есть в настоящее время. Я попытался создать цикл, но не смог правильно указать свои именованные диапазоны или объекты.

Как мне сделать цикл, используя «i» для просмотра моего списка? Я буду использовать значение i для динамической ссылки на каталог.

вот мой код в его нынешнем виде

 Sub Move_reports()

    Dim day As String
    Dim FromPath As String
    Dim i As Long
    Dim wsname As String
    Dim order As Range
    Dim c As Range

    day = Sheets("data").Cells(1, 2).Value
    FromPath = "\local\shared\"& day &"DOCUMENTS\" & i & "\"
    Set c = Worksheets("data").Range(order) _

    For Each c In order
        If c.Value <> "" Then
            wsname = c.Value
            Workbooks.Open Filename:= _
            FromPath & i & "_support.xls" _
            , UpdateLinks:=0
        Sheets(i).Select
        Sheets(i).Copy After:=Workbooks("SEP_FINAL.xlsm").Sheets("BEG")
     ActiveWindow.Close
     SaveChanges = True

    End If
   Next
End Sub

что вы имеете в виду под СПИСОК? где вы храните имена файлов xls?

Ibo 13.09.2018 18:59

У меня есть именованный список (называемый «порядок») и список имен каждого отчета. Все они сохраняются в виде файлов .xls в соответствующих папках по одному и тому же пути.

john 13.09.2018 19:12

В Excel / VBA нет LIST, вы имели в виду, что это range

Ibo 13.09.2018 19:18

вам не нужно использовать Select при запуске кода VBA, Select генерируется, когда вы записываете макрос, но практически в этом нет необходимости, поэтому вы можете удалить строки, в которых есть команда Select

Ibo 13.09.2018 19:30
0
4
2 697
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

хорошо, если у вас есть named range с именем order, чтобы прокручивать его сверху вниз, чтобы сохранить порядок открытия файлов, вы должны использовать что-то вроде этого в своем цикле:

Dim rng As Range

Set rng = Worksheets("Sheet1").Range("order").Columns(1) 'change the name of sheet per you need
For i = 1 To rng.Rows.Count
   wsname = rng.Cells(i, 1)
Next i

предположение: вам не нужно сохранять имя и порядок файлов в named range, потому что, если список увеличивается, вам также нужно изменить свой named range. Вы можете легко подобрать названия любого числа из столбца листа. Допустим, вы сохраняете имена и порядок в столбце A листа Sheet1, поэтому сделайте следующее:

Dim rng As Range
Set rng = Worksheets("Sheet1").Range("A1").CurrentRegion.Columns(1)
For i = 1 To rng.Rows.Count
   wsname = rng.Cells(i, 1)
Next i

не стесняйтесь ставить галочку и голосовать, если вас устраивает ответ :)

Ibo 13.09.2018 19:38

Спасибо за петлю! У меня почти все заработало, но значение "i" сохраняет возврат "0", а затем "1" Скриншот

john 13.09.2018 21:01

Да! Я установил имя пути до того, как инициировать имя рабочего листа, поэтому цикл не начался, а значение wsname не было заполнено. Большое спасибо

john 13.09.2018 21:27

Вот мой готовый рабочий код для тех, кто ищет тот же ответ, что и я

Еще раз спасибо Lbo!

все, что осталось, это 'IfError, next i'

Sub Move_reports()

    Dim day As String
    Dim FromPath As String
    Dim i As Integer
    Dim wsname As String
    Dim rng As Range
    day = Sheets("data").Cells(1, 2).Value _

    Set rng = Worksheets("data").Range("A2").CurrentRegion.Columns(1)
       For i = 2 To rng.Rows.Count
        wsname = rng.Cells(i, 1)
        FromPath = "\SUPPORT\" & day & "\DOCUMENTS\" & wsname & "\" _

        Workbooks.Open Filename:= _
        FromPath & wsname & "_support.xls" _
         , UpdateLinks:=0
        Sheets(wsname).Select
        Sheets(wsname).Copy After:=Workbooks("SEP_FINAL.xlsm").Sheets("BEG")
        ActiveWindow.Close
        SaveChanges = True
     Next i

End Sub

Другие вопросы по теме