Vba excel копирование на один лист

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


Содержание

  1. Метод Range.Copy (Excel)
  2. Синтаксис
  3. Параметры
  4. Возвращаемое значение
  5. Пример
  6. Поддержка и обратная связь
  7. Метод Worksheet.Copy (Excel)
  8. Синтаксис
  9. Параметры
  10. Замечания
  11. Пример
  12. Поддержка и обратная связь
  13. Sheets.Copy method (Excel)
  14. Syntax
  15. Parameters
  16. Remarks
  17. Example
  18. Support and feedback
  19. VBA Excel. Копирование данных с одного листа на другой
  20. Условие задачи по копированию данных
  21. Решение копированием с листа на лист
  22. Решение с использованием массивов
  23. 6 комментариев для “VBA Excel. Копирование данных с одного листа на другой”
  24. VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)
  25. Метод Range.Cut
  26. Синтаксис
  27. Параметры
  28. Метод Range.Copy
  29. Синтаксис
  30. Параметры
  31. Метод Worksheet.Paste
  32. Синтаксис
  33. Параметры
  34. Примеры
  35. 43 комментария для “VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)”

Метод Range.Copy (Excel)

Копирует диапазон в указанный диапазон или в буфер обмена.

Хотите создавать решения, которые расширяют возможности Office на разнообразных платформах? Ознакомьтесь с новой моделью надстроек Office. Надстройки Office занимают меньше места по сравнению с надстройками и решениями VSTO, и вы можете создавать их, используя практически любую технологию веб-программирования, например HTML5, JavaScript, CSS3 и XML.

Синтаксис

выражение.Copy (Destination)

выражение: переменная, представляющая объект Range.

Параметры

Имя Обязательный или необязательный Тип данных Описание
Destination Необязательный Variant Указывает новый диапазон, в который будет скопирован заданный диапазон. Если этот аргумент опущен, Microsoft Excel копирует диапазон в буфер обмена.

Возвращаемое значение

Пример

В следующем примере кода копируются формулы ячеек A1:D4 с листа Sheet1 в ячейки с E5:H8 на листе Sheet2.

В приведенном ниже примере кода проверяется значение столбца D для каждой строки на листе Sheet1. Если значение в столбце D равно «A», вся строка копируется на лист SheetA в следующую пустую строку. Если значение равно «B», строка копируется на лист SheetB.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Метод Worksheet.Copy (Excel)

Копирует лист в другое место в текущей или новой книге.

Синтаксис

expression. Копирование (до, после)

Выражение Переменная, представляющая объект Worksheet .

Параметры

Имя Обязательный или необязательный Тип данных Описание
Before Необязательный Variant Лист, перед которым будет размещен скопированный лист. Невозможно указать параметр Before , если указать After.
After Необязательный Variant Лист, после которого будет размещен скопированный лист. Вы не можете указать After , если укажем значение До.

Замечания

Если не указать значение «До» или «После», Microsoft Excel создает новую книгу, содержащую скопированный объект Worksheet . Только что созданная книга содержит свойство Application.ActiveWorkbook и содержит один лист. На одном листе сохраняются свойства Name и CodeName исходного листа. Если скопированный лист содержал лист кода листа в проекте VBA, он также переносится в новую книгу.

Выбор массива из нескольких листов можно скопировать в новый пустой объект Workbook аналогичным образом.

Источник и назначение должны находиться в одном экземпляре Excel.Application. В противном случае возникает ошибка среды выполнения 1004: не поддерживается такой интерфейс, если использовался что-то подобное Sheet1.Copy objWb.Sheets(1) , или ошибка среды выполнения 1004: сбой метода копирования класса Worksheet, если использовалось что-то подобное ThisWorkbook.Worksheets(«Sheet1»).Copy objWb.Sheets(1) .

Пример

В этом примере выполняется копирование Sheet1, помещая его после Sheet3.

В этом примере сначала файл Sheet1 копируется в новую пустую книгу, а затем сохраняет и закрывает новую книгу.

В этом примере листы Sheet1, Sheet2 и Sheet4 копируются в новую пустую книгу, а затем сохраняются и закрываются.

Поддержка и обратная связь

Есть вопросы или отзывы, касающиеся Office VBA или этой статьи? Руководство по другим способам получения поддержки и отправки отзывов см. в статье Поддержка Office VBA и обратная связь.

Источник

Sheets.Copy method (Excel)

Copies the sheet to another location in the workbook.

Syntax

expression.Copy (Before, After)

expression A variable that represents a Sheets object.

Parameters

Name Required/Optional Data type Description
Before Optional Variant The sheet before which the copied sheet will be placed. You cannot specify Before if you specify After.
After Optional Variant The sheet after which the copied sheet will be placed. You cannot specify After if you specify Before.

If you don’t specify either Before or After, Microsoft Excel creates a new workbook that contains the copied sheet.

Example

This example copies Sheet1, placing the copy after Sheet3.

Support and feedback

Have questions or feedback about Office VBA or this documentation? Please see Office VBA support and feedback for guidance about the ways you can receive support and provide feedback.

Источник

VBA Excel. Копирование данных с одного листа на другой

Решение задачи по копированию данных с одного листа на другой без использования и с использованием массивов. Вызов из кода VBA Excel других процедур.

Условие задачи по копированию данных

На одном листе расположен список повторяющихся городов с информацией о предприятиях общепита:

Исходная таблица задания №1

Необходимо данные по каждому городу перенести в одну строку на другом листе (таблица обрезана справа):

Часть результирующего списка задания №1

Решение копированием с листа на лист

Это решение значительно проще, чем с использованием массивов, но более медленное. При больших объемах информации обработка может длиться достаточно долго. Решение достигается путем присваивания значений ячеек из таблицы первого листа ячейкам второго листа.

Переменные:

  • n1 – количество строк в исходной таблице;
  • n2 – номер столбца текущей ячейки исходной таблицы, к которой обращается цикл;
  • n3 – номер строки текущей ячейки на втором листе;
  • n4 – номер столбца текущей ячейки на втором листе;
  • i1 – счетчик цикла For… Next;
  • gorod – переменная с наименованием города, предназначенная для контроля за сменой текущего города, который обрабатывается циклом.

Решение с использованием массивов

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

Подпрограммы Kopirovanie и Vstavka используются в цикле For. Next процедуры Resheniye2 по два раза, поэтому их коды вынесены за пределы процедуры Resheniye2 и вызываются по мере необходимости.

Переменные:

  • massiv1 – его элементам присваиваются значения ячеек исходной таблицы;
  • massiv2 – одномерный массив, заполняемый данными из переменной txt1;
  • massiv3 – двумерный массив, заполняемый данными из одномерного массива massiv2 и используемый для вставки очередной строки на второй лист;
  • txt1 – сюда копируются через разделитель значения элементов массива massiv1, предназначенные для заполнения очередной строки на втором листе;
  • n1 – количество строк в исходной таблице;
  • n2 – количество столбцов в исходной таблице;
  • n3 – номер текущей строки на втором листе;
  • n4 – количество столбцов текущей строки на втором листе (соответствует количеству элементов массива massiv2);
  • i1, i2, i3 – счетчики цикла For… Next;
  • gorod – переменная с наименованием города, предназначенная для контроля за сменой текущего города, который обрабатывается циклом.

Переменные, использующиеся более чем в одной процедуре, объявлены как глобальные в разделе Declarations программного модуля.

6 комментариев для “VBA Excel. Копирование данных с одного листа на другой”

Классно! Авторам — уважение! Толково, без соплей, со знанием дела.
Можете подсказать синтаксис такой проблемы: таблица 10 строк, 8 столбцов, если первая ячейка не пустая, скопировать на другой лист этой книги, а лучше — в отдельную книгу всю строку таблицы. Потом то же самое со строкой ниже, и так до последней. Потом пустые строки надо скрыть.
Это сложно?
Заранее спасибо за ответ.

Привет, Илья!
Для диапазона A1:H10:

Здравствуйте, Евгений! Огромное Вам спасибо! Потраченное время и желание помочь дорогого стОит, это большая редкость в наше время, поверьте. Ваш макрос — не совсем то, что мне нужно (например, новую книгу открывать не нужно, она уже есть, нужно просто на неё (и нужный лист) сослаться). Месторасположение ячеек в книгах не совпадает, строки тоже (27-я строка первой книги вставляется в 6-ю второй, т.е., например D27 в E6). И самое главное — вторая книга заполняется с нарастающим итогом. Т.е с первой книги берутся данные, вносятся во вторую, потом первая заполняется по новой, эти данные вносятся во вторую, но уже ниже и т.д.
Но, в любом случае, огромное спасибо, Вы дали направление, куда двигаться, буду думать ):

Добрый день, Евгений!
Существует способ автоматической передачи (копирования) данных из одного файла эксель в другой методом =…
А метод автоматической передачи (копирования) цвета имеется?
Подскажите пожалуйста!

Источник

VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)

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

Метод Range.Cut

Синтаксис

Параметры

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

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

Метод Range.Copy

Синтаксис

Параметры

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

Метод Worksheet.Paste

Синтаксис

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

Параметры

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

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

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

Примеры

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

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

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

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

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

43 комментария для “VBA Excel. Вырезание, копирование и вставка ячеек (диапазонов)”

Странно, что не рассмотрено копирование ячеек, которые Cells.
Например, следующая строка копирует ячейку A1 в B2

а эта делает тоже самое, но демонстрирует,
как можно добавить размер и смещение:

Здравствуйте!
Скажите, как можно копировать на Лист 1, а вставить на Лист 2 диапазон ячеек целиком, либо отсортированный по 1 признаку диапазон(например по какому-то определенному значению, скажем, числу «500» в одном столбце Листа 1)?

Привет, Максим!
Вот пример сортировки таблицы по значению 500 в первом столбце на «Лист6» и копирования диапазона с «Лист6» на «Лист4» :

Спасибо большое, только я, наверно, неправильно описал ситуацию.
Сперва из эталонной таблицы Лист 1 копируем весь список на существующий Лист4.
Затем, пропускаем шапку, и, начиная со строки7, уже на Лист4 ищем строку, у которой в столбце 5 стоит число 500.
Вырезаем эту строку и вставляем на позицию строки 7. т.е первая после шапки.
Ищем следующую строку — вырезаем, потом вставляем на позицию строки 7+1=8 и т.д.
В итоге оставим только те строки, у которых в столбце 5 стоит число «500», остальные удаляются строки.

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

Источник

I am pretty new to VBA and am trying to automate a process at work where I need to extract select cells from an array of 6 sheets and consolidate them in another sheet. The code I have works, but is kinda «clunky» — I am using the excel copy and paste functions, but can’t seem to find a good solution away from the copy-and-paste function. And when I try to add a paste special function, I get an 1004 error. Would love advice on optimising this!

For each sheet to be copied, cells are marked in the first column with «1», «0» or left blank — if the cells are «1» or «0», I copy the other cells in the row to the consolidated sheet. There are some gaps in between rows, so I opted to use a For-Loop instead of a Do-While statement.

I’ve attached the code as follows:

Sub TEST()
    Dim i As Integer 'copying row counter for each sheet to be copied
    Dim j As Integer 'pasting row counter in consolidated sheet
    Dim cal(1 To 6) As String  'copied sheetname
          cal(1) = "Picks"
          cal(2) = "Eats"
          cal(3) = "Night Out"
          cal(4) = "Active"
          cal(5) = "Family"
          cal(6) = "Arts"
    Dim x As Integer

    Dim y As Integer 'column for date
    Dim z As Integer 'max row to run till

    y = 1 'column checked in each sheet where condition for copying is met
    z = 300 'number of rows to check in each sheet

    j = 1

    For x = 1 To 6

    For i = 1 To z
        If Sheets(cal(x)).Cells(i, y) = "0" Or Sheets(cal(x)).Cells(i, y) = "1" Then
            Sheets(cal(x)).Select
            Range(Sheets(cal(x)).Cells(i, 2), Sheets(cal(x)).Cells(i, 10)).Select
            Selection.Copy
            Application.Goto ActiveWorkbook.Sheets(Consolidated).Cells(j, 1)
            ActiveSheet.Paste
    Else
        j = j - 1
        End If
        j = j + 1
    Next i
    Next x
End Sub

Again I would love to optimise this code, using another method instead of copy-and-paste. Also I tried:

Application.Goto ActiveWorkbook.Sheets(Consolidated).Cells(j, 1)
ActiveSheet.PasteSpecial Operation:=xlPasteValues

Which resulted in a 1004 error. Would love to know what went wrong.

Макрос копирования данных с разных листов на один лист

Nat

Дата: Четверг, 29.08.2013, 22:31 |
Сообщение № 1

Группа: Пользователи

Ранг: Участник

Сообщений: 50


Репутация:

0

±

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


Excel 2010

Добрый день!

Мне потребовалось написать макрос, но с ними я совсем не дружу, поэтому надеюсь на Вашу помощь. Нужно скопировать данные с разных листов на итоговый лист одной и той же книги Excel. Количество столбцов всегда одинаковое, а вот количество строк и листов — разное. При этом желательно, чтобы первую страницу он копировал с заголовком, а остальные — без. Файл прилагаю.

P.S. Пункт 5q в правилах форума я не нашла, поэтому заранее извиняюсь, если опять сделала что-то не так.

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

3838011.xls
(62.5 Kb)

 

Ответить

Hugo

Дата: Пятница, 30.08.2013, 00:25 |
Сообщение № 2

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Как это не нашли?
Вот он, под спойлером:
q — задавать новые вопросы в уже созданных чужих или своих темах


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

Hugo

Дата: Пятница, 30.08.2013, 01:17 |
Сообщение № 3

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

[vba]

Код

Option Explicit

Sub CopyData()
       Dim sh As Worksheet, r As Range, i&
       Application.ScreenUpdating = False

       Set sh = Worksheets.Add(before:=Worksheets(1))
       Set r = Worksheets(2).Columns(1).Find(1, , xlValues, xlWhole)
       If Not r Is Nothing Then
           r.Offset(-2).EntireRow.Resize(3).Copy sh.Cells(1)
           For i = 2 To Worksheets.Count
               With Worksheets(i)
                   Set r = .Columns(1).Find(1, , xlValues, xlWhole)
                   If Not r Is Nothing Then
                       .Range(r.Offset(1), .Range(«AJ» & .Rows.Count).End(xlUp)).Copy _
                     Worksheets(1).Range(«B» & .Rows.Count).End(xlUp)(2).Offset(, -1)
                   End If
               End With
           Next
       End If
       Application.ScreenUpdating = True
End Sub

[/vba]
Сперва искал по «Дата отправки КС» — но что-то на последнем листе не искалось (на том, который как пример собранного). Так и не понял, почему — переделал на поиск единицы :(


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

SergeyKorotun

Дата: Пятница, 30.08.2013, 02:17 |
Сообщение № 4

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

Ранг: Обитатель

Сообщений: 301


Репутация:

15

±

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


Excel 2007

Опередили
[vba]

Код

Sub Start()
     Call CreateSheet
     Call Copy
End Sub
Private Sub CreateSheet()
    On Error Resume Next
    Set wsSheet = Sheets(«Итог»)
    If Err.Number = 0 Then
       Application.DisplayAlerts = False
       Sheets(«Итог»).Delete
       Application.DisplayAlerts = True
    End If
    Sheets.Add After:=Sheets(Sheets.Count)
    Sheets(Sheets.Count).Name = «Итог»
End Sub
Private Sub Copy()
  Dim sRng As Range  
  Dim dRng As Range  
     Application.ScreenUpdating = False
     ThisWorkbook.Sheets(1).Activate
     Set sRng = Range(«A9:AJ11»)
     ThisWorkbook.Sheets(Sheets.Count).Activate
     Set dRng = Range(«A1»)
     sRng.Copy dRng
     For i = 1 To ThisWorkbook.Sheets.Count — 1
        ThisWorkbook.Sheets(i).Activate
        Set sRng = Range(Cells(12, 1), Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count))
        ThisWorkbook.Sheets(Sheets.Count).Activate
        Set dRng = Cells(ActiveSheet.UsedRange.Rows.Count + 1, 1)
        sRng.Copy dRng
     Next i
     Application.ScreenUpdating = True
End Sub

[/vba]

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

qwerty_.xlsm
(32.0 Kb)

 

Ответить

Nat

Дата: Пятница, 30.08.2013, 15:09 |
Сообщение № 5

Группа: Пользователи

Ранг: Участник

Сообщений: 50


Репутация:

0

±

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


Excel 2010

Благодарю за помощь! Первый вариант рабочий. Во втором макрос копировал в исходную книгу (удалила «ThisWorkbook» в тексте — стал копировать в новый документ, хотя не уверена что именно это н.б. сделать) и только первые два листа (как это исправить — не знаю, да это уже и не так важно)…Полезная это вещь — макросы! Надо будет освоить хотя бы азы. Еще раз спасибо за помощь! :)

 

Ответить

SergeyKorotun

Дата: Пятница, 30.08.2013, 15:27 |
Сообщение № 6

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

Ранг: Обитатель

Сообщений: 301


Репутация:

15

±

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


Excel 2007

Nat, ThisWorkbook — это книга с которой вы запускаете макрос. По всей видимости вы вставили макрос не в ту книгу.
[vba]

Код

For i = 1 To ThisWorkbook.Sheets.Count — 1

[/vba] с первого листа по предпоследний.
Копирует только с двух наверно по той самой причине: не в ту книгу вставили макрос.
Скачайте qwerty_.xlsm, добавьте туда листов и запустите макрос и вы увидите что макрос обработает все листы.
В варианте Hugo в итоговом листе при повторных запусках строки будут дублироваться.

 

Ответить

Nat

Дата: Пятница, 30.08.2013, 15:52 |
Сообщение № 7

Группа: Пользователи

Ранг: Участник

Сообщений: 50


Репутация:

0

±

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


Excel 2010

Да, с дублированием в варианте Hugo я уже столкнулась.
Последовала вашему совету и поновой запустила макрос — действительно все ок. Спасибо!

 

Ответить

Hugo

Дата: Пятница, 30.08.2013, 17:30 |
Сообщение № 8

Группа: Друзья

Ранг: Участник клуба

Сообщений: 3140


Репутация:

670

±

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


2010, теперь уже с PQ

Не запускайте повторно — не будет дублироваться :)
Если есть такая мания — нужно всего лишь добавить в код удаление первого листа. Если он тот, который лишний. Ну в общем этот вопрос не вопрос.
Зато у меня таблицы могут скакать по листу, и не скопируется лишнее, как в случае
[vba]

Код

Cells(ActiveSheet.UsedRange.Rows.Count, ActiveSheet.UsedRange.Columns.Count))

[/vba]Тут может и недокопироваться, и лишнее скопироваться — зависит от файла. Но если файлы всегда будут именно такие и никто туда руки не сунет — тогда ладно :)


excel@nxt.ru
webmoney: R418926282008 Z422237915069

 

Ответить

exelskatyazhelyi

Дата: Воскресенье, 19.02.2017, 08:53 |
Сообщение № 9

Группа: Пользователи

Ранг: Новичок

Сообщений: 15


Репутация:

0

±

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


Excel 2010

Hugo, привет, всем Гуру экселя. Не могу разобраться с макросом, совсем вот уже 3 день. Нужно собрать данные со всех листов в один, листов больше 100 штук, постоянно дополняется. Кол-во столбцов одинаковое, строк-разное. может кто сможет помочь?

 

Ответить

Pelena

Дата: Воскресенье, 19.02.2017, 09:13 |
Сообщение № 10

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

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

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

exelskatyazhelyi, прочитайте Правила форума и создайте свою тему.
Эта тема закрыта


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

 

Ответить

 

AcademiC

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

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

Уважаемые форумчане, я заранее знаю, что вопрос обозначенный в теме, задавался уже не один десяток раз… и обсуждался уже пару сотен раз… НО, я честно прочитал множество веток… я второй день не отрывая задницу от стула и обнявшись с книжкой Уокенбаха пытаюсь решить эту, для многих, видимо, тривиальную задачу… я сдаюсь, я не понимаю КАК? Логика формул Excel в VBA не работает, ну т.е. работает но не зеркально… если бы можно было решить эту задачу не прибегая к VBA — я бы решил… но, тут нужен VBA, а силы мои кончились…  

  И хотя постановка задачи тривиальна, но все же:  
* Есть книга *.xlsm (во вложении);  
* Есть несколько вкладок (отмечены цветом): «Гор», «Каш», «Вол», «Нау»;  
* С каждой из этих вкладок нужно скопировать данные в лист «Лист2» — в данном листе уже заполнена «шапка» — задача скопировать только данные из вышеупомянутых листов;  
* Условие копирования — начиная с первой строки (Строка 3), до последней заполненной (определение последней заполненной строки с горем пополам смог решить — читай найти решение на форуме): Sub CopyManagers5() в модуле Copy в прилагаемом файле;  
* но я не понимаю КАК? реализовать следующее:    
а) диапазон для копирования я выделил, но если я, запуская макрос, нахожусь не на том листе для которого этот макрос написан (в примере макрос для листа «Вол», т.е. иначе говоря лист «Вол» неактивен) — вылетает ошибка…    
б) проблема номер два — ну получилось у меня скопировать данные на лист «Лист2», как заставить макрос перейти на следующий, необходимый мне, лист для выделения и копирования следующего блока данных (перечень листов откуда копировать данные — заранее известен)?    
в) Проблема три: как на этом листе «Лист2» вставить следующий блок данных в след за тем блоком, которые был перенесен с во время первой итерации (чтобы данные копировались на «Лист2» друг за другом)?    
г) Проблема четыре — допустим произошло чудо, все скопировалось как надо на лист «Лист2», как заставить макрос при следующем запуске стереть с этого листа («Лист2») все данные кроме шапки (предполагается, что упомянутые вкладки будут редактироваться ежедневно)?  

  Пожалуйста, помогите.  

  P.S. Архив разбит на 2 части.

 

AcademiC

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

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

Вторая часть файла (архив)

 

Hugo

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

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

б) for each sh in arr  
arr — это массив «перечень листов откуда копировать данные — заранее известен»  
Значение sh подставляем в конструкцию sheets(sh) — будь то индекс или имя.  
в) Вы ведь сказали «определение последней заполненной строки с горем пополам смог решить» — вот и определяйте и копируйте ниже.  
г) аналогично — определяйте и стирайте, или удаляйте строки целиком.  

  Файлы не смотрел.

 

AcademiC

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

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

б) Я правильно понимаю логику?  
Dim arr As Range  
Set arr = Worksheets(«Вол», «Гор», «Каш», «Нау»)  

  …а sh какой тип определить?

 

Hugo

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

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

Вот, вполне человеческая логика :)  

    Sub tt()  
   Dim arr  
   Application.ScreenUpdating = False  
   arr = Split(«Ćīš Źąų Āīė Ķąó»)  
   Sheets(«Ėčńņ2»).Range([AZ3], Range(«A» & Rows.Count).End(xlUp)).ClearContents
   For Each sh In arr  
       With Sheets(sh)  
           .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy Sheets(«Ėčńņ2»).Range(«A» & Rows.Count).End(xlUp).Offset(1)
       End With  
   Next  
   Application.ScreenUpdating = True  
End Sub  

    Остаются вопрос — а не надо ли «убивать» формулы?

 

Hugo

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

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

Извините, не уследил…  

    Sub tt()  
   Dim arr  
   Application.ScreenUpdating = False  
   arr = Split(«Гор Каш Вол Нау»)  
   Sheets(«Лист2»).Range([AZ3], Range(«A» & Rows.Count).End(xlUp)).ClearContents
   For Each sh In arr  
       With Sheets(sh)  
           .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy Sheets(«Лист2»).Range(«A» & Rows.Count).End(xlUp).Offset(1)
       End With  
   Next  
   Application.ScreenUpdating = True  
End Sub

 

Hugo

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

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

Справедливо, сам сколько раз поправлял :)  

       With Sheets(«Лист2»)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents
   End With

 

Юрий М

Модератор

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

Контакты см. в профиле

AcademiC, так дело не пойдёт: Вы полагаете, что, если нельзя 500К, то можно пять по 100? Не верю, что для решения Вашего вопроса нельзя создать небольшой файл-пример.

 

Hugo

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

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

Т.е. вот так с «ловлей блох» (ещё одну точку добавил):  

    Sub tt()  
   Dim arr  
   Application.ScreenUpdating = False  
   arr = Split(«Гор Каш Вол Нау»)  
   With Sheets(«Лист2»)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents
   End With  
   For Each sh In arr  
       With Sheets(sh)  
           .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy Sheets(«Лист2»).Range(«A» & .Rows.Count).End(xlUp).Offset(1)
       End With  
   Next  
   Application.ScreenUpdating = True  
End Sub

 

Hugo

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

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

Юрий, справедливо.    
Тем более если в этом файле поудалять все ненужные строки с формулами ниже данных и запаковать в архив — то думаю много и не будет.  
Не проверял, ибо там пароли :(  
Были :)

 

AcademiC

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

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

Юрий М  

  Прошу прощения, хотел как лучше…  

  Hugo  

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

  Спасибо огромное за помощь, остался только один вопрос — не могу понять что поправить в макросе, чтобы он на листе «Лист2» не затирал шапку…? Сейчас данные вставляются не с 3-ей строчки а со второй + форматирование первой строки (заливка) остается, а вот вся внутрянка (формулы) пропадает…  

  Что я сделал опять не так?  

  Sub tt()  
    ‘Очищаем данные с листа:  
   With Sheets(«Лист2»)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents
   End With  
    ‘заполняем лист данными:  
   Dim arr  
   Application.ScreenUpdating = False  
   arr = Split(«Гор Каш Вол Нау»)  
   With Sheets(«Лист2»)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents
   End With  
   For Each sh In arr  
   With Sheets(sh)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy Sheets(«Лист2»).Range(«A» & .Rows.Count).End(xlUp).Offset(1)
   End With  
   Next  
   Application.ScreenUpdating = True  
End Sub

 

AcademiC

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

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

Так, простите… данные с листа и так очищаются — я туплю вставляя блок до коммента «‘заполняем лист данными:»… Извините.

 

Hugo

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

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

Да, неприятная мелочь. Просто я тестил на листе с уже скопированными данными, не заметил, что на пустом будет такой эффект…  
Можно поставить костыль так —    

     With Sheets(«Лист2»)  
   .[a3] = Now
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents
   End With  

  Или ставить проверку на позицию последней заполненной строки, или иначе делать определение этого диапазона… Но зачем? :)  
Ну а на листе с заполненными данными ошибки не будет, т.е. если в А3 что-то записано, то порядок :)

 

AcademiC

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

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

Hugo  

  …не выходит цветок каменный… :-(  

  Файл во вложении.  

  Если оставить .[a3] = Now —> затирает часть шапки…при повторном запуске появляется пустая строка…

 

Hugo

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

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

Вот так работает:  

    Sub tt()  
   Dim arr  
   Application.ScreenUpdating = False  
   arr = Split(«Гор Каш Вол Нау»)  
   With Sheets(«Лист2»)  
   .[A3] = Now
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents
   End With  
   For Each sh In arr  
   With Sheets(sh)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy Sheets(«Лист2») _
   .Range(«A» & .Rows.Count).End(xlUp).Offset(1)  
   End With  
   Next  
   Application.ScreenUpdating = True  
End Sub  

    Зачем оффсет меняли?  
.[A2] = Now тоже совершенно ни к чему, там ведь уже есть данные, т.е. в этом действии логики нет.

 

AcademiC

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

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

Уважаемые форумчане, можете еще раз по коду помочь — я правильно понимаю логику?  

  Sub tt()  
   Dim arr  

  ‘ вводим переменную «arr», которая явно не определена, т.е. с типом «variant»  

     Application.ScreenUpdating = False  

  ‘ запрещаем обновление экрана во время работы подпрограммы (sub) для ускорения выполненя  

     arr = Split(«Гор Каш Вол Нау»)  

  ‘ в справке тьма-тьмущая вариантов «split», я могу только догадываться — это какое-то явное указание листов, которые будут использоваться в данной процедуре?  

     With Sheets(«Лист2»)  

  ‘ указание одного объекта — «Лист2» над которым планируется совершать ряд операций?  

     .[A2] = Now

  ‘ Что-то типа указания ячейки А2 как ActiveCell?  

     .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents

  ‘ понимаю, что очищает данные на листе «Лист2», но логики работы не понимаю… почему начинаем очищать не с А3, а с AZ23? Почему метод «.End» с константой «xlUp»… не понимаю логики… мы считаем заполненный ячейки снизу?      

  End With  
   For Each sh In arr  

  ‘ «sh» — но ведь переменная «sh» неопределена… как это вообще работает?  

     With Sheets(sh)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy Sheets(«Лист2») _
   .Range(«A» & .Rows.Count).End(xlUp).Offset(2)  

  ‘ «Offset(2)» — свойство Range, которое задает смещение на 2 строки вниз?  

     End With  
   Next  
   Application.ScreenUpdating = True  
End Sub

 

AcademiC

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

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

{quote}{login=Hugo}{date=17.06.2012 11:40}{thema=}{post}Вот так работает  
……………….  
.[A2] = Now тоже совершенно ни к чему, там ведь уже есть данные, т.е. в этом действии логики нет.{/post}{/quote}
Hugo, огромнейшее Вам спасибо! Я бы сам это неасилил… в обозримом будущем точно… не могу вкурить я этот язык и логику…

 

Hugo

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

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

Split — это разбиваем строку в массив. По умолчанию, если не указано, то по пробелам. Получаем массив  имён листов.  
.[A2] = Now — это в ячейку A2 Sheets(«Лист2») заношу сегодняшнюю дату. Вообще не важно что туда нужно занести, но т.к. там даты — пусть будет дата :)

  .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents — всё правильно поняли.
Определяем по столбцу A последнюю заполненную ячейку — к ней идём снизу от последней строки вверх :)  
Если в столбце нет пустот — то можно и сверху идти, но надёжнее снизу (не всегда кратчайший путь верный :))  
Ну а как выделять диапазон — всё равно, я выделяю справа налево. т.к. так писать меньше (иначе нужно описать последнюю в AZ исходя от последней в A, что геморнее…)  

  «sh» не определена — да, забыл. Можете написать    
   Dim arr As Variant  
   Dim Sh As Variant  
но именно As Variant.  

  С Offset всё верно, кроме того, что нужно 1, а не 2.  
Но это непринципиально :)  

  А так логика вроде нормальная, всё просто и обоснованно :)

 

Hugo

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

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

Вернее Now — это не дата, а именно «сейчас», т.е. дата со временем. Но не суть, форматом показывает дату :)

 

AcademiC

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

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

{quote}{login=Hugo}{date=18.06.2012 12:21}{thema=}{post}А так логика вроде нормальная, всё просто и обоснованно :){/post}{/quote}  
Еще раз спасибо.  

  …осталось только понять ЧТО и главное СКОЛЬКО надо скурить, чтобы во всем этом разобраться… формулы, даже замороченные, в Excel как-то попроще давались…

 

Hugo

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

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

Мне наоборот.  
Может потому, что я не курю? :)

 

AcademiC

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

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

Hugo, можно final qustion?  

  Немного видоизменил условия сбора информации — макрос находится в другом файле в той же папке, где и файл «Отчет».  

  Методом «тыка» смог обратиться к файлу «Отчет», чтобы макрос собирал данные из него… а как указать, чтобы после сбора данных копирование происходило не в файл «Отчет, а в тот файл, в котором находится макрос (файл с макросом назвал «Сводный.xlsm»?  

  Конкретно:  

    Sub Sammary2()  
   Dim Manager_lists  
       ChDir «H:WORKОтчет»  
       Workbooks.Open Filename:=»H:WORKОтчет.xls»  
       Application.ScreenUpdating = False  
   With ActiveWorkbook  
   Manager_lists = Split(«Гор Каш Вол Нау»)  
   End With  
       With Sheets(«Сводный»)  
           .[A3] = Now
           .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents
       End With  
   For Each sh In Manager_lists  
   With Sheets(sh)  
   .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy Sheets(«Ñâîäíûé») _
   .Range(«A» & .Rows.Count).End(xlUp).Offset(1)  
   End With  
   Next  
   Application.ScreenUpdating = True  
End Sub  

    Макрос прерывается с ошибкой на 9 строке («With Sheets(«Сводный»)»), что логично, так как в файле Отчет.xls (из которого и собираем данные по листам) нет такого листа как «Сводный», этот лист находится в файле Сводный.xlsm.

 

Hugo

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

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

Вообще-то достаточно указать книгу:  

  With ThisWorkbook.Sheets(«Сводный»)  

  Но есть ещё замечания — и по открытию книги (я бы сделал иначе), и по .Rows.Count — теоретически и тут может быть брак.  
Чуть позже напишу свой вариант, как время будет.

 

Hugo

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

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

Вот вроде так может быть, без проверки:  

  Sub Sammary3()  
   Dim Manager_lists, sh, sh_sv As Worksheet  

     Manager_lists = Split(«Гор Каш Вол Нау»)    ‘получаем массив названий  
   Set sh_sv = ThisWorkbook.Sheets(«Сводный»)    ‘получаем ссылку на лист  

         Application.ScreenUpdating = False  

         With sh_sv  
       .[A3] = Now ‘подстраховка от пустого диапазона
       .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).ClearContents ‘очистка
   End With  

     ChDir «H:WORKОтчет» ‘это в общем не нужно, но и не мешает  

         With Workbooks.Open(«H:WORKОтчет.xls»)    ‘открываем файл отчёта  
       For Each sh In Manager_lists    ‘цикл по названиям листов  
           With .Sheets(sh)    ‘обращаемся к очередному листу  
               .Range(.[AZ3], .Range(«A» & .Rows.Count).End(xlUp)).Copy _
                       sh_sv.Range(«A» & sh_sv.Rows.Count).End(xlUp).Offset(1) ‘копирование  
           End With  
       Next  
       .Close 0    ‘закрываем отчёт без сохранения изменений (хотя их и не вносили)  
   End With  

     Application.ScreenUpdating = True  
End Sub  

  В этом коде нет ориентации на активную книгу/лист, что надёжнее.  
Ещё вместо Workbooks.Open можно использовать getobject() — тогда не будет ошибки, если эта книга уже открыта. Но тогда нужно подумать, что делать в конце, если она была открыта :)

 

Guest

Гость

#25

18.06.2012 12:53:13

Hugo, спасибо все работает.  

  …буду разбираться в коде и применяемых методах…

Like this post? Please share to your friends:
  • Vba excel копирование значения ячейки
  • Vba excel копирование диапазона ячеек с одного листа на другой
  • Vba excel копирование диапазона с листа на лист
  • Vba excel копирование данных с листа на лист
  • Vba excel копирование данных по условию