Перемещение по столбцам в excel vba

Вставка диапазона со сдвигом ячеек вправо или вниз методом 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.
Нужно сделать так что бы столбец С поменялся местами со столбцом В вместе со всеми данными? с помошью макроса VBA
Буду благодарен любым вашим мыслям!



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

Попробуй так

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Sub замена()
 
    Columns("C:C").Select
    Selection.Cut
    Columns("T:T").Select
    ActiveSheet.Paste
    Columns("B:B").Select
    Selection.Cut
    Columns("C:C").Select
    ActiveSheet.Paste
    Columns("T:T").Select
    Selection.Cut
    Columns("B:B").Select
    ActiveSheet.Paste
End Sub

Через любой свободный столбец



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

Так что-ли?

Visual Basic
1
2
3
4
5
6
7
8
Sub UpToDown()
Dim A, B
    A = [C:C]
    B = [B:B]
    
   [C:C] = B
   [B:B] = A
End Sub



0



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

07.05.2014, 17:49

7

Цитата
Сообщение от Banzayl2w
Посмотреть сообщение

как вы говорите делать данные куда вставляешь теряются

Неправда! Вот записанный макрос:

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
Sub Макрос2()
'
' Макрос2 Макрос
'
 
'
    Columns("C:C").Select
    Selection.Cut
    Columns("B:B").Select
    Selection.Insert Shift:=xlToRight
End Sub

Для решения учебного задания этого достаточно. Если убрать лишнее, то так:

Visual Basic
1
2
3
4
Sub Макрос2()
    Columns("C").Cut
    Columns("B").Insert
End Sub



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

Visual Basic
1
2
3
4
5
6
Sub Макрос333()
    Columns(1).Cut
    Columns(4).Insert
    Columns(4).Cut
    Columns(1).Insert
End Sub

Только сперва уберите объединение в A!



1



Казанский

15136 / 6410 / 1730

Регистрация: 24.09.2011

Сообщений: 9,999

08.05.2014, 13:06

16

Лучший ответ Сообщение было отмечено Banzayl2w как решение

Решение

С автоматическим снятием объединения ячеек в задействованных столбцах

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub Макрос1()
Dim c As Range
For Each c In Intersect(Range("A:A,D:D"), ActiveSheet.UsedRange)
  If c.MergeCells Then
    If c.MergeArea.Columns.Count > 1 Then c.UnMerge
  End If
Next
  
Columns("D").Cut
Columns("A").Insert
Columns("B").Cut
Columns("E").Insert
End Sub



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
Создать Mакрос в Word, так чтобы он находил в тексте буквосочетание и выделял его цветом, а потом…

Макрос VBA
Помогите написать макрос или подскажите как должен выглядеть. есть база данных макрос ищет по…

Перемещение с переименованием файлов в vba
Здравствуйте. Есть задача, найти в целевой папке список имен фото, находящийся в столбце 1 Excel, и…

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:

20

Перемещение столбцов без копирования

Roman777

Дата: Четверг, 17.09.2015, 15:48 |
Сообщение № 1

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

Добрый день!
Подскажите, пожалуйста, возможно ли переместить столбцы без использования промежуточного копирования данных?
Поясню: необходимо, чтоб столбцы 2й и 4й поменялись местами (данные из столбца(2) стали во четвёртый столбец, а данные из столбца(4) во второй).


Много чего не знаю!!!!

 

Ответить

Pelena

Дата: Четверг, 17.09.2015, 16:28 |
Сообщение № 2

Группа: Админы

Ранг: Местный житель

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

Здравствуйте.
Макрорекодер подсказывает так
[vba]

Код

Sub Макрос1()

‘ Макрос1 Макрос


     Columns(«B:B»).Cut
     Columns(«D:D»).Insert Shift:=xlToRight
     Columns(«D:D»).Cut
     Columns(«B:B»).Insert Shift:=xlToRight
End Sub

[/vba]


«Черт возьми, Холмс! Но как??!!»
Ю-money 41001765434816

 

Ответить

Roman777

Дата: Четверг, 17.09.2015, 16:37 |
Сообщение № 3

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

Pelena, да, это я уже видел, но мне казалось, что тут происходит промежуточное копирование, а потом удаление столбца… по крайней мере, операция будет крайне долгой для большого кол-ва строк.
Я думал, мб бывает метод типа offset или аналог того, как листы легко можно перемещать внутри книги…


Много чего не знаю!!!!

 

Ответить

Rioran

Дата: Четверг, 17.09.2015, 17:36 |
Сообщение № 4

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

Замечаний:
0% ±


Excel 2013

Roman777, здравствуйте.

Я бы сделал так, пример во вложении:

[vba]

Код

Sub RioSwap()
     Dim ArrA, ArrB, RowX&
     RowX = ActiveSheet.UsedRange.Rows.Count
     ArrA = Range(«B1:B» & RowX)
     ArrB = Range(«D1:D» & RowX)
     Range(«B1:B» & RowX) = ArrB
     Range(«D1:D» & RowX) = ArrA
End Sub

[/vba]

К сообщению приложен файл:

RioSwap.xlsb
(14.4 Kb)


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279

 

Ответить

Roman777

Дата: Четверг, 17.09.2015, 17:55 |
Сообщение № 5

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

Rioran, Я правильно понял, что тут мы просто записываем в память данные а потом из памяти кидаем в соответствующий столбик?
странно что ActiveSheet.UsedRange.Rows.Count выдаёт мне значение 10, когда у меня только 9 строк заполнены…
Спасибо большое, оч даже хороший Вариант, а я циклами делал…


Много чего не знаю!!!!

 

Ответить

Roman777

Дата: Четверг, 17.09.2015, 17:59 |
Сообщение № 6

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

Rioran, Подскажите вот ещё что, в Вашем коде, ArrA и ArrB объявлены как Variant, такой метод работает только при таком типе для данных переменных?


Много чего не знаю!!!!

 

Ответить

Rioran

Дата: Четверг, 17.09.2015, 18:15 |
Сообщение № 7

Группа: Авторы

Ранг: Ветеран

Сообщений: 903


Репутация:

290

±

Замечаний:
0% ±


Excel 2013

мы просто записываем в память данные а потом из памяти кидаем в соответствующий столбик

Совершенно верно.

ActiveSheet.UsedRange.Rows.Count выдаёт мне значение 10

Значит, Вы как-то раз задействовали 10-ю строку, это нормально. Даже если Вы с 10-й строки потом значение стёрли.

ArrA и ArrB объявлены как Variant

Мой метод работает как минимум при этом типе переменной. В момент присвоения значения эти переменные превращаются в двумерные массивы. Конечно, переменные можно объявлять как массивы, но это не всегда удобно.


Роман, Москва, voronov_rv@mail.ru
Яндекс-Деньги: 41001312674279

Сообщение отредактировал RioranЧетверг, 17.09.2015, 18:16

 

Ответить

Roman777

Дата: Четверг, 17.09.2015, 21:14 |
Сообщение № 8

Группа: Проверенные

Ранг: Ветеран

Сообщений: 980


Репутация:

127

±

Замечаний:
0% ±


Excel 2007, Excel 2013

Rioran, ещё раз благодарю за столь подробные разъяснения)))


Много чего не знаю!!!!

 

Ответить

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's user avatar

pnuts

58k11 gold badges85 silver badges137 bronze badges

asked Oct 30, 2013 at 16:43

DarylF's user avatar

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

FarmerGedden's user avatar

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 Williams's user avatar

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

ErikE's user avatar

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 также имеет параметр «Вставить транспонирование», который также обновляет формулы транспонированных ячеек.

Понравилась статья? Поделить с друзьями:
  • Перемещение в excel по таблице стрелками не работает
  • Перемещение по списку excel
  • Перемещение в excel клавишами курсора
  • Перемещение по рабочей таблице excel
  • Перемещение в excel 2010