Вставка диапазона со сдвигом ячеек вправо или вниз методом Insert объекта Range. Вставка и перемещение строк и столбцов из кода VBA Excel. Примеры.
Range.Insert – это метод, который вставляет диапазон пустых ячеек (в том числе одну ячейку) на рабочий лист Excel в указанное место, сдвигая существующие в этом месте ячейки вправо или вниз. Если в буфере обмена содержится объект Range, то вставлен будет он со своими значениями и форматами.
Синтаксис
Expression.Insert(Shift, CopyOrigin) |
Expression – выражение (переменная), возвращающее объект Range.
Параметры
Параметр | Описание | Значения |
---|---|---|
Shift | Необязательный параметр. Определяет направление сдвига ячеек. Если параметр Shift опущен, направление выбирается в зависимости от формы* диапазона. | xlShiftDown (-4121) – ячейки сдвигаются вниз; xlShiftToRight (-4161) – ячейки сдвигаются вправо. |
CopyOrigin | Необязательный параметр. Определяет: из каких ячеек копировать формат. По умолчанию формат копируется из ячеек сверху или слева. | xlFormatFromLeftOrAbove (0) – формат копируется из ячеек сверху или слева; xlFormatFromRightOrBelow (1) – формат копируется из ячеек снизу или справа. |
* Если диапазон горизонтальный или квадратный (количество строк меньше или равно количеству столбцов), ячейки сдвигаются вниз. Если диапазон вертикальный (количество строк больше количества столбцов), ячейки сдвигаются вправо.
Примеры
Простая вставка диапазона
Вставка диапазона ячеек в диапазон «F5:K9» со сдвигом исходных ячеек вправо:
Range(«F5:K9»).Insert Shift:=xlShiftToRight |
Если бы параметр Shift не был указан, сдвиг ячеек, по умолчанию, произошел бы вниз, так как диапазон горизонтальный.
Вставка вырезанного диапазона
Вставка диапазона, вырезанного в буфер обмена методом Range.Cut, из буфера обмена со сдвигом ячеек по умолчанию:
Range(«A1:B6»).Cut Range(«D2»).Insert |
Обратите внимание, что при использовании метода Range.Cut, точка вставки (в примере: Range("D2")
) не может находится внутри вырезанного диапазона, а также в строке или столбце левой верхней ячейки вырезанного диапазона вне вырезанного диапазона (в примере: строка 1 и столбец «A»).
Вставка скопированного диапазона
Вставка диапазона, скопированного в буфер обмена методом Range.Copy, из буфера обмена со сдвигом ячеек по умолчанию:
Range(«B2:D10»).Copy Range(«F2»).Insert |
Обратите внимание, что при использовании метода Range.Copy, точка вставки (в примере: Range("F2")
) не может находится внутри скопированного диапазона, но в строке или столбце левой верхней ячейки скопированного диапазона вне скопированного диапазона находится может.
Вставка и перемещение строк
Вставка одной строки на место пятой строки со сдвигом исходной строки вниз:
Вставка четырех строк на место пятой-восьмой строк со сдвигом исходных строк вниз:
Вставка строк с использованием переменных, указывающих над какой строкой осуществить вставку и количество вставляемых строк:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
Sub Primer1() Dim n As Long, k As Long, s As String ‘Номер строки, над которой необходимо вставить строки n = 8 ‘Количесто вставляемых строк k = 4 ‘Указываем адрес диапазона строк s = n & «:» & (n + k — 1) ‘Вставляем строки Rows(s).Insert End Sub ‘или то же самое с помощью цикла Sub Primer2() Dim n As Long, k As Long, i As Long n = 8 k = 4 For i = 1 To k Rows(n).Insert Next End Sub |
Перемещение второй строки на место шестой строки:
Rows(2).Cut Rows(6).Insert |
Вторая строка окажется на месте пятой строки, так как третья строка заместит вырезанную вторую строку, четвертая встанет на место третьей и т.д.
Перемещение шестой строки на место второй строки:
Rows(6).Cut Rows(2).Insert |
В этом случае шестая строка окажется на месте второй строки.
Вставка и перемещение столбцов
Вставка одного столбца на место четвертого столбца со сдвигом исходного столбца вправо:
Вставка трех столбцов на место четвертого-шестого столбцов со сдвигом исходных столбцов вправо:
Перемещение третьего столбца на место седьмого столбца:
Columns(3).Cut Columns(7).Insert |
Третий столбец окажется на месте шестого столбца, так как четвертый столбец заместит вырезанный третий столбец, пятый встанет на место четвертого и т.д.
Перемещение седьмого столбца на место третьего столбца:
Columns(7).Cut Columns(3).Insert |
В этом случае седьмой столбец окажется на месте третьего столбца.
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
1 |
|
07.05.2014, 15:47. Показов 12380. Ответов 19
Собсетвено есть данные в столбцах А , В , С , D.
0 |
Programming Эксперт 94731 / 64177 / 26122 Регистрация: 12.04.2006 Сообщений: 116,782 |
07.05.2014, 15:47 |
19 |
15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
|
07.05.2014, 15:56 |
2 |
Banzayl2w, запишите макрорекордером действия: выделить ст. С, Ctrl+X, выделить ст. В, Вставить — Вставить вырезанные ячейки.
0 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
07.05.2014, 16:07 [ТС] |
3 |
надо бы довести «до ума» через получившиеся макросы вручную в VB Добавлено через 2 минуты
0 |
OLEGOFF 1062 / 506 / 137 Регистрация: 27.02.2013 Сообщений: 1,451 |
||||
07.05.2014, 16:28 |
4 |
|||
Попробуй так
Через любой свободный столбец
0 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
07.05.2014, 16:35 [ТС] |
5 |
нет все столбцы забиты данными нужно данные столбца D поменять с данными столбца А, просто перенести местами
0 |
OLEGOFF 1062 / 506 / 137 Регистрация: 27.02.2013 Сообщений: 1,451 |
||||
07.05.2014, 17:14 |
6 |
|||
Так что-ли?
0 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||||||
07.05.2014, 17:49 |
7 |
|||||||
как вы говорите делать данные куда вставляешь теряются Неправда! Вот записанный макрос:
Для решения учебного задания этого достаточно. Если убрать лишнее, то так:
1 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
08.05.2014, 11:44 [ТС] |
8 |
Не работает макрос не переносит (
1 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
08.05.2014, 11:49 |
9 |
Не буду спорить — но счёт 2:1 не в Вашу пользу — у меня и Алексея работает По макросу OLEGOFF аналогично 2:1
0 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
08.05.2014, 12:21 [ТС] |
10 |
файл ниже вот нужно поменять столбец A cо столбцом D местами, и код не хочет работать)
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
08.05.2014, 12:53 |
11 |
И где тот код, который не хочет работать?
0 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
08.05.2014, 12:59 [ТС] |
12 |
ниже
0 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
08.05.2014, 13:00 |
13 |
Вообще понятно — уж сколько говорено, что объединение ячеек — эло! Повторю ещё раз.
0 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
08.05.2014, 13:04 [ТС] |
14 |
тоесть никак не решить эту задачу? с переносом данных из одного столбца в другой?
0 |
Hugo121 6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
||||
08.05.2014, 13:04 |
15 |
|||
Только сперва уберите объединение в A!
1 |
Казанский 15136 / 6410 / 1730 Регистрация: 24.09.2011 Сообщений: 9,999 |
||||
08.05.2014, 13:06 |
16 |
|||
Сообщение было отмечено Banzayl2w как решение РешениеС автоматическим снятием объединения ячеек в задействованных столбцах
1 |
6875 / 2807 / 533 Регистрация: 19.10.2012 Сообщений: 8,562 |
|
08.05.2014, 13:07 |
17 |
Сообщение было отмечено Banzayl2w как решение Решение И чего не все варианты пробовали? Вариант через массив работает «из коробки», только диапазоны изменить, и объединения не мешают.
1 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
08.05.2014, 13:14 [ТС] |
18 |
Огромное спасибо!
0 |
1062 / 506 / 137 Регистрация: 27.02.2013 Сообщений: 1,451 |
|
08.05.2014, 13:24 |
19 |
У меня все работает…?
0 |
1 / 1 / 0 Регистрация: 14.04.2014 Сообщений: 40 |
|
08.05.2014, 13:26 [ТС] |
20 |
Да, все работает!
0 |
IT_Exp Эксперт 87844 / 49110 / 22898 Регистрация: 17.06.2006 Сообщений: 92,604 |
08.05.2014, 13:26 |
Помогаю со студенческими работами здесь Макрос VBA Создать макрос , доступный во всей рабочей книге, в Макрос.VBA Макрос VBA Перемещение с переименованием файлов в vba Искать еще темы с ответами Или воспользуйтесь поиском по форуму: 20 |
Перемещение столбцов без копирования |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
||||||||
Ответить |
Basically I’m looking to move a column for one position to another.
561 DISK_GROUP_003 0 545 1
561 Disk_Group_iS 95 84144 80210
561 DISK_GROUP_iS 99 26335 26304
1415 t1_200ea 93 8804 8203
1415 t2_30010k 35 59846 21121
1415 t3_1tb72k 19 184941 36590
1415 t3_3tb72k 86 258635 224328
5018 t1_200ea 98 9905 9802
5018 t2_30015k 89 39987 35986
5018 t2_60015k 67 59984 40700
5018 t3_1tb72k 89 87567 78807
5018 t3_2tb72k 84 94412 79620
I need to move the 3rd column to the end at the right.
This is what I have tried so far:
Sub moveColumn()
With ActiveSheet
Excel.Columns(3).Cut
Excel.Columns(6).PasteSpecial
End With
End Sub
But this method doesn’t work as it gets a runtime error ‘1004’.
Any help would be much appreciated.
pnuts
58k11 gold badges85 silver badges137 bronze badges
asked Oct 30, 2013 at 16:43
2
For those wondering, it’s possible to do this without replacing the contents of the destination column.
For example, to cut column B and insert it to the left of column F, you can use
Columns("B").Cut
Columns("F").Insert Shift:=xlToRight
You can also replace the named column headers with column indices, to taste (so Columns("B")
becomes Columns(2)
)
answered May 6, 2014 at 11:39
FarmerGeddenFarmerGedden
1,16010 silver badges23 bronze badges
1
Pastespecial doesn’t work with Cut. You can do this:
Columns(3).Cut Range("F1")
Columns(3).Delete Shift:=xlToLeft 'if you want to delete the empty column
answered Oct 30, 2013 at 16:50
Tim WilliamsTim Williams
150k8 gold badges96 silver badges124 bronze badges
0
The problem with the other answers given is that the cut/paste technique uses the clipboard—overwriting whatever is in it, and making it impossible for the program to operate correctly if another program that also uses the clipboard is running (such as another instance of the same VBA project).
Instead, do this:
Application.CutCopyMode = False ' don't want an existing operation to interfere
Columns("F").Insert XlDirection.xlToRight
Columns("F").Value = Columns("B").Value ' this would be one greater if to the right of F
Columns("B").Delete
Just note that if there are references to the existing column, they will break and not be updated.
answered Nov 11, 2015 at 18:19
ErikEErikE
48.4k23 gold badges150 silver badges194 bronze badges
irina_iv Пользователь Сообщений: 21 |
#1 29.12.2018 10:02:44 Уважаемые программисты, можно ли к Вам обратиться помочь доработать код?
На листе2 показано, как это должно выглядеть. Прикрепленные файлы
Изменено: irina_iv — 29.12.2018 10:05:27 |
||
Kuzmich Пользователь Сообщений: 7998 |
У меня ваш архив не открылся. |
irina_iv Пользователь Сообщений: 21 |
Вот так примерно… Изменено: irina_iv — 29.12.2018 14:46:45 |
Kuzmich Пользователь Сообщений: 7998 |
#4 29.12.2018 15:01:52
При активации какого листа срабатывает макрос?
В книге нет Листа1 |
||||
RAN Пользователь Сообщений: 7091 |
Удалить из каждой таблицы по 1500 строк — такая проблема? Тогда, глядишь, и для макросов место найдется. |
Dima S Пользователь Сообщений: 2063 |
у кого то из форумчан была очень актуальная для вашего файла подпись: «если автоматизировать бардак, то получится автоматизированный бардак». |
irina_iv Пользователь Сообщений: 21 |
Ну, Вы, конечно, шутники…Я и вправду удалила (случайно) лист1, хотя он там нужен. Но «бардаком» я бы не стала это называть: во-первых, я новичок, во-вторых, это таблицы, а разве можно таблицы назвать бардаком?.. Прикрепленные файлы
|
Anchoret Пользователь Сообщений: 1061 Anchoret |
irina_iv, Не равнодушным людям трудно понять в Вашем файле чего Вы собственно хотите. |
Nordheim Пользователь Сообщений: 3154 |
А можете сделать файл на одном листе таблица 10х10 (рога, копыта), на другом , то как она должна выглядеть после копирования. В Вашем макросе нет желания разбирать ошибки. «Все гениальное просто, а все простое гениально!!!» |
irina_iv Пользователь Сообщений: 21 |
Конечно. Два столбца «ФИО агента» и «Адрес» переносятся с листа «details» на «Лист1» и находятся рядом, остальные столбцы «аванс», «зп1-зп10» — переносятся на лист «Лист1» через один столбец (чтобы между можно было вписывать даты). То есть все должно выглядеть как на листе ‘pre’. Было бы замечательно, если можно было бы сделать форматирование как на листе «pre» на листе1. (цвета, толщина, центрирование и т.д.). Конечно, не мучайтесь . Я на этот код потратила недели 2, и он еще не работает… Изменено: irina_iv — 09.01.2019 15:04:42 |
Nordheim Пользователь Сообщений: 3154 |
Немного не понятно, зачем копировать столбцы, копируйте весь лист, затем вставьте столбцы где вам нужно, а лишнее удалите. Если таблица имеет одинаковую структуру всегда, то можно макрорекодером записать макрос, а после лишнее удалить. Изменено: Nordheim — 09.01.2019 15:11:19 «Все гениальное просто, а все простое гениально!!!» |
irina_iv Пользователь Сообщений: 21 |
Ну, можно, конечно, и так сделать. А как у меня будут тогда добавляться новые значения? Каждый раз заново копировать лист? |
Nordheim Пользователь Сообщений: 3154 |
#13 09.01.2019 15:34:01
А как они у Вас сейчас добавляются, или будут добавляться после копирования?
Т.е. макросы писать можете, а макрорекодером пользоваться не умеете? Как это так? «Все гениальное просто, а все простое гениально!!!» |
||||
Nordheim Пользователь Сообщений: 3154 |
Наверно копирование листа вам не подойдет, если у Вас уже будут заполнены доп столбцы «Все гениальное просто, а все простое гениально!!!» |
irina_iv Пользователь Сообщений: 21 |
Да, здесь бы лучше циклом или еще как-то, как быстро и точно… |
Nordheim Пользователь Сообщений: 3154 |
#16 09.01.2019 15:46:03
Нет. Но на вскидку, это к чему относится?
«Все гениальное просто, а все простое гениально!!!» |
||||
Anchoret Пользователь Сообщений: 1061 Anchoret |
#17 09.01.2019 16:19:59 irina_iv, пробуйте (не тестировал, т.к. не хватило времени — на работе). Предполагается, что лист с индесом 1 — лист с исходными данными, с индексом 3 — место выгрузки:
Изменено: Anchoret — 10.01.2019 10:33:35 |
||
Nordheim Пользователь Сообщений: 3154 |
#18 09.01.2019 16:23:34 Вариант для файла из сообщения №3
«Все гениальное просто, а все простое гениально!!!» |
||
irina_iv Пользователь Сообщений: 21 |
Anchoret, Nordheim, |
Nordheim Пользователь Сообщений: 3154 |
#20 10.01.2019 10:32:04
Совершенно верно. «Все гениальное просто, а все простое гениально!!!» |
||
Anchoret Пользователь Сообщений: 1061 Anchoret |
irina_iv, да, там была ошибка и не одна. Изменил код выше. Лист выгрузки теперь имеет индекс 4. Соответственно все индексы листов можно переименовать названиями реальных листов. П.С.: Есть один нюанс — если даты планировалось вводить вручную и вне зависимости от времени запуска этого макроса, то грусть-печаль. Макрос затирает при выгрузке все данные под выгружаемой таблицей. |
irina_iv Пользователь Сообщений: 21 |
Да, Anchoret. данные планировалось по датам вводить вручную. То есть просто скопировать с интервалом столбцы (кроме первых двух)… |
Anchoret Пользователь Сообщений: 1061 Anchoret |
#23 10.01.2019 11:37:36 irina_iv, по сути код идентичный коду от Nordheim, только не очень читабельный :
Изменено: Anchoret — 10.01.2019 12:08:28 |
||
Nordheim Пользователь Сообщений: 3154 |
#24 10.01.2019 12:18:05
Возможно так будет более «читабелно»
«Все гениальное просто, а все простое гениально!!!» |
|||
Anchoret Пользователь Сообщений: 1061 Anchoret |
Nordheim, точно) |
Nordheim Пользователь Сообщений: 3154 |
Есть подозрение что irina_iv, на примере макросов по этой задаче, продолжит изучение VBA, что то почерпнет, увидит ошибки допущенные в собственном коде, и попытается в дальнейшем, продолжить автоматизацию работы в Excel. «Все гениальное просто, а все простое гениально!!!» |
irina_iv Пользователь Сообщений: 21 |
Можно Вас, Anchoret, Nordheim еще немного помучать? |
irina_iv Пользователь Сообщений: 21 |
|
Nordheim Пользователь Сообщений: 3154 |
Честно говоря, какая то ерунда получается, наверно следует таблицы , как то более грамотно составить, или я чего то не понимаю. «Все гениальное просто, а все простое гениально!!!» |
Anchoret Пользователь Сообщений: 1061 Anchoret |
#30 10.01.2019 14:11:23 irina_iv, рыба закончилась, настала пора удочки: |