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

У меня есть 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
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
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

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