Копирование и вставка несмежных диапазонов

#excel #vba

#excel #vba

Вопрос:

У меня есть данные в Excel. Я хочу скопировать заголовок и некоторые данные из середины листа в Powerpoint. Я знаю, что вы не можете скопировать выделение несмежных ячеек в Excel, но у меня сложилось впечатление, что это будет работать с VBA.

Моя попытка:

 With Workbooks(1).Sheets(1)
    Set rng = Union(.Range("B2:K3"), .Range("B45:K85"))
End With
 

Я могу выбрать «rng», но я не могу вставить его куда угодно, потому что я получаю сообщение об ошибке, что вы не можете вставить несмежные ячейки.

Я также пробовал это, но это привело к копированию всей таблицы (B2: K85):

 With ThisWorkbook.Sheets("Sheet1")
        Set rng1 = .Range("B2:K3")
        Set rng2 = .Range("B45:K85")
        Set NewRng = .Range(rng1.Address amp; ":" amp; rng2.Address)
End With
 

Я искал этот вопрос в Google и пробовал разные вещи, но либо я неправильно понял, что возможно с помощью VBA, либо я совершаю ошибку (снова и снова).

Так мне нужно изменить свой код или мне нужно обойти его? Моим альтернативным решением было бы скопировать-вставить каждый из двух диапазонов, поместить их друг под другом, а затем скопировать весь, теперь непрерывный диапазон.

Ответ №1:

Вы можете использовать Areas свойство Range объекта для получения объединенных диапазонов. Код, подобный приведенному ниже, будет перебирать каждый из поддиапазонов, копировать их и вставлять в другое место. Попробуйте адаптироваться к вашим потребностям и напишите ответ, если вам нужна помощь.

 Sub Test()
    Dim rng As Range
    Dim r As Range
    Dim destination As Range


    Set rng = Union(Range("A1:B3"), Range("D1:E2"))
    Set destination = Range("H1")


    For Each r In rng.Areas
        r.Copy destination
        Set destination = destination.Offset(, 3)
    Next r
End Sub
 

Комментарии:

1. Отличный ответ @user3561813! OP, имейте в виду, что копирование ячейки занимает больше времени, чем просто установка значения целевой ячейки в исходное значение (если форматирование для вас не важно). Я не думаю, что в этом очень маленьком масштабе это действительно имело бы значение, но это всегда нужно учитывать.

2. @CharlesPL Это хороший момент. Большие наборы данных могут привести к значительному снижению производительности.

3. Это выглядит довольно хорошо, большое спасибо! Последующий вопрос: у меня есть еще один лист, с которым я бы в принципе сделал то же самое, но я бы скопировал данные в PowerPoint. Мне нужно было бы подумать о том, чтобы поместить их на один лист, но это должно сработать; однако с вашим методом невозможно обойти тот факт, что эти две области представляют собой два разных изображения в PowerPoint, верно? Поэтому их нужно перемещать отдельно.

4. @Alex Я не слишком хорошо знаком с интерфейсом PowerPoint. Один из вариантов, который я могу придумать, — скопировать значения в непрерывный диапазон на временном листе. Оттуда вы можете выбрать весь «объединенный» диапазон как один диапазон для передачи в PowerPoint.

5. @user3561813 Да, это тоже было бы моим решением. Поскольку это не большой набор данных, это не должно быть проблемой. Еще раз спасибо за помощь!