Копирование непересекающихся диапазонов с VBA - PullRequest
0 голосов
/ 26 апреля 2018

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

enter image description here

С очень простым примером кода, например:

Sub KopyTest()
    Dim rng1 As Range, rng2 As Range, rng3 As Range

    Set rng1 = Range("C6:D11,C13:D14,C16:D18")
    Set rng2 = Range("C6:D11,F6:F11")
    Set rng3 = Range("C6:D11,G9")

    rng1.Copy
    rng2.Copy
    rng3.Copy
End Sub

rng1 состоит из трех непересекающихся блоков Желтый + зеленый + синий
rng2 состоит из двух непересекающихся блоков Желтый + розовый
rng3 состоит из двух непересекающихся блоков Желтая + единичная серая клетка

Первые два диапазона копируются просто отлично. rng3 не удается скопировать, и мы получаем сообщение об ошибке множественного выбора.

Мы не понимаем, какие наборы непересекающихся диапазонов можно скопировать напрямую, для каких наборов требуется UNION () , а какие наборы просто потерпят неудачу

Как только мы это поймем, мы можем составить некоторый код для анализа диапазона и определить, является ли он «копируемым» и не полагаться на OnError.

1 Ответ

0 голосов
/ 26 апреля 2018

Я полагаю, что ответ здесь на странице поддержки Microsoft для конкретной ошибки, которую вы получаете (от XL2000). Это настолько безрассудно, насколько вы можете ожидать:

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

Несколько строк в одном столбце, например, A1, A3, A5.

Несколько столбцов в одной строке, например, A2, C2, E2.

Несколько строк и столбцов в одних и тех же столбцах и строках, например, A1, C1, A3, C3, A5, C5.

Этот ваш последний диапазон не вписывается ни в один из трех принятых множественных вариантов выбора.

Допустимые диапазоны множественного выбора выглядят очень похоже на то, что было бы разрешено в формуле массива или формуле sumproduct.

В следующем разделе на этой странице справки используется словосочетание «... должен оставаться непрерывный прямоугольник ...». И я думаю, что это может быть самый лаконичный способ указать, что является приемлемым в множественном выборе копирования / вырезания / вставки. Другими словами, подумайте о том, что произойдет, если вместо .Copy вы .Cut этот диапазон множественного выбора. Имеет ли результат смысл? Можно ли «сдвинуть» оставшийся диапазон, чтобы удалить эти несколько выделенных ячеек? Если нет, то вы также не можете скопировать. По причинам.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...