Excel VBA: цикл копирования для нескольких именованных диапазонов

Я хочу скопировать несколько именованных диапазонов. Диапазоны имеют установленное соглашение об именах с короткой строкой, затем числом (например, Body1, Body2 и т. д.).

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

Код:

Dim Bnum As Integer          'Bnum is Loop Counter
Dim Nbodies As Integer       'Nbodies is how many loops should go
Dim BodyNum As String

'BodyNum is the sheet name where the named range is (and also the named range I`d like to copy). The named ranges are workbook wide in this case


Nbodies = Range("N.Bodies")  'Called from elsewhere in the workbook

Bnum = 1                    'Initial counter set
BodyNum = "Body" & Bnum     'Name of worksheet+named range which I want to copy

Do Until Bnum = Nbodies + 1
    Workbooks(Wkbk).Activate
    Worksheets(BodyNum).Range("B2:C50").Copy

'Copies range manually definied in vba B2:C50 in this case. Want to copy named range with the same name as Bodynum, varying the digit for each loop

    Workbooks(Inputbk).Activate     'The paste portion works fine
    Selection.PasteSpecial Paste:=xlPasteValues
    Call Cursor.Cursor
    Workbooks(Wkbk).Activate
    Bnum = Bnum + 1         'Iterates loop counter
    BodyNum = "Body" & Bnum
Loop

person Me_jono    schedule 11.11.2017    source источник


Ответы (1)


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

Вы упомянули, что вы Want to copy named range with the same name as Bodynum.

Тогда все, что вам нужно сделать, это повернуть эту строку:

Worksheets(BodyNum).Range("B2:C50").Copy

в это:

Worksheets(BodyNum).Range(BodyNum).Copy
person Excelosaurus    schedule 11.11.2017
comment
Он не хочет работать для вызова именованного диапазона, хотя отлично работает для рабочего листа. Я мог бы вызвать определенный именованный диапазон, например, используя Worksheets(BodyNum).Range("Body1").Copy, но это не помогает в отношении цикла - person Me_jono; 11.11.2017
comment
Пожалуйста, уточните, что вы пытаетесь сделать. - person Excelosaurus; 12.11.2017
comment
Я хочу скопировать несколько именованных диапазонов, называемых Body1, Body2, Body3 и т. д., каждый из которых расположен на листе с тем же именем, в отдельную книгу с помощью цикла. Я бы хотел, чтобы именованный диапазон повторялся в цикле вместо того, чтобы в настоящее время вызывать ячейки вручную. Однако использование Worksheets(BodyNum).Range(BodyNum).Copy приводит к ошибке отладки и не будет выполняться при вызове ячеек вручную (либо Range("Body1").Copy, либо Range("B2:C50") будут работать, но не зацикливаются, как мне бы хотелось - person Me_jono; 12.11.2017
comment
Если я удалю часть команды «Рабочие листы» и просто вызову диапазон глобально, например Range(BodyNum).Copy, тогда вместо этого будет ошибка Метод «Диапазон объекта» _Global »не удалось - person Me_jono; 12.11.2017
comment
Вы имеете в виду, что рабочий лист Body1 содержит именованный диапазон Body1, рабочий лист Body2 содержит именованный диапазон Body2 и т. д. или что все именованные диапазоны Body1, Body2 и т. д. находятся на одном листе? - person Excelosaurus; 12.11.2017
comment
Первый вариант. Есть несколько рабочих листов, каждый с одним именованным диапазоном с тем же именем, что и рабочий лист. - person Me_jono; 12.11.2017
comment
Если вы используете код, указанный в моем ответе, какой номер ошибки и сообщение вы получите? И проверили ли вы, что каждый из ваших рабочих листов содержит диапазон с таким же именем, как и они сами? - person Excelosaurus; 12.11.2017
comment
Ах. У меня была дополнительная точка в именованных диапазонах, поэтому VBA не мог ее вызвать. Ну... теперь я чувствую себя глупо. Спасибо! - person Me_jono; 12.11.2017
comment
Прохладный! Лучший способ поблагодарить людей здесь — проголосовать за полезные ответы и отметить лучший, используя большую зеленую галочку. - person Excelosaurus; 12.11.2017