Вставка диапазона со сдвигом ячеек вправо или вниз методом 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
Синтаксис
- Set — оператор, используемый для установки ссылки на объект, например, на диапазон
- Для каждого — оператор, используемый для прокрутки каждого элемента в коллекции
замечания
Обратите внимание, что имена переменных r
, cell
и другие могут быть названы, как вам нравится, но должны быть названы соответствующим образом, чтобы код был более понятным для вас и других.
Создание диапазона
Диапазон нельзя создать или заполнить так же, как строка:
Sub RangeTest()
Dim s As String
Dim r As Range 'Specific Type of Object, with members like Address, WrapText, AutoFill, etc.
' This is how we fill a String:
s = "Hello World!"
' But we cannot do this for a Range:
r = Range("A1") '//Run. Err.: 91 Object variable or With block variable not set//
' We have to use the Object approach, using keyword Set:
Set r = Range("A1")
End Sub
Считается лучшей практикой, чтобы квалифицировать ваши ссылки , поэтому в дальнейшем мы будем использовать один и тот же подход.
Подробнее о создании объектных переменных (например, Range) в MSDN . Подробнее о Set Statement на MSDN .
Существуют разные способы создания одного и того же диапазона:
Sub SetRangeVariable()
Dim ws As Worksheet
Dim r As Range
Set ws = ThisWorkbook.Worksheets(1) ' The first Worksheet in Workbook with this code in it
' These are all equivalent:
Set r = ws.Range("A2")
Set r = ws.Range("A" & 2)
Set r = ws.Cells(2, 1) ' The cell in row number 2, column number 1
Set r = ws.[A2] 'Shorthand notation of Range.
Set r = Range("NamedRangeInA2") 'If the cell A2 is named NamedRangeInA2. Note, that this is Sheet independent.
Set r = ws.Range("A1").Offset(1, 0) ' The cell that is 1 row and 0 columns away from A1
Set r = ws.Range("A1").Cells(2,1) ' Similar to Offset. You can "go outside" the original Range.
Set r = ws.Range("A1:A5").Cells(2) 'Second cell in bigger Range.
Set r = ws.Range("A1:A5").Item(2) 'Second cell in bigger Range.
Set r = ws.Range("A1:A5")(2) 'Second cell in bigger Range.
End Sub
Обратите внимание на пример, что ячейки (2, 1) эквивалентны диапазону («A2»). Это происходит потому, что Cells возвращает объект Range.
Некоторые источники: Chip Pearson-Cells Within Ranges ; Объект диапазона MSDN ; John Walkenback — ссылка на диапазоны в коде VBA .
Также обратите внимание, что в любом случае, когда число используется в объявлении диапазона, а сам номер находится вне кавычек, например Range («A» & 2), вы можете поменять это число на переменную, содержащую целое число / долго. Например:
Sub RangeIteration()
Dim wb As Workbook, ws As Worksheet
Dim r As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
For i = 1 To 10
Set r = ws.Range("A" & i)
' When i = 1, the result will be Range("A1")
' When i = 2, the result will be Range("A2")
' etc.
' Proof:
Debug.Print r.Address
Next i
End Sub
Если вы используете двойные циклы, ячейки лучше:
Sub RangeIteration2()
Dim wb As Workbook, ws As Worksheet
Dim r As Range
Set wb = ThisWorkbook
Set ws = wb.Worksheets(1)
For i = 1 To 10
For j = 1 To 10
Set r = ws.Cells(i, j)
' When i = 1 and j = 1, the result will be Range("A1")
' When i = 2 and j = 1, the result will be Range("A2")
' When i = 1 and j = 2, the result will be Range("B1")
' etc.
' Proof:
Debug.Print r.Address
Next j
Next i
End Sub
Способы обращения к одной ячейке
Самый простой способ ссылаться на одну ячейку на текущем листе Excel — это просто вставить форму А1 в ссылку в квадратных скобках:
[a3] = "Hello!"
Обратите внимание, что квадратные скобки — это просто удобный синтаксический сахар для метода Evaluate
объекта Application
, так что технически это идентично следующему коду:
Application.Evaluate("a3") = "Hello!"
Вы также можете вызвать метод Cells
который принимает строку и столбец и возвращает ссылку на ячейку.
Cells(3, 1).Formula = "=A1+A2"
Помните, что всякий раз, когда вы передаете строку и столбец в Excel из VBA, строка всегда первая, за ней следует столбец, что запутывает, потому что это противоположно общей нотации A1
где сначала отображается столбец.
В обоих этих примерах мы не указали рабочий лист, поэтому Excel будет использовать активный лист (лист, который находится впереди в пользовательском интерфейсе). Вы можете указать активный лист явно:
ActiveSheet.Cells(3, 1).Formula = "=SUM(A1:A2)"
Или вы можете указать имя определенного листа:
Sheets("Sheet2").Cells(3, 1).Formula = "=SUM(A1:A2)"
Существует множество методов, которые можно использовать для перехода от одного диапазона к другому. Например, метод Rows
может использоваться для доступа к отдельным строкам любого диапазона, и метод Cells
может использоваться для доступа к отдельным ячейкам строки или столбца, поэтому следующий код относится к ячейке C1:
ActiveSheet.Rows(1).Cells(3).Formula = "hi!"
Сохранение ссылки на ячейку переменной
Чтобы сохранить ссылку на ячейку в переменной, вы должны использовать синтаксис Set
, например:
Dim R as Range
Set R = ActiveSheet.Cells(3, 1)
потом…
R.Font.Color = RGB(255, 0, 0)
Почему требуется ключевое слово Set
? Set
указывает Visual Basic, что значение в правой части =
означает объект.
Смещение недвижимости
- Смещение (строки, столбцы) — оператор, используемый для статической ссылки на другую точку из текущей ячейки. Часто используется в циклах. Следует понимать, что положительные числа в разделе строк перемещаются вправо, поскольку негативы перемещаются влево. С положительными позициями столбцов вниз и негативы двигаются вверх.
т.е.
Private Sub this()
ThisWorkbook.Sheets("Sheet1").Range("A1").Offset(1, 1).Select
ThisWorkbook.Sheets("Sheet1").Range("A1").Offset(1, 1).Value = "New Value"
ActiveCell.Offset(-1, -1).Value = ActiveCell.Value
ActiveCell.Value = vbNullString
End Sub
Этот код выбирает B2, помещает туда новую строку, затем перемещает эту строку обратно в A1 после очистки B2.
Как перемещать диапазоны (по горизонтали по вертикали и наоборот)
Sub TransposeRangeValues()
Dim TmpArray() As Variant, FromRange as Range, ToRange as Range
set FromRange = Sheets("Sheet1").Range("a1:a12") 'Worksheets(1).Range("a1:p1")
set ToRange = ThisWorkbook.Sheets("Sheet1").Range("a1") 'ThisWorkbook.Sheets("Sheet1").Range("a1")
TmpArray = Application.Transpose(FromRange.Value)
FromRange.Clear
ToRange.Resize(FromRange.Columns.Count,FromRange.Rows.Count).Value2 = TmpArray
End Sub
Примечание. Copy / PasteSpecial также имеет параметр «Вставить транспонирование», который также обновляет формулы транспонированных ячеек.