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

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

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

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

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

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

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

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

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

Sub Resheniye1()

Dim n1 As Long, n2 As Long, n3 As Long, n4 As Long, _

i1 As Long, gorod As Variant

n1 = Sheets(«Лист1»).Cells(1, 1).CurrentRegion.Rows.Count

  For i1 = 1 To n1

    With Sheets(«Лист1»)

      If gorod <> .Cells(i1, 1) Then

        gorod = .Cells(i1, 1)

        n2 = 1

        n3 = n3 + 1

        n4 = 1

      Else

        n2 = 2

      End If

      Do While .Cells(i1, n2) <> «»

        Sheets(«Лист2»).Cells(n3, n4) = .Cells(i1, n2)

        n4 = n4 + 1

        n2 = n2 + 1

      Loop

    End With

  Next

End Sub

Переменные:

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

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

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

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

36

37

38

39

40

41

42

43

44

45

46

47

48

49

50

51

52

53

54

55

56

57

58

59

60

‘Объявление глобальных переменных

‘в разделе Declarations

Dim massiv1 As Variant, n2 As Long, _

n3 As Long, i1 As Long, txt1 As Variant

‘Исполняемая процедура для решения

‘задания вторым способом

Sub Resheniye2()

Dim n1 As Long, gorod As Variant

With Sheets(«Лист1»).Cells(1, 1)

    massiv1 = .CurrentRegion

    n1 = .CurrentRegion.Rows.Count

    n2 = .CurrentRegion.Columns.Count

End With

n3 = 0

txt1 = «»

  For i1 = 1 To n1

    If gorod <> massiv1(i1, 1) Then

      If txt1 <> «» Then

        Call Vstavka

      End If

        gorod = massiv1(i1, 1)

        txt1 = massiv1(i1, 1)

        Call Kopirovanie

    Else

        Call Kopirovanie

    End If

    If i1 = n1 Then

        Call Vstavka

    End If

  Next

End Sub

‘Копирование данных из массива в

‘строковую переменную через разделитель

Sub Kopirovanie()

Dim i2 As Long

  For i2 = 2 To n2

    If massiv1(i1, i2) <> Empty Then

      txt1 = txt1 & «|» & massiv1(i1, i2)

    End If

  Next

End Sub

‘Обработка данных из строковой

‘переменной в дополнительных массивах и

‘вставка очередной строки на второй лист

Sub Vstavka()

Dim n4 As Long, massiv2 As Variant, _

massiv3 As Variant, i3 As Long

n3 = n3 + 1

massiv2 = Split(txt1, «|»)

n4 = UBound(massiv2)

ReDim massiv3(0 To 0, 0 To n4)

  For i3 = 0 To n4

    massiv3(0, i3) = massiv2(i3)

  Next

Sheets(«Лист2»).Range(Cells(n3, 1), _

Cells(n3, n4 + 1)).Value = massiv3

End Sub

Подпрограммы 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 программного модуля.


Задача состоит в том, чтобы скопировать определенный диапазон текущего листа, открыть другую книгу, и вставить эти скопированные данные в определенную ячейку, сохранить этот файл и закрыть. Ниже приведен код VBA.

Sub Название_Макроса()

'Выделить диапазон который необходимо скопировать
Range("A1:F52").Select
'Скопировать то, что выделено
Selection.Copy
ChDir "путь к папке где лежит файл в который необходимо скопировать"
Workbooks.Open Filename:= "Название файла, который находится в папке, путь к которой указан выше"
'Выделить начальную ячейку в которую необходимо вставить скопированные данные
Range("A6").Select
'Вставить данные
ActiveSheet.Paste
'сохранить текущую книгу
ActiveWorkbook.Save
'Закрыть книгу
ActiveWorkbook.Close
End Sub

Вариант 2: В открывшейся книге запускаем макрос, чтобы он открыл нужную нам книгу, скопировал от туда нужные нам данные и вставил в нашу открытую книгу, закрыв файл из которого эти данные были скопированы

Sub Название_Макроса2()
'Открываем файл с которого нужно скопировать данные
Workbooks.Open Filename:="C:Данные.xlsx"

'Скопировать нужный диапазон в открывшейся книге на листе 1
Workbooks("Данные.xlsx").Worksheets("Лист1").Range("A16:E16").Copy
'Активируем нужную нам книгу
Workbooks("Книга1.xlsm").Activate

'Выделяем и вставляем скопированные данные в ячейку А1
ActiveWorkbook.Worksheets("Лист1").Range("A1").Select
ActiveSheet.Paste

'Закрываем книгу откуда мы скопировали данные
Workbooks("Данные.xlsx").Close

End Sub

Еще пример — Скопировать диапазоны данных из активной открытой книги Excel нескольких листов (в нашем примере 3-х листов) в другую книгу, которая хранится в определенном месте. Данные будут вставлены как значения, плюс будут перенесены форматы ячеек.

Sub Копируем_листы_в_другую_книгу()
Dim bookconst As Workbook
Dim abook As Workbook
Set abook = ActiveWorkbook 'присваиваем перменную активной книге
Set bookconst = Workbooks.Open("C:UsersUserDesktop1.xlsx") 'присваиваем перменную книге куда необходимо копировать данные

'переходим в активную книгу откуда необходимо скопировать данные
abook.Worksheets("Лист1").Activate
Range("A1:I23").Copy 'копируем определенный диапазон листа, укажите свой диапазон
bookconst.Worksheets("Лист1").Activate 'активируем лист куда необходимо вставить данные
Range("A1:I23").Select 'встаем на ячейку А1
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'второй лист
abook.Worksheets("Лист2").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист2").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'третий лист
abook.Worksheets("Лист3").Activate
Range("A1:I23").Copy
bookconst.Worksheets("Лист3").Activate
Range("A1:I23").Select 'выделяем диапазон
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
'вставляем только форматы ячеек
Selection.PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
'сохранить текущую книгу
bookconst.Save
'Закрыть книгу
bookconst.Close
abook.Activate

End Sub

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

Спасибо за внимание.

 

sbirliko

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

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

sbi

Уважаемые форумчане!
Помогите пожалуйста с написанием макроса, который по условию переносит данные с одного листа на другой.
Более детально указано в приложенном файле.

Заранее спасибо!
С уважением,
sbirliko

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

  • Book1.xlsx (11.35 КБ)

 

KuklP

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

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

E-mail и реквизиты в профиле.

А самому что-нить сделать, хоть макрорекордером? А поиск потерзать? Уж столько напереносили по условию, неинтересно. А стол заказов в разделе Работа.

Я сам — дурнее всякого примера! …

 

МВТ

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

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

#3

07.04.2015 12:56:06

Несмотря на то, что я полностью согласен с KuklP, вот код:

Код
Sub tt()
Dim L As Long: L = 3
Application.ScreenUpdating = False
With Sheets("History_")
.Unprotect
.Range("B3:I" & Cells(Rows.Count, 2).End(xlUp)).Clear
End With
Sheets("Action-Log").Activate
For I = 3 To Cells(Rows.Count, 2).End(xlUp).Row
If Cells(I, 11) = "Выполнен" Then
Range("C" & I & ":H" & I).Copy Destination:=Sheets("History_").Range("C" & L)
Range("K" & I).Copy Destination:=Sheets("History_").Range("I" & L)
With Sheets("History_").Cells(L, 2)
    .Value = L - 2
    .Borders.LineStyle = 1
End With
L = L + 1
End If
Next I
Sheets("History_").Protect
Application.ScreenUpdating = True
End Sub



 

sbirliko

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

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

sbi

#4

07.04.2015 13:00:03

KuklP

добрый день.

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

Код
Sub Запрос()'
    Sheets("Лист2";).Select
    Range("B2";).Select
    ActiveCell.FormulaR1C1 = _
        "=IF(ISNA(VLOOKUP(RC[-1],Лист1!R1C3:R1000C6,4,0)),"""",VLOOKUP(RC[-1],Лист1!R1C3:R1000C6,4,0))"
    Range("B2";).Select
    Selection.Copy
    Range(Selection, ActiveCell.SpecialCells(xlLastCell)).Select
    ActiveSheet.Paste
    Selection.Copy
    Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
        :=False, Transpose:=False
    Range("A1";).Select
    Application.CutCopyMode = False
End Sub

и Sub Perenos()Dim iLastRow As Long
    iLastRow = Range("A8";).End(xlDown).Row
        Range("A8:F" & iLastRow).Copy _
        Sheets("База";).Range("A" & Sheets("База";).Cells(Rows.Count, 1).End(xlUp).Row + 1)
End Sub

а сделать это через макроредактор сложно, т.к. я не знаю как создать привязку к условию(то что указано в примере)

ну уж простите, если это тема уже приелась…

 

МВТ

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

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

sbirliko, не расстраивайтесь и оформите код макроса как положено (кнопка <…>). Макрос я написал по Вашим таблицам, попробуйте

 

sbirliko

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

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

sbi

МВТ

, Спасибо большое! Но, кажется ваш код написан вовсе не макроредактором….)))
И еще один момент, возможно ли удаление строк из листа Action-Log, которые были перенесены на лист History_?

 

МВТ

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

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

sbirliko, я и не говорил, что рекордером :). Да строки можно удалять, вставлять или менять: после окончания работы макроса таблицы никак друг с другом не связаны. Таблица-результат не имеет ссылок на Таблицу-источник, макрос просто снимает защиту, копирует отобранную информацию на другой лист и снова ставит защиту.  

 

KuklP

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

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

E-mail и реквизиты в профиле.

#8

07.04.2015 13:52:05

Вариант:

Код
Sub www()
    Sheets("History_").Unprotect "123"
    Sheets("History_").UsedRange.ClearContents
    With Sheets("Action-Log").Range("B2").CurrentRegion
        .AutoFilter 10, "Выполнен"
        .Copy Sheets("History_").Range("B2")
        .Parent.AutoFilterMode = 0
    End With
    Sheets("History_").Protect "123"
End Sub

Я сам — дурнее всякого примера! …

 

KuklP

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

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

E-mail и реквизиты в профиле.

#9

07.04.2015 14:08:12

Забыл. Так еще и удалит строки с исходной. И это — макрорекордером. С доработкой.

Код
Sub www()
    Sheets("History_").Unprotect "123"
    Sheets("History_").UsedRange.ClearContents
    With Sheets("Action-Log").Range("B2").CurrentRegion
        .AutoFilter 10, "Выполнен"
        .Copy Sheets("History_").Range("B2")
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .Parent.AutoFilterMode = 0
    End With
    Sheets("History_").Protect "123"
End Sub 

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

  • Book1.xlsm (17.59 КБ)

Я сам — дурнее всякого примера! …

 

МВТ

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

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

KuklP, идея с автофильтром хороша (не сообразил, честно), но там надо не все колонки переносить и нумерацию обновлять

 

sbirliko

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

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

sbi

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

возможно ли доработка макроса для добавления перенесенных данных на последнюю свободную строку в листе History_?
Т.е. необходимо видить общий объем перенесенных данных(строк) за все время…

ps-скачал книгу Мэтью Харрис по VBA, буду изучать дома, по выходным… (хотя нет инета и компа дома, хоть буду теорию знать)

 

МВТ

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

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

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

 

KuklP

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

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

E-mail и реквизиты в профиле.

МВТ, Те колонки, что не надо переносить(я не обратил внимания) можно просто скрыть на время переноса.

Я сам — дурнее всякого примера! …

 

KuklP

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

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

E-mail и реквизиты в профиле.

#14

07.04.2015 15:04:04

Так, вроде все учел:

Код
Sub www()
    Dim lr
    With Sheets("History_")
        lr = .Cells(65536, 2).End(xlUp).Row + 1
        .Unprotect "123"
        '        .UsedRange.Clear
    End With
    With Sheets("Action-Log").Range("B2").CurrentRegion
        .Columns("H:I").Hidden = -1
        .AutoFilter 10, "Выполнен"
        If lr = 2 Then
            .Copy Sheets("History_").Range("B2")
        Else
            .Offset(1).Copy Sheets("History_").Range("B" & lr)
        End If
        .Columns("H:I").Hidden = 0
        .Offset(1).SpecialCells(12).EntireRow.Delete
        .Parent.AutoFilterMode = 0
    End With
    Sheets("History_").Protect "123"
End Sub

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

  • Book1.xlsm (19.65 КБ)

Изменено: KuklP07.04.2015 15:09:45

Я сам — дурнее всякого примера! …

 

sbirliko

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

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

sbi

KuklP

и

МВТ

большое спасибо за оказанную помощь!  

 

Strizh

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

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

Отличный макрос, огромнейшее спасибо!

 

Strizh

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

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

#17

26.07.2019 16:38:04

KuklP, добрый день!
Вы не смогли бы изменить макрос таким образом, чтобы он смог переносить данные на другой лист ПОСТРОЧНО.
В моем документе я выбираю данные на листе 1 и переношу их на лист 2 с учетом даты.
По идее, макрос должен найти пустую строку и вставить туда скопированное значение.

Есть книга, в которой 10 листов. Нужно скопировать содержимое 8-го листа в 3-й лист.

Я пытался сделать это следующим способом:

Set CurrentWorkbook = ThisWorkbook
Set sheetTemp = CurrentWorkbook.Worksheets(8)

With Application: .ScreenUpdating = False: .DisplayAlerts = False: End With
With CurrentWorkbook
     sheetTemp.Copy CurrentWorkbook.Worksheets(3)
End With
With Application: .ScreenUpdating = True: .DisplayAlerts = True: End With

Все работает, но вместо записи в 3-й лист оно создает перед третьим листом новый лист. Как сделать так, чтобы при копировании не создавался новый лист и записывалось в существующий лист?

vikttur_Stop_RU_war_in_UA's user avatar

задан 21 сен 2018 в 10:35

Leksor's user avatar

2

Полное копирование столбцов (ширина, форматирование, значения, примечания…):

Sub CopyRange()
    Worksheets("Лист1").Columns("C:E").Copy
    Worksheets("Лист2").Columns("C:E").PasteSpecial
End Sub

или

Sub CopyRange()
    Worksheets("Лист1").Columns("C:E").Copy Worksheets("Лист2").Columns("C:E")
End Sub

Для копирования только нужного:

  Worksheets("Лист1").Range("C3:E50").Copy

  With Worksheets("Лист2").Range("C3")
      .PasteSpecial xlPasteColumnWidths ' ширина столбца'
      .PasteSpecial xlPasteValues' значения'
      .PasteSpecial xlPasteFormats' форматы'
      .PasteSpecial xlPasteFormulasAndNumberFormats ' формулы'
      ' .....'
  End With

После копирования очистить буфер:

Application.CutCopyMode = False

ответ дан 21 сен 2018 в 11:38

vikttur_Stop_RU_war_in_UA's user avatar

На одном листе таблица из этой таблицы нужно перенести данные для расчета в квитанции, другой лист. Например в ячейку на листе 2 фиО если на первой странице Новиков Илья Васильевич она должна отобразиться в ячейке A4 «=’1′!C5» потом сумма переработки, она относится к «=’1′!AS5», потом вычеты они относятся к «=’1′!AW5» и так далее, как вы выше писали, так и надо прописать. Все эти данные относятся к строке пять, следующий человек к строке 6 и все те же данные. Вот как макрос прописать я незнаю, пробывал у меня не получилось.

Добавлено через 11 минут
Алгоритм
На листе 2 нажимаю на ячейку A4, в этой ячейке ставлю формулу «=’1′!AW5», далее под графой «Сумма переработки» на листе 2 ставлю «=’1′!AS5», далее аналогично под графой «Вычеты»
ставлю «=’1′!AW5», далее под графой «Командировочны» ставлю «=’1′!AT5», далее на листе 2 под графой «доплата за а/м
ставлю «=’1′!BC5», далее так же на листе 2 под графой Оклад ставлю «=’1′!AQ5», далее на листе 2 под графой «Оклад» ставлю «=’1′!AQ5», далее под графой авнс на 2 листе ставлю
«=’1′!BF5», далее под графой доп.выплаты ставлю «=’1′!BC5».

С этим макросом данные копируются на другой лист, но при этом стирается 1 строка названием столбцов, и следующая вставка ячеек происходит со второй строки, надо чтобы данные вносились после последней заполненной строки, при этом оставался заголов 1 строки с названиями столбцов
[moder]
Не надо цитировать посты целиком, это нарушение Правил форума.[/moder]

С этим макросом данные копируются на другой лист, но при этом стирается 1 строка названием столбцов, и следующая вставка ячеек происходит со второй строки, надо чтобы данные вносились после последней заполненной строки, при этом оставался заголов 1 строки с названиями столбцов
[moder]
Не надо цитировать посты целиком, это нарушение Правил форума.[/moder] Controler

Сообщение цитата удалена

С этим макросом данные копируются на другой лист, но при этом стирается 1 строка названием столбцов, и следующая вставка ячеек происходит со второй строки, надо чтобы данные вносились после последней заполненной строки, при этом оставался заголов 1 строки с названиями столбцов
[moder]
Не надо цитировать посты целиком, это нарушение Правил форума.[/moder] Автор — Controler
Дата добавления — 14.03.2016 в 08:56

Источник

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). И самое главное — вторая книга заполняется с нарастающим итогом. Т.е с первой книги берутся данные, вносятся во вторую, потом первая заполняется по новой, эти данные вносятся во вторую, но уже ниже и т.д.
Но, в любом случае, огромное спасибо, Вы дали направление, куда двигаться, буду думать ):

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

Источник

Метод 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 и обратная связь.

Источник

5 различных методов переноса данных с одного листа Excel на другой

Как мы все знаем, Microsoft Excel – очень полезная и популярная рабочая книга, которую пользователи могут хранить любые важные данные.

В Microsoft Excel пользователи могут выполнять несколько различных типов задач, таких как автоматически переносить данные с одного листа Excel на другой, обновлять один лист Excel с другого листа , копировать данные с одного листа на другой в Excel и т. д. для удобства.

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

Итак, просто внимательно просмотрите этот блог.

Практический сценарий

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

У меня есть рабочая тетрадь с 6 листами внутри; один из листов – мастер; это просто остальные 6 листов, составленные в один большой. Мне нужно настроить его так, чтобы любые новые данные, введенные в новые отдельные листы, автоматически вводились в мастер-лист в первой пустой строке.

Столбцы не одинаковы на всех листах. . Надеюсь, здесь профи будет легче, чем мне, в этом я бился головой о стену. Я буду тщательно проверять эту ветку, поэтому, если вам понадобится дополнительная информация, просто дайте мне знать …

Заранее благодарим за любую помощь.

Источник: https://ccm.net/forum/affich-1019001-automatically-update-master-worksheet-from- другие рабочие листы

Методы передачи данных из одной книги Excel в другую

Существует множество различных способов переноса данных из одной книги Excel в другую , и они следующие:

Метод № 1: автоматически Обновление одного листа Excel с другого листа

В книге MS Excel мы можем легко обновить данные, связав один лист с другим. Эта ссылка известна как динамическая формула, которая автоматически передает данные из одной книги Excel в другую .

Одна книга Excel называется источником рабочий лист , где эта ссылка автоматически переносит данные рабочего листа, а другая книга называется целевым листом , в котором он автоматически обновляет данные рабочего листа и содержит формулу связи.

Ниже приведены две разные точки для связывания Excel. данные книги для автоматических обновлений.

1) С использованием функции копирования и вставки

  • В исходный лист, выберите и скопируйте данные, которые вы хотите связать на другом листе.
  • Теперь на целевом листе Вставьте данные, к которым вы связали исходный лист ячейки.
  • После этого выберите меню Вставить ссылку из Другие параметры вставки в книге Excel

  • Сохраните всю свою работу из исходного рабочего листа перед его закрытием.

2) Введите формулу вручную

  • Откройте целевой рабочий лист, коснитесь ячейки, в которой есть формула связи, и поместите знак равенства (=) поперек нее.
  • Теперь перейдите к источник ш eet и коснитесь ячейки, в которой есть данные. нажмите Enter на клавиатуре и сохраните свои задачи.

Примечание- Всегда помните одну вещь, что формат исходного рабочего листа и конечный рабочий лист одинаковы.

Метод № 2: обновить электронную таблицу Excel данными из другой электронной таблицы

Чтобы обновить электронные таблицы Excel данными из другой электронной таблицы, просто следуйте приведенным ниже пунктам, которые будут применимы к версии Excel 2019, 2016, 2013, 2010, 2007.

  • Сначала перейдите в меню Данные .
  • Выберите параметр Обновить все

  • Здесь вы должны увидеть, когда и как обновляется соединение
  • Теперь щелкните любую ячейку, содержащую подключенные данные.
  • Снова в меню Данные , cli ck на стрелке рядом с параметром Обновить все и выберите Свойства соединения

  • После этого в меню Использование установите параметры которые вы хотите изменить.
  • На вкладке Использование установите любые параметры, которые вы хотите изменить.

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

Метод № 3: Как автоматически скопировать данные из одной ячейки в другую в Excel

Чтобы скопировать данные из одной ячейки в другую в Excel, просто выполните следующие пункты, указанные ниже:

  • Сначала откройте исходный рабочий лист и целевой рабочий лист.
  • На исходном листе перейдите к листу, который вы хотите переместить или скопировать.
  • Теперь нажмите меню Главная и выберите параметр Формат .
  • Затем выберите «Переместить или скопировать лист» в разделе «Организовать листы».
  • После этого снова в в меню Главная выберите параметр Формат в группе ячеек.
  • Здесь в Переместить или скопировать выберите целевой лист, и Excel отобразит только открытые листы в списке.

  • Иначе, если вы хотите скопировать рабочий лист вместо перемещения, сделайте копию книги Excel перед

  • Наконец, нажмите ОК кнопку, чтобы скопировать или переместить целевую электронную таблицу Excel.

Метод № 4: Как скопировать данные с одного листа на другой в Excel с помощью формулы

Вы можете копировать данные с одного листа на другой в Excel с помощью формулы . Вот шаги, которые необходимо выполнить:

  • Для копирования и вставки ячейки Excel в текущий рабочий лист Excel, , например; скопируйте ячейку От A1 до D5, вы можете просто выбрать целевую ячейку D5, затем ввести = A1 и нажать клавишу Enter, чтобы получить значение A1.
  • Для копирования и вставки ячеек с одного рабочего листа на другой, например скопируйте ячейку A1 листа Sheet1 в ячейку D5 листа Sheet2, выберите ячейку D5 на листе Sheet2, затем введите = Sheet1! A1 и нажмите клавишу Enter, чтобы получить значение.

Метод № 5: копирование данных с одного листа на другой в Excel с помощью макросов

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

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

Sub OpenWorkbook ()
‘Открыть книгу
‘Метод открытия требует ссылки на полный путь к файлу.
Workbooks.Open «C: Users username Documents New Data.xlsx»

‘ Метод открытия имеет дополнительные параметры
‘Workbooks.Open (FileName, UpdateLinks, ReadOnly, Format, Password, WriteResPassword, IgnoreReadOnlyRecommended, Origin, Delimiter, Editable, Notify, Converter, AddToMru, Local, CorruptLoad)

Sub CloseWorkbook ()
‘Закройте книгу
Workbooks («New Data.xlsx»). Close SaveChanges: = True
‘Метод Close имеет дополнительные параметры
‘ Workbooks.Close (SaveChanges, Filename, RouteWorkbook)

Рекомендуемое решение: средство восстановления и восстановления MS Excel

Когда вы выполняете свою работу в MS Excel и по ошибке или случайно делаете это не сохранять данные книги, иначе ваш рабочий лист будет удален, тогда у нас есть для вас профессиональный инструмент восстановления, например MS Excel Repair & Recovery Tool .

С С помощью этого инструмента вы также можете легко восстановить все потерянные данные или поврежденные файлы Excel. Это очень полезное программное обеспечение, позволяющее с легкостью возвращать все типы файлов MS Excel .

Шаги по использованию средства восстановления и восстановления MS Excel:

Заключение:

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

Я надеюсь, что вы удовлетворены приведенными выше методами, предоставленными вам по обновлению листа Excel .

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

Маргрет

Маргрет Артур – предприниматель и эксперт по контент-маркетингу. Она ведет технические блоги и специализируется на MS Office, Excel и других технических вопросах. Ее отличительное искусство подачи технической информации простым для понимания языком очень впечатляет. Когда не пишет, она любит незапланированные путешествия.

MicroKnowledge, Inc.

Excel имеет отличный, недостаточно используемый способ извлечения данных из мастер-листа и записи подмножеств этих данных на других листах. Таким образом, Excel может действовать как функциональная база данных с помощью компонента под названием Microsoft Query.

Предположим, у меня есть сводная таблица всех вопросов технической поддержки, заданных в 2013 году, со столбцом под названием Назначено Кому.

Теперь мне нужны три отдельных листа, по одному для каждого представителя службы поддержки в столбце« Кому назначено », которые будут содержать только билеты службы поддержки этого человека. Но в дополнение к этому мне нужно следующее, чтобы быть возможно:

  • Новые данные, добавленные в основной лист, будут автоматически заполняться на соответствующих подмножествах листов.
  • Мастер-лист можно сортировать и фильтровать сам по себе, не затрагивая подмножества листов.
  • Функции и диаграммы, анализирующие данные на любом листе, должны автоматически подстраиваться под новые данные.

Звучит сложно? Это не так!

Приведенные ниже шаги объясняют, как настроить это с помощью Excel 2007 или более поздней версии.

(Эта функция также доступна в предыдущих версиях Excel. )

  1. Создайте все нужные листы в книге. Здесь я создал лист для каждого представителя службы поддержки.
  2. Создайте именованный диапазон для своей главной таблицы. Выделите данные в своей таблице (включая заголовки), введите e введите имя диапазона в поле имени слева от строки формул, затем нажмите Enter. Именованный диапазон необходим Microsoft Query для выбора данных для анализа.
  3. Создайте таблицу из вашей главной таблицы. Выделите свои данные, как описано выше. Откройте вкладку Вставить . Щелкните Таблица . Этот шаг немного избыточен, но преобразование ваших данных в таблицу имеет массу преимуществ, главное из которых состоит в том, что при добавлении в нее новых данных она автоматически расширяется для сбора новых данных. В свою очередь, это также автоматически расширит ваш именованный диапазон.
  4. Перейдите на лист, на который вы хотите поместить результаты запроса. Это может быть другой рабочий лист или даже другая книга.
  5. Щелкните вкладку Данные . Нажмите Из других источников . Выберите Из Microsoft Query . Откроется окно Выбрать источник данных .
  6. Выберите файлы Excel. Нажмите ОК . Откроется окно Выбрать книгу .
  7. Найдите и выберите книгу для запроса. Обратите внимание, что это может быть та же книга, что и открытая в данный момент. Нажмите ОК . Отображается Мастер запросов .
  8. Должны появиться ваши именованные диапазоны в левой части окна в виде таблицы. Я выберу все столбцы слева, чтобы показать их на листах подмножества. Щелкните Далее .
  9. На шаге мастера «Фильтровать данные» выберите фильтрацию данных, которые вы хотите отобразить на этом листе. Здесь я делаю лист Джерри, поэтому мне нужны только данные, где Назначено равно Джерри. Нажмите Далее .
  10. Выполните оставшиеся шаги в мастера, пока вы не будете готовы выбрать место назначения для ваших данных. В диалоговом окне Импорт данных убедитесь, что Таблица выбрана в качестве способа вставки ваших данных.. Я решил вставить данные в A1 на листе Джерри.
  11. Поскольку вы вставили данные в качестве таблицы у вас есть особая возможность Обновить, если вы вносите какие-либо изменения в основную таблицу. Вы можете найти Обновить на вкладке «Данные» или на вкладке «Работа с таблицами» Дизайн .

Вам понадобится повторить шаги 4–11 для каждого имеющегося у вас подмножества листов. Но как только все это настроено, у вас есть небольшая симпатичная база данных Excel!

Источник

Читайте также:  Как настроить тон на рации baofeng uv 5r

Adblock
detector

У меня есть книга Excel с 4 листами.

  1. Мастер лист
  2. test_1
  3. test_2
  4. test_3

Я хочу переместить данные из мастер-листа на все остальные листы, что я и сделал, создав макрос. Ежедневно данные мастер-листа будут увеличиваться, так как я могу учесть это изменение в макросе.

Я вставил свой существующий код ниже:

Sub sbCopyRangeToAnotherSheet()
    Sheets("Master").Range("B10:M1628").Copy
    Sheets("test_1").Activate
    Range("B9").Select
    ActiveSheet.Paste
    Application.CutCopyMode = Flase
End Sub


Sub sbCopyRangeToCRP2()
    Sheets("Master").Range("B10:M1628").Copy
    Sheets("test_2").Activate
    Range("B9").Select
    ActiveSheet.Paste
    Application.CutCopyMode = Flase
End Sub


Sub sbCopyRangeToCRP3()
    Sheets("Master").Range("B10:M1628").Copy
    Sheets("test_3").Activate
    Range("B9").Select
    ActiveSheet.Paste
    Application.CutCopyMode = Flase
End Sub

В приведенном выше коде я упомянул жестко закодированное значение диапазона мастер-листа, которое начинается с B10 и заканчивается на M1628.

В дальнейшем количество строк увеличивается **(диапазон B10 останется)** и я не хочу жестко кодировать диапазон. Как я могу сделать это?

2017-03-14 08:10

4

ответа

Решение

Я предлагаю объединить эти 3 подпрограммы в одну, которую вы можете использовать повторно, указав рабочий лист в качестве параметра:

Sub sbCopyRangeToAnotherSheet(ToSheet As Worksheet)
    Dim LastUsedRow As Long

    With Sheets("Master")
        LastUsedRow = .UsedRange.Row + .UsedRange.Rows.Count - 1
        .Range("B10:M" & LastUsedRow).Copy ToSheet.Range("B9")
    End With

    Application.CutCopyMode = False
End Sub

Затем вы можете запустить этот саб для любого имени листа, как

Sub test_1()
    sbCopyRangeToAnotherSheet Sheets("test_1")
    'and for the second sheet
    sbCopyRangeToAnotherSheet Sheets("test_2")
End Sub

2017-03-14 08:33

Я бы предложил либо использовать UsedRange свойство объекта Worksheet,

или определить именованные диапазоны на листе, которые автоматически расширяются по мере роста данных на листе, например: =OFFSET($A$1,0,0,COUNTA($A:$A),1)

2017-03-14 08:15

Вы можете использовать этот макрос

Sub CopyAll()
    Dim src As Range, dest
    With Worksheets("Master") ' set the source range
        Set src = .Range("B10:M" & .Cells(.Rows.Count, "B").End(xlUp).Row)
    End With
    For Each dest In Array("test_1", "test_2", "test_3") ' loop on destination sheets
        src.Copy Worksheets(dest).Range("B9")
    Next
End Sub

2017-03-14 08:41

Я думаю, что самый простой способ скопировать данные — это использовать массив, который заполнен динамически.

  1. Создать точный массив
  2. Заполните данные из мастер-листа
  3. Вставьте данные.

И в этом случае вам не нужно беспокоиться о новой строке, потому что вы используете динамический массив. Смотрите пример ниже.

Sub sbCopyRangeToAnotherSheet()
Sheets("Master").Select
Dim RowNum as integer 
For i = 0 To 250000 'Count all rows
    If IsEmpty(Cells(i + 10, 2)) = False Then
        RowNum = RowNum + 1 'Count all rows which have data in it's second column
    Else
        Exit For
    End If
Next
ReDim myData(RowNum - 1, 12) As String 'create array
For i = 0 To RowNum - 1 'fill array, with data
    For j = 0 to 12
    myData(i, j) = Cells(i + 10, j+2) '+10 because you said B**10**
                                      '+2 because you said **B**10
    Next
Next

Sheets("test_1").Activate
For i = 0 To RowNum - 1 'fill array, with data
    For j = 0 to 12
    Cells(i + 10, j+2) = myData(i, j) 'Fill cells with data
    Next
Next
End Sub

2017-03-14 08:38

How to copy and paste data using a Macro in Excel. I’ll show you multiple ways to do this, including across worksheets and workbooks.

Sections:

Simple Copy/Paste

Copy Entire Range

Copy between Worksheets

Copy between Workbooks

Notes

Simple Copy/Paste

Range("A1").Copy Range("B1")

This copies cell A1 to cell B1.

Range(«A1»).Copy is the part that copies the cell.

Range(«B1») is the cell where the data will be copied.

This is a simple one line piece of code and it’s very easy to use.

Notice that there is a space between these two parts of the code.

Copy Entire Range

Range("A1:A5").Copy Range("B1:B5")

Range(«A1:A5»).Copy is the part that copies the range.

Range(«B1:B5») is the range where the data will be copied.

You can also write it like this:

Range("A1:A5").Copy Range("B1")

Notice that the range to where you will copy the data has only a reference to cell B1.

You only have to reference the very first cell to which the range will be copied and the entire range will copy in the cells below there.

NOTE: if you do it like this, you may end up overwriting data and Excel will not give you a warning about this; the data will simply be filled down as far as it needs to go to copy the first range.

Copy between Worksheets

Sheets("Sheet1").Range("A1").Copy Sheets("Sheet2").Range("B1")

This follows the same pattern as the above examples except that we need to tell the macro from which sheet we want to get the data and to which sheet we want to copy the data.

Sheets(«Sheet1»). is placed in front of the first range and that means to get the data from Sheet1, which is the name of a worksheet in the workbook.

Sheets(«Sheet2»). is placed in front of the range to which we want to copy the data and Sheet2 is the name of the worksheet where the data will be copied.

Copy between Workbooks

Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet1").Range("A1").Copy Workbooks("Copy and Paste Data using Macro VBA in Excel.xlsm").Sheets("Sheet3").Range("A1")

Here, we follow the above examples and, this time, add a reference to the workbooks from which we want to get the data and to which we want to place the data.

Workbooks(«Copy and Paste Data using Macro VBA in Excel.xlsm»). is the code that says in which workbook we want to place the data. Copy and Paste Data using Macro VBA in Excel.xlsm is the name of the workbook. In this example I used this for both parts, the workbook from which the data comes and where it goes. This allows you to run this macro within a single workbook and still show you how it works. In a real-world example, the first part contains the name of the workbook where you get the data from and the second contains the name of the workbook where you want to place the data.

Read this tutorial to copy values from another workbook, even if it’s closed.

Notes

All examples in the attached workbook have been commented out. Simply remove the single quote from the line of code you want to test and then run the macro.

cf5e0ebf6d62c9ec73df03c55f727e77.jpg

Download the attached file to get these examples in Excel.

Similar Content on TeachExcel

Activate or Navigate to a Worksheet using Macros VBA in Excel

Tutorial: Make a particular worksheet visible using a macro in Excel.
This is called activating a wo…

Get the Name of a Worksheet in Macros VBA in Excel

Tutorial: How to get the name of a worksheet in Excel using VBA and Macros and also how to store tha…

Get the Last Row using VBA in Excel

Tutorial:
(file used in the video above)
How to find the last row of data using a Macro/VBA in Exce…

Remove Dashed Lines from Copy Paste VBA in Excel

Tutorial: How to remove the flashing dashes from a copy/paste range using VBA in Excel; this removes…

Copy one range and paste in another range

Tutorial: Below is a macro, just copy and paste it into a module in your workbook and go from there…

Guide to Combine and Consolidate Data in Excel

Tutorial: Guide to combining and consolidating data in Excel. This includes consolidating data from …

Subscribe for Weekly Tutorials

BONUS: subscribe now to download our Top Tutorials Ebook!

Like this post? Please share to your friends:
  • Vba excel перенос в одной ячейке
  • Vba excel перевернуть массив
  • Vba excel перенести текст в ячейке
  • Vba excel перебрать все файлы в папке
  • Vba excel перемещение ячеек