Vba excel скопировать столбец в другой столбец

I’m trying to write a macro that copies the content of column 1 from sheet 1 to column 2 on sheet 2. This is how the module looks like but, when I run it, I get

Run time error 9, Subscript out of range.

Sub OneCell()
    Sheets("Sheet1").Select
    'select column 1 A1'
    Range("A1:A3").Select

    Selection.Copy
    Range("B1:B3").Select

    ActiveSheet.Paste

    Sheets("Sheet2").Select
    Application.CutCopyMode = False
End Sub

ZygD's user avatar

ZygD

21k39 gold badges77 silver badges98 bronze badges

asked Jan 2, 2010 at 4:38

excel34's user avatar

The following works fine for me in Excel 2007.
It is simple, and performs a full copy (retains all formatting, etc.):

Sheets("Sheet1").Columns(1).Copy Destination:=Sheets("Sheet2").Columns(2)

«Columns» returns a Range object, and so this is utilizing the «Range.Copy» method. «Destination» is an option to this method — if not provided the default is to copy to the paste buffer. But when provided, it is an easy way to copy.

As when manually copying items in Excel, the size and geometry of the destination must support the range being copied.

answered Dec 18, 2012 at 1:19

David's user avatar

DavidDavid

5455 silver badges13 bronze badges

Selecting is often unnecessary. Try this

Sub OneCell()
    Sheets("Sheet2").range("B1:B3").value = Sheets("Sheet1").range("A1:A3").value
End Sub

answered Jan 2, 2010 at 21:12

guitarthrower's user avatar

guitarthrowerguitarthrower

5,6043 gold badges28 silver badges37 bronze badges

4

If you have merged cells,

Sub OneCell()
    Sheets("Sheet2").range("B1:B3").value = Sheets("Sheet1").range("A1:A3").value
End Sub

that doesn’t copy cells as they are, where previous code does copy exactly as they look like (merged).

Basic's user avatar

Basic

26.1k24 gold badges112 silver badges197 bronze badges

answered Feb 9, 2012 at 14:38

Lucy's user avatar

LucyLucy

212 bronze badges

I’m not sure why you’d be getting subscript out of range unless your sheets weren’t actually called Sheet1 or Sheet2. When I rename my Sheet2 to Sheet_2, I get that same problem.

In addition, some of your code seems the wrong way about (you paste before selecting the second sheet). This code works fine for me.

Sub OneCell()
    Sheets("Sheet1").Select
    Range("A1:A3").Copy
    Sheets("Sheet2").Select
    Range("b1:b3").Select
    ActiveSheet.Paste
End Sub

If you don’t want to know about what the sheets are called, you can use integer indexes as follows:

Sub OneCell()
    Sheets(1).Select
    Range("A1:A3").Copy
    Sheets(2).Select
    Range("b1:b3").Select
    ActiveSheet.Paste
End Sub

answered Jan 2, 2010 at 4:46

paxdiablo's user avatar

paxdiablopaxdiablo

844k233 gold badges1565 silver badges1937 bronze badges

Private Sub Worksheet_Change(ByVal Target As Range)
  Dim rng As Range, r As Range
  Set rng = Intersect(Target, Range("a2:a" & Rows.Count))
  If rng Is Nothing Then Exit Sub
    For Each r In rng
      If Not IsEmpty(r.Value) Then
        r.Copy Destination:=Sheets("sheet2").Range("a2")
      End If
    Next
  Set rng = Nothing
End Sub

Juan Mellado's user avatar

Juan Mellado

15k5 gold badges47 silver badges54 bronze badges

answered Mar 17, 2012 at 16:58

Ravi's user avatar

1

In this Article

  • Rows & Columns – Paste vs. Insert
    • Copy & Paste Over Existing Row / Column
    • Copy & Insert Row / Column
  • Copy Entire Row
    • Cut and Paste Rows
    • Copy Multiple Rows
  • Copy Entire Column
    • Cut and Paste Columns
    • Copy Multiple Columns
  • Copy Rows or Columns to Another Sheet
    • Cut Rows or Columns to Another Sheet

This tutorial will teach you how to copy (or cut) entire Rows or Columns using VBA. We cover copying and pasting ranges of cells in another article.

First we will show you how to paste or insert copied rows/columns and discuss the differences.  Then we will show you all of the different ways to references rows and columns when copying or cutting.

Rows & Columns – Paste vs. Insert

When pasting rows and columns you have two options:  You can paste over the existing row (or column) or you can insert a new row (or column).

Let’s look at the difference…

vba copy and paste row

Copy & Paste Over Existing Row / Column

This will copy row 1 and paste it into the existing row 5:

Range("1:1").Copy Range("5:5")

This will copy column C and paste it into column E:

Range("C:C").Copy Range("E:E")

Copy & Insert Row / Column

Instead you can insert the copied row or column and shift the existing rows or columns to make room.

This will copy row 1 and insert it into row 5, shifting the existing rows down:

Range("1:1").Copy
Range("5:5").Insert

This will copy column C and insert it into column E, shifting the existing columns to the right:

Range("C:C").Copy
Range("E:E").Insert

Copy Entire Row

Below we will show you several ways to copy row 1 and paste into row 5.

Range("1:1").Copy Range("5:5")
Range("A1").EntireRow.Copy Range("A5")
Rows(1).Copy Rows(5)

Cut and Paste Rows

Simply use Cut instead of Copy to cut and paste rows:

Rows(1).Cut Rows(5)

Copy Multiple Rows

Here are examples of copying multiple rows at once:

Range("5:7").Copy Range("10:13")
Range("A5:A7").EntireRow.Copy Range("A10:A13")
Rows("5:7").Copy Rows("10:13")

VBA Coding Made Easy

Stop searching for VBA code online. Learn more about AutoMacro — A VBA Code Builder that allows beginners to code procedures from scratch with minimal coding knowledge and with many time-saving features for all users!

automacro

Learn More

Copy Entire Column

You can copy entire columns similarily to copying entire rows:

Range("C:C").Copy Range("E:E")
Range("C1").EntireColumn.Copy Range("C1").EntireColumn
Columns(3).Copy Range(5)

Cut and Paste Columns

Simply use Cut instead of Copy to cut and paste columns:

Range("C:C").Cut Range("E:E")

Copy Multiple Columns

Here are examples of copying multiple columns at once:

Range("C:E").Copy Range("G:I")
Range("C1:E1").EntireColumn.Copy Range("G1:I1")
Columns("3:5").Copy Columns("7:9")

VBA Programming | Code Generator does work for you!

Copy Rows or Columns to Another Sheet

To copy to another sheet, simply use the Sheet Object:

Sheets("sheet1").Range("C:E").Copy Sheets("sheet2").Range("G:I")

Cut Rows or Columns to Another Sheet

You can use the exact same technique to cut and paste rows or columns to another sheet.

Sheets("sheet1").Range("C:E").Cut Sheets("sheet2").Range("G:I")
 

Дмитрий Астахов

Пользователь

Сообщений: 11
Регистрация: 07.12.2022

#1

13.03.2023 21:04:50

Доброго времени суток.
Пытаюсь разобраться с Vba Excel, и встала интересная задача
Искал в интернете код, нашёл похожую тему на англоязычном сайте, там человек с подобной задачей обратился, ему написали вот это и сказали что всё работает Good

Код
Sub CopySpecifcColumn()

Set MR = Range("A1:e1")

For Each cell In MR

If cell.Value = "Date" Then 
    cell.EntireColumn.Copy
End If

If cell.Value = "Name" Then    '<- Add these for each column title
    cell.EntireColumn.Copy
End If 

If cell.Value = "ID" Then 
    cell.EntireColumn.Copy
End If

If cell.Value = "Amount" Then 
    cell.EntireColumn.Copy
End If

Next cell

End Sub

Цель: Найти на Листе1 столбец, у которого в заголовке будет название «Date», например, и скопировать его в Лист2 в столбец, где будет такой же заголовок «Date» (заголовки могут гулять по столбцам, поэтому нужен их поиск).
Суть: Я этот макрос вставил, а он вообще ничего не делает, даже не выделяет столбец, не то что уж куда-то его вставляет (в коде ни слова про вставку значения)
У меня есть макрос, который ищет столбцы с определёнными заголовками, и удаляет всё кроме них, но как я не пытался их скрестить — получается туфта.

Код
Sub Удаляем_ненужные_столбцы()
    Dim i&
    List = "|Column1|Column2|Column3|"
    For i = Cells(1, Columns.Count).End(xlToLeft).Column To 1 Step -1
            If InStr(List, "|" & Cells(1, i) & "|") = 0 Then Columns(i).Delete
    Next
End Sub

Подскажите как выйти (и можно ли) из данной ситуации, буду благодарен за подсказки.

 

Пытливый

Пользователь

Сообщений: 4587
Регистрация: 22.12.2012

#2

13.03.2023 21:19:00

Доброго. Найти что-либо в диапазоне (например, строку «Date» можно, например, методом Range.Find. Например, если у нас заголовки на активном столбце содержатся в диапазоне А1:D1, то найти значение Date можно как-то так:

Код
    Dim my_range As Range
    Set my_range = Range("A1", "D1").Find(What:="Date", LookIn:=xlValues, MatchCase:=False)

Далее, отталкиваясь от найденного значения, можно выделять столбцы (зачем целые столбцы? Можно же определенный диапазон, ячейки таблицы из этого столбца, зачем миллион с лишним ячеек выделять?), копировать, вставлять на новый лист и т.д. Т.е. примерно так — на одном листе нашли откуда копировать, на другом листе куда. Ну и скопировали. :)

Кому решение нужно — тот пример и рисует.

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

#3

15.03.2023 01:12:08

Дмитрий Астахов, Здравствуйте. Может так вам надо?

Код
Sub CopySpecifcColumn()
    Dim Pos         As Long
    Dim vHeader     As Variant
    Dim rngFound1 As Range, rngFound2 As Range
    Dim ArryHeader1() As String, ArryHeader2() As String
    Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = ActiveWorkbook.Sheets(1)
    Set ws2 = ActiveWorkbook.Sheets(2)

    ArryHeader1 = Split("Date", ",")   ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист исходник)
    ArryHeader2 = Split("Date", ",")   ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист назначения)

    Application.ScreenUpdating = False

    For Each vHeader In ArryHeader1
        Set rngFound1 = ws1.Cells.Find(vHeader, , xlValues, xlWhole, 1, 1, 0)

        If Not rngFound1 Is Nothing Then
            Pos = Application.Match(vHeader, ArryHeader1, False) - 1
            Set rngFound2 = ws2.Cells.Find(ArryHeader2(Pos), , xlValues, xlWhole, 1, 1, 0)

            '            ' Вставка без форматов ячеек
            '            Range(rngFound1.Offset(1), rngFound1.End(xlDown)).Copy
            '            rngFound2.Offset(1).PasteSpecial xlPasteValues

            ' Копирования столбца и вставка с форматом ячеек
            Range(rngFound1.Offset(1), rngFound1.End(xlDown)).Copy Destination:=rngFound2.Offset(1)
        End If

    Next

    ws2.Select.  ' Можете закоментировать строку если не нужна активация второго листа (лист назначения)
    Application.ScreenUpdating = True
 End Sub

Изменено: MikeVol15.03.2023 01:22:00
(Мерцание экрана забыл включить ;) )

 
MikeVol

, Доброго времени суток. Макрос супер, правда не хотел через перечисление искать столбцы, искал только первый в списке, в данном примере «Date». Пытался заменить Split на что-то другое — эксель ругается, мол «не лезь дурак, оставь как есть». Поэтому я просто скопировал кусок начиная с «ArryHeader1…» вплоть до «Next», и уже там вписал другой столбец, и всё отлично заработало. Единственно момент, можно ли как-то найденные столбцы копировать полностью кроме первой строки? (имею в виду что он со второй строки (что кстати супер) копирует до последнего найденного символа, а если в столбце будет пробел, то всё после него он не увидит). Просто таблица, ИЗ которой я хочу копировать столбцы, ведётся не мной, а мало ли что там человек может напутать, намешать. И чтобы была защита от дурака, я хочу копировать либо весь столбец, либо для меньше загруженности Range задать. Но сам я как дурак с этим Range.EntireColumn попытался втиснуться, но пока безуспешно. Буду пробовать дальше, вдруг нащупаю «правильное направление мысли»

Изменено: Дмитрий Астахов15.03.2023 09:59:50
(Скорее всего изъяснился в тексте я так себе, поэтому прикреплю файл )))

 

Ігор Гончаренко

Пользователь

Сообщений: 13746
Регистрация: 01.01.1970

#5

15.03.2023 10:50:08

пробуйте этот

Код
Sub CopySameColumns()
  Dim dc, c, i&, rg As Range, ws As Worksheet
  Set dc = CreateObject("Scripting.Dictionary")
  For Each c In Array("Date", "Name", "ID", "Amound")
    dc(c) = 0
  Next
  Set ws = Worksheets(1)
  For i = 1 To ws.Cells(1, Columns.Count).End(xlToLeft).Column
    If dc.Exists(ws.Cells(1, i).Value) Then
      dc(ws.Cells(1, i).Value) = i
      Set rg = ws.Cells(Rows.Count, i).End(xlUp)
      If rg.Row > 1 Then Range(ws.Cells(2, i), rg).ClearContents
    End If
  Next
  For Each c In dc.keys
    If dc(c) = 0 Then dc.Remove c
  Next
  With Worksheets(2)
    For i = 1 To .Cells(1, Columns.Count).End(xlToLeft).Column
      If dc.Exists(.Cells(1, i).Value) Then
        Set rg = .Cells(Rows.Count, i).End(xlUp)
        If rg.Row > 1 Then
          Range(.Cells(2, i), .Cells(Rows.Count, i).End(xlUp)).Copy _
          ws.Cells(2, dc(.Cells(1, i).Value))
        End If
      End If
    Next
  End With
End Sub

Изменено: Ігор Гончаренко15.03.2023 10:50:40

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

#6

15.03.2023 11:48:15

Дмитрий Астахов, Здравствуйте! А так точно то что вам нужно?

Код
Option Explicit

Sub CopySpecifcColumn_v2()
    Dim Pos         As Long
    Dim vHeader     As Variant
    Dim rngFound1 As Range, rngFound2 As Range
    Dim ArryHeader1() As String, ArryHeader2() As String
    Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = ActiveWorkbook.Sheets(1)
    Set ws2 = ActiveWorkbook.Sheets(2)

    ArryHeader1 = Split("Date,Pon", ",")   ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист исходник)
    ArryHeader2 = Split("Date,Pon", ",")   ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист назначения)

    Application.ScreenUpdating = False

    For Each vHeader In ArryHeader1
        Set rngFound1 = ws1.Cells.Find(vHeader, , xlValues, xlWhole, 1, 1, 0)

        If Not rngFound1 Is Nothing Then
            Pos = Application.Match(vHeader, ArryHeader1, False) - 1
            Set rngFound2 = ws2.Cells.Find(ArryHeader2(Pos), , xlValues, xlWhole, 1, 1, 0)

            ' Копирования столбца и вставка с форматом ячеек
            Range(rngFound1.Offset(1), rngFound1(Rows.Count).End(xlUp)).Copy Destination:=rngFound2.Offset(1)
        End If

    Next

    Application.ScreenUpdating = True
    MsgBox "А теперь Правильно? ", vbQuestion
End Sub

Обратите внимание как правильно надо было вписать заголовки в ArryHeader1 и ArryHeader2 а не лепить горбатого! В комментариях для этих строк я же написал что и как!

 
Ігор Гончаренко

, шо-то он мне выдал ошибку 400, и усё, вроде даже перепроверил, может недокопировал чего, а он всё равно не хочет

 
MikeVol

, теперь всё супер, спасибо за Ваше терпение и труд )) Эти кавычки в экселе меня периодически ставят в тупик, и частенько я их пихаю уже куда не следовало бы. Ошибка новичка, так сказать
Ещё раз спасибо ))

 

в файле из сообщния 4 с такой строкой:
For Each c In Array(«Date», «Pon», «ID», «Amound»)
сработало (с листа 2 на лист 1 скопированы данные с колонок Date и Pon)

Программисты — это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!

 

MikeVol

Пользователь

Сообщений: 229
Регистрация: 20.10.2020

Ученик

#10

15.03.2023 13:01:27

Дмитрий Астахов, А, так вам надо было копировать столбцы со второго листа в первый лист? Тогда мой код не будет работать! Код Ігор Гончаренко из его

#5

тогда то что вам надо!

Обновление!
Хотя чуток переделав код то получим то что и требуется, копирование со второго листа на первый лист.

Код
Option Explicit

Sub CopySpecifcColumn_v3()
    Dim Pos         As Long
    Dim vHeader     As Variant
    Dim rngFound1 As Range, rngFound2 As Range
    Dim ArryHeader1() As String, ArryHeader2() As String
    Dim ws1 As Worksheet, ws2 As Worksheet

    Set ws1 = ActiveWorkbook.Sheets(1)
    Set ws2 = ActiveWorkbook.Sheets(2)

    ArryHeader1 = Split("Date,Pon", ",")   ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист исходник)
    ArryHeader2 = Split("Date,Pon", ",")   ' Здесь можете задать несколько заголовков столбцов, через запятую вписываете заголовок (Лист назначения)

    Application.ScreenUpdating = False

    For Each vHeader In ArryHeader2
        Set rngFound1 = ws1.Cells.Find(vHeader, , xlValues, xlWhole, 1, 1, 0)

        If Not rngFound1 Is Nothing Then
            Pos = Application.Match(vHeader, ArryHeader2, False) - 1
            Set rngFound2 = ws2.Cells.Find(ArryHeader1(Pos), , xlValues, xlWhole, 1, 1, 0)

            ' Копирования столбца и вставка с форматом ячеек
            Range(rngFound2.Offset(1), rngFound2(Rows.Count).End(xlUp)).Copy Destination:=rngFound1.Offset(1)
        End If

    Next

    Application.ScreenUpdating = True
    MsgBox "А теперь Правильно? ", vbQuestion
End Sub

Изменено: MikeVol15.03.2023 13:16:52
(Дополнил ответ. ;) )

Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в VBA Excel. Методы Cut, Copy и PasteSpecial объекта Range, метод Paste объекта Worksheet.

Метод Range.Cut

Range.Cut – это метод, который вырезает объект Range (диапазон ячеек) в буфер обмена или перемещает его в указанное место на рабочем листе.

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен (перемещен) вырезанный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект вырезается в буфер обмена.

Для вставки на рабочий лист диапазона ячеек, вырезанного в буфер обмена методом Range.Cut, следует использовать метод Worksheet.Paste.

Метод Range.Copy

Range.Copy – это метод, который копирует объект Range (диапазон ячеек) в буфер обмена или в указанное место на рабочем листе.

Синтаксис

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон ячеек рабочего листа, в который будет вставлен скопированный объект Range (достаточно указать верхнюю левую ячейку диапазона). Если этот параметр опущен, объект копируется в буфер обмена.

Метод Worksheet.Paste

Worksheet.Paste – это метод, который вставляет содержимое буфера обмена на рабочий лист.

Синтаксис

Worksheet.Paste (Destination, Link)

Метод Worksheet.Paste работает как с диапазонами ячеек, вырезанными в буфер обмена методом Range.Cut, так и скопированными в буфер обмена методом Range.Copy.

Параметры

Параметры Описание
Destination Необязательный параметр. Диапазон (ячейка), указывающий место вставки содержимого буфера обмена. Если этот параметр не указан, используется текущий выделенный объект.
Link Необязательный параметр. Булево значение, которое указывает, устанавливать ли ссылку на источник вставленных данных: True – устанавливать, False – не устанавливать (значение по умолчанию).

В выражении с методом Worksheet.Paste можно указать только один из параметров: или Destination, или Link.

Для вставки из буфера обмена отдельных компонентов скопированных ячеек (значения, форматы, примечания и т.д.), а также для проведения транспонирования и вычислений, используйте метод Range.PasteSpecial (специальная вставка).

Примеры

Вырезание и вставка диапазона одной строкой (перемещение):

Range(«A1:C3»).Cut Range(«E1»)

Вырезание ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Range(«A1:C3»).Cut

ActiveSheet.Paste Range(«E1»)

Копирование и вставка диапазона одной строкой:

Range(«A18:C20»).Copy Range(«E18»)

Копирование ячеек в буфер обмена и вставка методом ActiveSheet.Paste:

Range(«A18:C20»).Copy

ActiveSheet.Paste Range(«E18»)

Копирование одной ячейки и вставка ее данных во все ячейки заданного диапазона:

Range(«A1»).Copy Range(«B1:D10»)


how to use VBA’s End(xlRight) to copy one column’s value to another one?
like I want to always copy columnZ’s range(«Z4:Z203») value to another column’s range(«i5:i204»),how can i use End(xlright) check if the column was pasted and it will paste on next column ?

Community's user avatar

asked Jan 13, 2015 at 8:54

user3425118's user avatar

Why not simply copy always the needed range?

Sub test()
Range("Z4:Z203").Select
Selection.Copy
Range("I5:I204").Select
ActiveSheet.Paste
End Sub

answered Jan 14, 2015 at 9:08

Kᴀτᴢ's user avatar

KᴀτᴢKᴀτᴢ

2,1266 gold badges28 silver badges57 bronze badges

Working Environment: Excel 2013

Target: Copy C1:C9 to B11:B19. D1:D9 to B21:B29. E1:E9 to B31:B39…..

After copying all the range to column B, copy A1:A9 to A11:A19(A21:A29….)

My idea is that:
1. select a range by using something like

     range.end()

because in some of my sheets, there are only 4 test steps. so I need a syntax which can self inspect the used cells in a column.

  1. do a range copy to column B.
  2. leave 1 row in between considering about the page layout.

My piece of code is:

Worksheets("Master").Columns(3).UsedRange.Copy
Worksheets("Master").Range("B11").PasteSpecial

but seems like the Columns(i).UsedRange.Copy doesn’t work. the pastespecial works.

My question is:

How to select the used range in columns? The number of columns are not fixed which means some of the sheets have 40 columns, but some of the other have maybe 30.

Thanks!

I attached one screenshot of the sheet for your reference.Screenshot of the sheet

asked May 15, 2017 at 1:03

Freddy Wang's user avatar

2

Assuming you do not have more data in the columns to be copied, this should work

Sub copyToOneColumn()
    Dim ws As Worksheet
    Set ws = ThisWorkbook.Sheets("Master")

    Dim startCol As Integer
    startCol = 3

    Dim endCol As Integer
    endCol = 10

    Dim startRange As Range
    Dim ra As Range


    For i = startCol To endCol
        Set startRange = ws.Range("A1").Offset(0, i - 1)
        Set ra = ws.Range(startRange, ws.Cells(Rows.Count, startRange.Column).End(xlUp))
        ra.Copy Destination:=ws.Range("B" & Rows.Count).End(xlUp).Offset(2, 0)
    Next i

End Sub

answered May 15, 2017 at 3:15

nightcrawler23's user avatar

nightcrawler23nightcrawler23

2,0461 gold badge14 silver badges22 bronze badges

You can do a copy (not technically a copy as it doesn’t use the clipboard) directly like so:

Range("B1").Resize(Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Rows.Count,1) = Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Value

Effectively you are looking at B1 then resizing that to a range to be the number of columns in column A that are used with this: Range("A1:A" & range("A" & Rows.Count).End(xlUp).Row).Rows.Count

Then you are making this new range in column B = to the values of the same range in column A.

Note, this can be shortened if you are always starting at row 1 but the code I have given you will suffice if you start at a different row.

answered May 15, 2017 at 3:37

Dan Donoghue's user avatar

Dan DonoghueDan Donoghue

5,9662 gold badges18 silver badges36 bronze badges

You may try something like this…

Sub CopyData()
Dim wsMaster As Worksheet
Dim lr As Long, lc As Long, r As Long, c As Long
Application.ScreenUpdating = False
Set wsMaster = Sheets("Master")
lr = wsMaster.Cells(Rows.Count, 1).End(xlUp).Row
lc = wsMaster.Cells(1, Columns.Count).End(xlToLeft).Column
r = lr + 2
If lr <= 9 Then
    For c = 3 To lc
        wsMaster.Range(wsMaster.Cells(1, c), wsMaster.Cells(lr, c)).Copy wsMaster.Range("B" & r)
        wsMaster.Range("A1:A" & lr).Copy wsMaster.Range("A" & r)
        r = wsMaster.Cells(Rows.Count, 2).End(xlUp).Row + 2
    Next c
End If
Application.ScreenUpdating = True
End Sub

answered May 15, 2017 at 4:40

Subodh Tiwari sktneer's user avatar

Sub Макрос()

       Dim c As Long

          ‘ Отключение монитора и пересчёта формул.
        ‘ Необходимости в этом нет, сделано просто так.
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual

       ‘ Пересчёт формул на активном листе.
    ActiveSheet.Calculate

       ‘ Копирование столбца F в первый пустой столбец.
        ‘ Формулы заменяются на значения.
    c = Cells(1, Columns.Count).End(xlToLeft).Column + 1
    Columns(«F»).Copy
    Cells(1, c).PasteSpecial xlPasteColumnWidths
    Cells(1, c).PasteSpecial xlPasteFormats
    Cells(1, c).PasteSpecial xlPasteValues
    Application.CutCopyMode = False

       ‘ Включение пересчёта формул.
    Application.Calculation = xlCalculationAutomatic

   End Sub

[свернуть]

Понравилась статья? Поделить с друзьями:
  • Vba excel скопировать лист с новым именем
  • Vba excel скопировать значение в ячейку
  • Vba excel скопировать диапазон ячеек в другую книгу
  • Vba excel скопировать данные с листов в один
  • Vba excel скопировать выделенный диапазон