Макрос excel копирование столбцов

 

Grantorino

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

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

#1

24.08.2020 15:40:19

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

Код
Sub Макрос1()

    Range("Таблица1[[#All],[Материал]]").Select
    Selection.Copy
    Sheets.Add After:=ActiveSheet
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub

а для нескольких не смежных — не получается. И как лучше для большего массива, копировать не смежные столбцы с использованием имен столбцов или без них (через определение диапазона)?

Прикрепленные файлы

  • Test macros.xlsm (14.48 КБ)

Изменено: Grantorino24.08.2020 15:51:49

 

Mershik

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

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

Grantorino, а что вы хотите скопировать енсмежное?

Изменено: Mershik24.08.2020 15:43:12

Не бойтесь совершенства. Вам его не достичь.

 

Grantorino

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

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

Mershik,например столбец материал и столбец стоимость

 

New

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

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

#4

24.08.2020 15:57:52

Код
Sub test()
    Range("A:A,C:C").Copy
    Sheets.Add After:=ActiveSheet
    Range("A1").Select
    ActiveSheet.Paste
End Sub
 

Grantorino

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

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

New, спасибо, но мне необходимо скопировать не весь столбец, а столбец таблицы

 

New

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

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

А какая разница, если вы на пустой лист будете вставлять данные? )

 

Aleksey1107

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

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

Excel 365

#7

24.08.2020 16:01:30

Grantorino,добрый день.
замените 3 строку вашего кода, на эту

Код
Range("Таблица1[Материал],Таблица1[Стоимость]").Select
 

New

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

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

#8

24.08.2020 16:05:03

Код
Sub test()
Dim LastRow As Long
    
    With Worksheets("Лист1")
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Union(Range("A1:A" & LastRow), Range("C1:C" & LastRow)).Copy
    End With
    Sheets.Add After:=ActiveSheet
    Range("A1").PasteSpecial Paste:=xlPasteValues
End Sub

вариант 2, но копируется без шапки таблицы

Код
Sub Макрос1()
    Range("Таблица1[Материал],Таблица1[Стоимость]").Copy
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Paste
End Sub

вот ещё вариант вам

Код
Sub test()
Dim LastRow As Long, Rng As Range
    
    With Worksheets("Лист1")
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Rng = Union(Range("A1:A" & LastRow), Range("C1:C" & LastRow))
    End With
    Sheets.Add After:=ActiveSheet
    Rng.Copy Range("A1")
End Sub

Изменено: New24.08.2020 16:10:32

 

Grantorino

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

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

#9

24.08.2020 16:17:01

Всем большое спасибо!
и второй вопрос на который пока не услышал и не знаю ответ, если таблица большая, то как лучше

Код
Sub test()
Dim LastRow As Long, Rng As Range
     
    With Worksheets("Лист1")
        LastRow = .Cells(.Rows.Count, 1).End(xlUp).Row
        Set Rng = Union(Range("A1:A" & LastRow), Range("C1:C" & LastRow))
    End With
    Sheets.Add After:=ActiveSheet
    Rng.Copy Range("A1")
End Sub

или так:

Код
Sub Макрос1()
    Range("Таблица1[Материал],Таблица1[Стоимость]").Copy
    Sheets.Add After:=ActiveSheet
    ActiveSheet.Paste
End Sub
 

New

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

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

моё мнение — разницы нет.

Изменено: New24.08.2020 16:27:50

 

Aleksey1107

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

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

Excel 365

#11

24.08.2020 16:27:12

Цитата
New написал:
вариант 2, но копируется без шапки таблицы

Нет, но отличие все же есть от моего в #7 :D
С шапкой))

Код
Sub Макрос1()
    Range("Таблица1[[#All],[Материал]],Таблица1[[#All],[Стоимость]]").Select
    Selection.Copy
    Sheets.Add After:=ActiveSheet
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
End Sub
 

New

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

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

#12

24.08.2020 16:29:27

Цитата
Aleksey1107 написал:
Нет, но отличие все же есть от моего в #7

я ваш вариант и взял за основу))

 

Grantorino

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

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

При использовании макроса, возник впорос, как сделать чтобы указанный порядок в макросе учитывался, если мне надо сначала столбец стоимость вставить встолбец А на листе 2, а Материал в столбец B ? почему-то макрос вставляет в исходном порядке, вне зависимости как я перечисляю столбцы в макросе/

И еще прошу помощи, при копировании более 8ми столбцов выдает ошибку method range of object global faied.. необходимо разбить на несколько частей процесс копирования?

Изменено: Grantorino25.08.2020 11:11:56

 

New

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

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

#14

25.08.2020 11:29:59

Да, копируйте каждый столбец отдельно в нужном порядке

This is my first attempt to write VBA code. I am mimicking something I found on stackoverflow.

I want to copy certain columns (A, B and E) from one workbook to another and also change the font and color of certain Rows and edit the text in certain cells (replace a long phrase with the word «Group»).

This is the code I copied without change:

Sub CopyColumnToWorkbook()
Dim sourceColumn As Range, targetColumn As Range

Set sourceColumn = Workbooks("Source").Worksheets("Sheet1").Columns("A")
Set targetColumn = Workbooks("Target").Worksheets("Sheet1").Columns("A")

sourceColumn.Copy Destination:=targetColumn
End Sub

I get a runtime error 9 and the line below is highlighted:

Set sourceColumn = Workbooks("Source").Worksheets("Sheet1").Columns("A")

I am attaching the Source and Target files below as I hope they would look like at the end of a successful run.

Source File

Target File

Community's user avatar

asked Dec 6, 2012 at 23:54

Amatya's user avatar

1

You reference a sheet that is not there. Change it to reference the first sheet in the workbook by using its index. You also did not include the extension to the file so it would fail on the workbook object as well.

Sub CopyColumnToWorkbook()
Dim sourceColumn As Range, targetColumn As Range

Set sourceColumn = Workbooks("Source.xlsm").Worksheets(1).Columns("A")
Set targetColumn = Workbooks("Target.xlsm").Worksheets(1).Columns("A")

sourceColumn.Copy Destination:=targetColumn
End Sub

answered Dec 7, 2012 at 0:26

Sorceri's user avatar

SorceriSorceri

7,8101 gold badge28 silver badges38 bronze badges

5

Вырезание, перемещение, копирование и вставка ячеек (диапазонов) в 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»)


@davidtaillefer First of all, tho part of the code where you determine to target cell is not correct.

Range("b" & LastColumn + 1 & LastRow + 1)

Suppose LastColumn = 26 and LastRow =153, the above line of code translates to «B» & 26+1 & 153+1, which results in a cell reference «B27154»

I believe the following piece of code does what you want. It copies values and formats from the first sheet into the next empty column in the second sheet from row 4. If B4 in the second sheet is empty (like the very first time you perform the copy/paste operation to an empty sheet) it will start in in B4.

Sub copycolumns()

Dim TargetSheet As Object
Set TargetSheet = Sheets("Productivity Weekly")

Dim TargetColumn As Integer

TargetColumn = TargetSheet.Range("B4").CurrentRegion.Columns.Count + 2

If TargetSheet.Range("B4") = "" Then
    TargetColumn = 2
End If

Sheets("Assignments").Range("C18:j167").Copy

TargetSheet.Activate
TargetSheet.Cells(4, TargetColumn).Select

Selection.PasteSpecial Paste:=xlPasteAllUsingSourceTheme, Operation:=xlNone _
        , SkipBlanks:=False, Transpose:=False
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
        
Application.CutCopyMode = False


End Sub

 Not the most elegant piece of programming, but it works for the task you want to perform.

Студворк — интернет-сервис помощи студентам

Добрый вечер, уважаемые форумчане!

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

Мне необходимо перенести столбцы листа «подробно» B-E, AF-AH на лист «Лист2» по событию Worksheet_Change (как только заполнили ячейку последнего столбца AH).
1. Желательно предварительное удаление пустых строк перед переносом, если они есть
2.перенос новой информации каждый раз без переписывания старой
3.желательно перенести названия столбцов и форматирование ячеек (без формул)
4. желательно обойтись без цикла, чтобы процедура происходила быстро, без кнопки к тому же

В принципе, все необходимые кусочки кода у меня есть в файле (см.), но я, с одной стороны, не знаю, как правильно обратиться к копируемым диапазонам, с другой-не знаю, как их собрать воедино. Не знаю также, можно ли в один лист вставлять несколько кодов.
Помогите, пожалуйста. Сделала все, что могла-нашла коды, но дальше переработать их не могу .

Добавлено через 5 минут
Простите, не могу послать файл: пишет, что некорректный, но в нем только 72 КБ-файл с поддержкой макросов. Я как-то могу его еще приложить?

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