Макрос excel перенос значений

 

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 с учетом даты.
По идее, макрос должен найти пустую строку и вставить туда скопированное значение.

0 / 0 / 0

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

Сообщений: 99

1

Excel

Макрос для копирования информации с одного листа на другой по определенным условиям

31.05.2019, 13:30. Показов 44377. Ответов 23


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

Доброго времени суток, Гуру excel!!!

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

Файл с примером прилагаю в нем все цветами выделено что копировать и куда вставлять.

заранее спасибо!!!



0



370 / 268 / 93

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

Сообщений: 990

31.05.2019, 13:31

2

А файл не приложили )



0



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 13:32

 [ТС]

3

ArtNord, сейчас минутку

вот файл



0



370 / 268 / 93

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

Сообщений: 990

31.05.2019, 13:43

4

Да, вижу, а что куда и по какому условию.
Все увидел внизу



0



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 13:45

 [ТС]

5

то что желтым выделено это условия, а синим это нужно перенести на лист 2



0



370 / 268 / 93

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

Сообщений: 990

31.05.2019, 14:07

6

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

Решение

Проверьте



1



370 / 268 / 93

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

Сообщений: 990

31.05.2019, 14:08

7

Александр_80, проверьте



0



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 14:21

 [ТС]

8

ArtNord, ДА ВСЕ РАБОТАЕТ ЭТО ПРОСТО МАГИЯ КАКАЯ ТО , ВОТ ТОЛЬКО Я ЗАБЫЛ УКАЗАТЬ НА КОЛОНКУ ДЮЙМЫ, МОЖНО ИХ ТОЖЕ КОПИРОВАТЬ? ПО ТЕМ ЖЕ УСЛОВИЯМ



0



370 / 268 / 93

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

Сообщений: 990

31.05.2019, 14:25

9

Добавил



1



Александр_80

0 / 0 / 0

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

Сообщений: 99

31.05.2019, 14:46

 [ТС]

10

ArtNord, Вы просто супер!!!! Спасибо огромное вам!!!!! Еще одна просьба, вы не могли бы разъяснить по вашему макросу, что какая команда делает?

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Sub Копирование()
AllRecs = Application.WorksheetFunction.CountA(Sheets("1").Range("B:B"))
cAllRecs = Application.WorksheetFunction.CountA(Sheets("2").Range("B:B"))
    For CurRec = 2 To AllRecs
    AllCrit = Sheets("1").Cells(CurRec, 2) & "_" & Sheets("1").Cells(CurRec, 3) & "_" & Sheets("1").Cells(CurRec, 8)
 
        For cRecs = 2 To cAllRecs
            CheckKrit = Sheets("2").Cells(cRecs, 2) & "_" & Sheets("2").Cells(cRecs, 3) & "_" & Sheets("2").Cells(cRecs, 19)
            If AllCrit = CheckKrit Then
            Sheets("2").Cells(cRecs, 27) = Sheets("1").Cells(CurRec, 11)
            Sheets("2").Cells(cRecs, 17) = Sheets("1").Cells(CurRec, 12)
            Sheets("2").Cells(cRecs, 18) = Sheets("1").Cells(CurRec, 13)
            Sheets("2").Cells(cRecs, 30) = Sheets("1").Cells(CurRec, 27)
            Sheets("2").Cells(cRecs, 29) = Sheets("1").Cells(CurRec, 30)
            Sheets("2").Cells(cRecs, 28) = Sheets("1").Cells(CurRec, 6)
            End If
        Next cRecs
    Next CurRec
End Sub



0



ArtNord

370 / 268 / 93

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

Сообщений: 990

31.05.2019, 14:57

11

Спасибо за оценку!

Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
Sub Копирование()
AllRecs = Application.WorksheetFunction.CountA(Sheets("1").Range("B:B")) ' Получение количества строк на листе 1 (подсчет значений в столбце B)
cAllRecs = Application.WorksheetFunction.CountA(Sheets("2").Range("B:B")) 'Аналогично для листа 2
For CurRec = 2 To AllRecs ' Начало цикла для Листа 1
AllCrit = Sheets("1").Cells(CurRec, 2) & "_" & Sheets("1").Cells(CurRec, 3) & "_" & Sheets("1").Cells(CurRec, 8) ' объединение 'всех критериев на Листе 1 в одну переменную
' Теперь эту "сумму критериев" ищем в Листе 2
For cRecs = 2 To cAllRecs ' Начало цикла для Листа 2
'Пробегаемся циклом по всем строкам Листа 2 сверяя сумму критериев на каждой строке с имеющейся суммой критериев
CheckKrit = Sheets("2").Cells(cRecs, 2) & "_" & Sheets("2").Cells(cRecs, 3) & "_" & Sheets("2").Cells(cRecs, 19) '  объединение 'всех критериев на Листе 2 в одну переменную
If AllCrit = CheckKrit Then 'сверка критериев если Они равны то:
'в этой строке указанным ячейкам присвоить значения из листа 1
Sheets("2").Cells(cRecs, 27) = Sheets("1").Cells(CurRec, 11) 
Sheets("2").Cells(cRecs, 17) = Sheets("1").Cells(CurRec, 12)
Sheets("2").Cells(cRecs, 18) = Sheets("1").Cells(CurRec, 13)
Sheets("2").Cells(cRecs, 30) = Sheets("1").Cells(CurRec, 27)
Sheets("2").Cells(cRecs, 29) = Sheets("1").Cells(CurRec, 30)
Sheets("2").Cells(cRecs, 28) = Sheets("1").Cells(CurRec, 6)
End If 'конец условия
Next cRecs 'следующая строка на Листе2
'После  окончания проверки на Листе 2 возвращаемся на Лист 1 за следующей суммой критериев:
Next CurRec
End Sub



1



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 15:01

 [ТС]

12

ArtNord, вам спасибо за помощь!!! на самом деле в этой таблице более 50000 строк и она с каждым днем становится больше. Макрос будет работать на все эти строки?



0



ArtNord

370 / 268 / 93

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

Сообщений: 990

31.05.2019, 15:01

13

Visual Basic
1
2
3
4
Next CurRec
'Здесь можно добавить вывод сообщения об окончании работы макроса:
msgbox("Готово!")
End Sub

Да, вот эта строчка как раз и опреляет сколько сейчас записей:

Visual Basic
1
cAllRecs = Application.WorksheetFunction.CountA(Sheets("2").Range("B:B"))



1



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 15:04

 [ТС]

14

ArtNord, а если копировать нужно не на лист 2 а на другой лист который находится в другой книге, что нужно сделать?



0



ArtNord

370 / 268 / 93

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

Сообщений: 990

31.05.2019, 15:06

15

Если книга эта открыта то:

Visual Basic
1
Workbooks("Название книги.xls").Sheets("Название листа").Cells(cRecs, 27) = Sheets("1").Cells(CurRec, 11)



0



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 15:12

 [ТС]

16

простите меня я такой овощь в этом деле, я не пойму куда мне нужно эту строчку вставить?



0



ArtNord

370 / 268 / 93

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

Сообщений: 990

31.05.2019, 15:15

17

Где присваиваете значения:
В каждой строке вида:

Visual Basic
1
Sheets("2").Cells(cRecs, 27) = Sheets("1").Cells(CurRec, 11)

Заменить на:

Visual Basic
1
Workbooks("Название книги.xls").Sheets("Название листа").Cells(cRecs, 27) = Sheets("1").Cells(CurRec, 11)

Добавлено через 1 минуту

Visual Basic
1
2
3
4
5
Workbooks("Название книги.xls").Sheets("Название листа").Cells(cRecs, 27) = Sheets("1").Cells(CurRec, 11) 
Workbooks("Название книги.xls").Sheets("Название листа").Cells(cRecs, 17) = Sheets("1").Cells(CurRec, 12)
Workbooks("Название книги.xls").Sheets("Название листа").Cells(cRecs, 18) = Sheets("1").Cells(CurRec, 13)
Workbooks("Название книги.xls").Sheets("Название листа").Cells(cRecs, 30) = Sheets("1").Cells(CurRec, 27)
Workbooks("Название книги.xls").Sheets("Название листа").Cells(cRecs, 28) = Sheets("1").Cells(CurRec, 6)



0



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 15:16

 [ТС]

18

ArtNord, Вы просто супер!!!! Я если честно даже не ожидал, что мне так сразу тут помогут!!! Дай вам бог здоровья!!!



0



370 / 268 / 93

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

Сообщений: 990

31.05.2019, 15:17

19

Спасибо! Взаимно! Просто коротаю время до конца рабочего дня ))))



1



0 / 0 / 0

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

Сообщений: 99

31.05.2019, 15:23

 [ТС]

20

ArtNord, нет не просто коротаете, вы людям помогаете!!!! Еще раз огромное спасибо ВАМ!!!!

Добавлено через 4 минуты
ArtNord, вы не подскажете, можно самому так научиться макросы писать, если да то где?



0



IT_Exp

Эксперт

87844 / 49110 / 22898

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

Сообщений: 92,604

31.05.2019, 15:23

20

Перенос данных по условию в excel используя макрос

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

Так и в моем случае, мне понадобилось еженедельно отслеживать позиции своего сайта planero.ru по определенным ключевым словам. И если съем позиций сайта в выдаче Яндекса я осуществляю с помощью небезызвестного Key Collector в автоматическом режиме, результатом работы которого получается экселевский файл следующего вида:

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

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

форма выбора данных

выбор файла экспорта кей коллектора и даты съема

После напишем процедуру вызова UserForm1 на листе «Статьи» при нажатии на соответствующую кнопку. Процедура должна автоматически предоставлять данные по всем открытым книгам Эксель, записывать текущую дату и выравнивать форму по центру экрана. Код процедуры выглядит следующим образом:

Теперь при нажатии на кнопку «Заполнить …» появится форма:

Теперь напишем макрос для кнопки «Ок» UserForm1 проверяющий правильность выбора файла excel, т.е. наличия в нем необходимых ключевых фраз и в случае некорректного выбора, информирование пользователя с последующим выбором другого файла.

‘ процедура кнопки «Ok» UserForm1
Private Sub CommandButton1_Click()
‘ скрываем Label3 (информацию об ошибке)
UserForm1.Label3.Visible = False

И наконец, реализуем самую главную функцию fpoz , которая будет осуществлять сравнение данных двух таблиц, заполнение необходимых строк и выделение цветом соответствующих ячеек. Вкратце сам принцип работы функции выглядит следующим образом:

  1. Ищем в шапке таблицы выбранную дату.
  2. Добавляем новый столбец c его соответствующим форматированием (в случае если даты выбранной в UserForm1 нет в шапке таблицы).
  3. Записываем продвигаемые фразы из нашей таблицы в массив.
  4. Находим в файле key collector’а столбец с наименованием «Фраза» и столбце с наименованием «Позиция [Ya]».
  5. Записываем ключевые слова из файла key collector’а и столбцов «Фраза», «Позиция[Ya]» в соответствующие массивы.
  6. Сравниваем массивы между собой и при совпадении – записываем значение позиции в соответствующую ячейку нашей таблицы, при этом, в случае если предыдущее значение было больше текущего (позиция поднялась) – выделяем его зеленым. И, наоборот, при ухудшении позиции (просела) – красным.

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

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

Знайка, самый умный эксперт в Цветочном городе

Мнение эксперта

Знайка, самый умный эксперт в Цветочном городе

Если у вас есть вопросы, задавайте их мне!

Задать вопрос эксперту

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

Visual Basic для приложений (VBA) — очень мощный инструмент, который можно использовать для автоматизации большой работы между несколькими приложениями Microsoft Office. Одним из распространенных действий, которые вы можете автоматизировать с помощью VBA, является вставка таблицы Excel в документ Word.
Некорректная работа функции ВПР

Как выгружать таблицы из 1С в Excel: выгрузка с 1C в Эксель, скопировать и перенести данные, документы, отчеты, файлы

Запись: Если вы не видите разработчик в меню Excel, затем добавьте его. Выбрать файл, Опции, Настроить лентуи выберите Все команды из выпадающего списка слева. Тогда двигайся разработчик от левой панели вправо и выберите OK, чтобы закончить.

Макрос на VBA Excel – Формируем документы по шаблону | — IT-блог для начинающих

Я пишу макрос Excel (Excel 2016) для копирования данных между листами. Вместо того чтобы использовать типичную команду Range (например, Sheet2.Range(A1:A15).Value = Sheet1.Диапазон(A1:A15).Значение) Я хочу использовать именованные диапазоны для столбцов, на случай, если я когда-нибудь вставлю.

Знайка, самый умный эксперт в Цветочном городе

Мнение эксперта

Знайка, самый умный эксперт в Цветочном городе

Если у вас есть вопросы, задавайте их мне!

Задать вопрос эксперту

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

И наконец, реализуем самую главную функцию fpoz , которая будет осуществлять сравнение данных двух таблиц, заполнение необходимых строк и выделение цветом соответствующих ячеек. Вкратце сам принцип работы функции выглядит следующим образом:

Как Перенести Данные из Одного Файла Excel в Другой Файл Excel Vba. Похожие вопросы | 📝Справочник по Excel

  • Создайте столбец даты в столбце F, который равен =TRUNC(A2), и скопируйте таблицу вниз.
  • В M1 есть дата ввода — например, 2015/01/25
  • В колонке L перечислите всех уникальных сотрудников IDs
  • Ниже даты в M используйте формулу SUMIFS и форматирование времени, чтобы определить, сколько часов потратил каждый человек. В M3, например, =SUMIFS($A:$A,$D:$D,$L2,$C:$C,»Exit»,$F:$F,$M$1) — SUMIFS($A:$A,$D:$D,$L2,$C:$C,»Entry»,$F:$F,$M$1) , затем форматирование как hh:mm:ss .
  • В столбце N используйте =M2

Есть два способа сделать это. Первый — это автоматическое копирование и вставка существующего диапазона из Excel в новую таблицу в документе Word. Второй — выполнение расчетов в Excel, создание новой таблицы в Word и запись результатов в таблицу.

Функция ВПР (VLOOKUP) в Excel: пошаговая инструкция с примерами

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

Знайка, самый умный эксперт в Цветочном городе

Мнение эксперта

Знайка, самый умный эксперт в Цветочном городе

Если у вас есть вопросы, задавайте их мне!

Задать вопрос эксперту

И если съем позиций сайта в выдаче Яндекса я осуществляю с помощью небезызвестного Key Collector в автоматическом режиме, результатом работы которого получается экселевский файл следующего вида. Если же вы хотите что-то уточнить, я с радостью помогу!

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

Как вставить таблицу Excel в Word с помощью VBA — Технологии и программы

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

Перенос данных по условию в excel используя макрос

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

Так и в моем случае, мне понадобилось еженедельно отслеживать позиции своего сайта planero.ru по определенным ключевым словам. И если съем позиций сайта в выдаче Яндекса я осуществляю с помощью небезызвестного Key Collector в автоматическом режиме, результатом работы которого получается экселевский файл следующего вида:

съем позиций через key collector

Результат key collerctor’а

В общем, результат работы key collector’а представляет из себя массив данных, который не дает конкретного представления о ситуации в целом. Картину целиком можно увидеть в другой таблице, уже созданной мной, где отражена сама статья с ее продвигаемыми ключевыми словами и позиции, на которых находится мой сайт на дату «02.06.2020». На итог необходимо, при нажатии на кнопку «Заполнить позиции страниц в выдаче», автоматически перенести данные из таблицы key collector’а в мою таблицу, напротив соответствующих ключей, при этом нужно добавить новый столбец с датой съема позиций, а также выделить цветом позиции, которые просели (красным), либо наоборот поднялись (зеленым).

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

статьи с ключевыми словами

наглядное представление позиций ключевых слов

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

форма выбора данных

выбор файла экспорта кей коллектора и даты съема

После напишем процедуру вызова UserForm1 на листе «Статьи» при нажатии на соответствующую кнопку. Процедура должна автоматически предоставлять данные по всем открытым книгам Эксель, записывать текущую дату и выравнивать форму по центру экрана. Код процедуры выглядит следующим образом:


Private Sub Worksheet_SelectionChange(ByVal Target As Range)
' показать UserForm1 прин нажатии на кнопку "Заполнить позиции страниц в выдаче"
If ActiveCell.Column = 9 And Cells(ActiveCell.Row, ActiveCell.Column).Value = "Заполнить позиции страниц в выдаче" And ActiveCell.Row = 2 Then
' ищем все открытые книги экселя
Dim wb As Workbook
For Each wb In Workbooks
With UserForm1.ComboBox1
.AddItem wb.Name' добавляем наименование книги экселя в ComboBox1
End With
Next
' выбираем последнюю найденную книгу в ComboBox1
UserForm1.ComboBox1.ListIndex = UserForm1.ComboBox1.ListCount - 1
' размещаем UserForm1 по центру экрана как по вертикали так и по горизонтали
UserForm1.Left = maxWidth / 2
UserForm1.Left = maxHeight / 2
' автоматически добавляем текущую дату в TextBox1 (т.к. раз нажали сегодня эту кнопку, соответственно и съем позиций был также сегодня. Поэтому зачем лишний раз пользователю лишний раз тратить свое драгоценное время даже на ввод текущей даты?)
UserForm1.TextBox1.Value = Format(Date, "dd.mm.yyyy")
' отображаем UserForm1
UserForm1.Show
' перемещаем курсор на A1 с кнопки
Workbooks("GTD planero.ru.xlsm").Worksheets("Статьи").Range("A1").Select
End If
End Sub

Теперь при нажатии на кнопку «Заполнить …» появится форма:

заполненная форма выбора данных

автоматически заполненная форма данных

Теперь напишем макрос для кнопки «Ок» UserForm1 проверяющий правильность выбора файла excel, т.е. наличия в нем необходимых ключевых фраз и в случае некорректного выбора, информирование пользователя с последующим выбором другого файла.


' процедура кнопки "Ok" UserForm1
Private Sub CommandButton1_Click()
' скрываем Label3 (информацию об ошибке)
UserForm1.Label3.Visible = False

' получаем название выбранного файла эксель
namefile = UserForm1.ComboBox1.Value
' ссылка на первый лист выбранной книги
Set poz = Workbooks(namefile).Worksheets(1)
q = 0
' нашлась (1) или не нашлась (0) ячейка с наименованием "Фраза"
da = 0
' проходим по столбцам первой строки до тех пор пока в них есть данные
Do While poz.Range("A1").Offset(0, q) > 0
' если нашли столбец с наименованием "Фраза" присваиваем переменной da = 1 и выходим из цикла
If poz.Range("A1").Offset(0, q) = "Фраза" Then
da = 1
Exit Do
End If
q = q + 1
Loop

If da = 0 Then
' выводим предупреждение о некорректном выборе файла в случае не нахождения в нем ячейки с наименованием "Фраза"
With UserForm1.Label3
.Caption = "В выбранном файле нет данных по фразам и позициям. Выберите другой файл"
.Visible = True
End With
Else
' в случае если файл выбран верно - запускаем в работу функцию заполнения позиций fpoz с передачей ей выбранной даты и наименования файла в виде аргументов
a = Module1.fpoz(Date, namefile)
' скрываем форму UserForm1
Unload UserForm1
End If
End Sub

И наконец, реализуем самую главную функцию fpoz, которая будет осуществлять сравнение данных двух таблиц, заполнение необходимых строк и выделение цветом соответствующих ячеек. Вкратце сам принцип работы функции выглядит следующим образом:

  1. Ищем в шапке таблицы выбранную дату.
  2. Добавляем новый столбец c его соответствующим форматированием (в случае если даты выбранной в UserForm1 нет в шапке таблицы).
  3. Записываем продвигаемые фразы из нашей таблицы в массив.
  4. Находим в файле key collector’а столбец с наименованием «Фраза» и столбце с наименованием «Позиция [Ya]».
  5. Записываем ключевые слова из файла key collector’а и столбцов «Фраза», «Позиция[Ya]» в соответствующие массивы.
  6. Сравниваем массивы между собой и при совпадении – записываем значение позиции в соответствующую ячейку нашей таблицы, при этом, в случае если предыдущее значение было больше текущего (позиция поднялась) – выделяем его зеленым. И, наоборот, при ухудшении позиции (просела) – красным.

Полностью реализованная функция приведена ниже:


' функция заполнения позиций с аргументами mydate - дата введенная в UserForm1, namefile - имя книги, выбранное в UserForm1
Function fpoz(mydate, namefile)
' ссылка на лист книги в которую необходимо занести данные
Set ps = Workbooks("GTD planero.ru.xlsm").Worksheets("Статьи")
' ссылка на первый лист книги из которой необходимо брать данные (файл key kollector'а
Set poz = Workbooks(namefile).Worksheets(1)

' проходим по странице "Статьи" книги "GTD planero.ru.xlsm" и ищем совпадения в дате или пустую ячейку в строке 4
i = 0 ' сколько отступить от ячейки J4
da = 0 ' 0 - нет совпадений; 1 - совпадение найдено
' запускаем цикл прохода вправа от ячейки J4 до тех пор пока есть данные или не найдено совпадение
Do While ps.Range("J4").Offset(0, i) > 0
' если нашлось совпадение по дате - присваиваем переменной da значение 1 и выходим из цикла
If ps.Range("J4").Offset(0, i) = mydate Then
da = 1
Exit Do
End If
' увеличиваем на 1 чтобы проверить следующую ячейку на равенство
i = i + 1
Loop
' если нет столбца с выбранной датой - добавляем новый
If da = 0 Then
i = 1
' добавляем новый столбец между столбцами J и K
Columns("K:K").Insert Shift:=xlToRight, CopyOrigin:=xlFormatFromLeftOrAbove
' записываем в шапку добавленного столбца выбранную в UserForm1 дату
ps.Range("J4").Offset(0, 1) = mydate
' форматируем шапку добавленного столбца в виде "01.01.20"
ps.Range("J4").Offset(0, 1).NumberFormat = "dd/mm/yy;@"
End If

' записываем в массив "Продвигаемые ключевые слова" из книги "GTD planero.ru.xlsm"
Dim arrKey() As String
j = 0
net = 0
' проходим по массиву до тех пор пока присутствуют ключевые слова, даже после их отсутствия 6 строк подряд
Do While ps.Range("I5").Offset(j, 0) > 0 Or net <= 6
' считаем пустые строки (чтобы при превышении 6 - выйти из цикла)
If ps.Range("I5").Offset(j, 0) <= 0 Then
net = net + 1
Else' если нашлось ключевое слово - обнуляем счетчик пустых строк
net = 0
End If
' изменяем размер массива arrKey до значения j
ReDim Preserve arrKey(j)
' записываем в массив ключевое слово, при этом заменяем "-" на " ", переводим все в строчные буквы, удаляем пробелвы в начале и конце ключевого слова
arrKey(j) = Replace(LCase(Trim(ps.Range("I5").Offset(j, 0))), "-", " ")
' увеличиваем счетчик на +1
j = j + 1
Loop

' в файле Съем позиций
' находим столбец "Фраза"
q = 0
' проходим по массиву до тех пор, пока не упремся в пустую ячейку
Do While poz.Range("A1").Offset(0, q) > 0
' если в шапке таблицы нашли столбец с наименованием "Фраза" - выходим из цикла
If poz.Range("A1").Offset(0, q) = "Фраза" Then
Exit Do
End If
q = q + 1
Loop
' находим столбец "Позиция [Ya]"
w = 0
' проходим по массиву до тех пор, пока не упремся в пустую ячейку
Do While poz.Range("A1").Offset(0, w) > 0
' если в шапке таблицы нашли столбец с наименованием "Позиция [Ya]" - выходим из цикла
If poz.Range("A1").Offset(0, w) = "Позиция [Ya]" Then
Exit Do
End If
w = w + 1
Loop
' создаем два массива: arrFraza для записи данных из столбца "Фраза", arrPoz для записи данных из столбца "Позиция [Ya]"
Dim arrFraza() As String
Dim arrPoz()
k = 0
' проходим по массиву до тех пор, пока не упремся в пустую ячейку
Do While poz.Range("A1").Offset(k, q) > 0
' изменяем размер обоих массивов до значения k
ReDim Preserve arrFraza(k)
ReDim Preserve arrPoz(k)
' записываем ключевое словои и его позицию в соответствующий массив
arrFraza(k) = poz.Range("A1").Offset(k, q)
arrPoz(k) = poz.Range("A1").Offset(k, w)
k = k + 1
Loop

' проходим по массивам - находим соответствия и записываем данные, выделяем их цветом в зависимости от предыдущих записей
h = 0
' проходим по массиву до тех пор, пока переменная h не превысит размер массива arrKey
Do While h <= UBound(arrKey)
l = 0
' проходим по массиву до тех пор, пока переменная l не превысит размер массива arrFraza
Do While l <= UBound(arrFraza)
' если значение обоих массивов совпадает
If arrKey(h) = arrFraza(l) Then
' если позиция меньше или равно нулю (т.е. отсутствует в поиске яндекса) - записываем в ячейку нашей таблицы "нет"
If arrPoz(l) <= 0 Then
ps.Range("J5").Offset(h, i) = "нет"
' если предыдущее значение > 0 и не равно "нет" - выделяем ячейку красным (показываем что позиция просела)
If ps.Range("J5").Offset(h, i + 1) > 0 And ps.Range("J5").Offset(h, i + 1) <> "нет" Then
ps.Range("J5").Offset(h, i).Interior.Color = 10987519
End If
' если позиция больше нуля
Else
' записываем значение в ячейку
ps.Range("J5").Offset(h, i) = arrPoz(l)
' если предыдущее значение равно "нет", т.е. его не было в выдаче - выделяем текущее значение зеленым (показываем что позиция поднялась)
If ps.Range("J5").Offset(h, i + 1) = "нет" Then
ps.Range("J5").Offset(h, i).Interior.Color = 11534247
' если предыдущее значение число
Else
' если текущая позиция < предыдущей позиции (т.е. выше в выдаче) - выделяем текущее значение зеленым (показываем что позиция поднялась)
If ps.Range("J5").Offset(h, i) < ps.Range("J5").Offset(h, i + 1) Then
ps.Range("J5").Offset(h, i).Interior.Color = 11534247
' если текущая позиция > или = предыдущей позиции
Else
' если текущая позиция > предыдущей позиции (т.е. ниже в выдаче) - выделяем текущее значение красным (показываем что позиция просела)
If ps.Range("J5").Offset(h, i) > ps.Range("J5").Offset(h, i + 1) Then
ps.Range("J5").Offset(h, i).Interior.Color = 10987519
End If
' если текущая позиция = предыдущей позиции (т.е. не изменилась) - ничего не делаем, оставляем ячейку безцветной
End If
End If
End If
End If
l = l + 1
Loop
h = h + 1
Loop
End Function

На итог получилась картина следующего вида:

таблица с автоматически перенесёнными данными

Итоговый вариант автоматического переноса данных

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

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

Комментарии 2

Сергей Карпухин

15 сентября 2020 в 09:55

Спасибо, но я знал об этих методах верстки. Они помогут, если заменяемый текст не сильно отличается по длине и умещается в одной строке. У меня проблема с высотой линий. Получается, что нужно сделать в шаблоне таблицу с высотой ячейки в самом длинном тексте (в две строки и соответствовать положению заголовка), но затем подставляя короткий текст (в одну строку), мы получаем пробел по высоте.
Существуют ли переопределения разрывов строк при замене текста более чем в одной строке? А может якорь для заголовка?

Руслан Степанов

09 сентября 2020 в 18:07

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

Перенести данные из одной таблицы в другую

mikaelw

Дата: Воскресенье, 19.12.2021, 23:31 |
Сообщение № 1

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

Наверное задачка уже решалась.

Есть 2 таблицы.
Базе и Итог.

В таблице Итого есть 2 столбца(УПД_ПД_№; УПД_ПД_Дата), которые нужно перенести значения перенести в таблицу Базе.

По сути функция ВПН по 3-м условиям(Дата ТН; Проект; Наименование товара), но нужно динамично это делать.

Можно это сделать стандартными функциями или макросом…

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

0682582.xlsx
(141.7 Kb)

 

Ответить

Pelena

Дата: Понедельник, 20.12.2021, 00:08 |
Сообщение № 2

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

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

Сообщений: 18797


Репутация:

4284

±

Замечаний:
±


Excel 2016 & Mac Excel

И Вам здравствуйте.

Код

=ЕСЛИОШИБКА(ПРОСМОТР(0;-1/(Итог!$A$2:$A$29=$A2)/(Итог!$B$2:$B$29=$H2)/(Итог!$C$2:$C$29=$C2);Итог!D$2:D$29);»»)

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

5264526.xlsx
(214.7 Kb)


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

 

Ответить

mikaelw

Дата: Понедельник, 20.12.2021, 01:01 |
Сообщение № 3

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

=ЕСЛИОШИБКА(ПРОСМОТР(0;-1/(Итог!$A$2:$A$29=$A2)/(Итог!$B$2:$B$29=$H2)/(Итог!$C$2:$C$29=$C2);Итог!D$2:D$29);»»)

Не ФОРМУЛОЙ, а данные?

 

Ответить

msi2102

Дата: Понедельник, 20.12.2021, 09:49 |
Сообщение № 4

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

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

Сообщений: 291


Репутация:

104

±

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


Excel 2007


Что именно Вы имеете в виду, может PQ подойдет?
[vba]

Код

let
    Источник = Excel.CurrentWorkbook(){[Name=»Таблица1″]}[Content],
    Источник1 = Excel.CurrentWorkbook(){[Name=»Таблица2″]}[Content],
    Объединение = Table.NestedJoin(Источник,{«Дата ТН», «Наименование товара», «Проект»},Источник1,{«Дата ТН», «Наименование товара», «Проект»},»Таблица2″,JoinKind.LeftOuter),
    Развертывание = Table.ExpandTableColumn(Объединение, «Таблица2», {«УПД_ПД_№», «УПД_ПД_Дата»}, {«УПД_ПД_№», «УПД_ПД_Дата»}),
    Удалить = Table.SelectColumns(Развертывание,{«УПД_ПД_№», «УПД_ПД_Дата»}),
    Тип = Table.TransformColumnTypes(Удалить,{{«УПД_ПД_Дата», type date}})
in
    Тип

[/vba]

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

5348583.xlsx
(146.1 Kb)

 

Ответить

mikaelw

Дата: Понедельник, 20.12.2021, 09:56 |
Сообщение № 5

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

КЛАСС
Я о таком подходе даже не думал.

Думал макросом расставить…

 

Ответить

msi2102

Дата: Понедельник, 20.12.2021, 09:59 |
Сообщение № 6

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

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

Сообщений: 291


Репутация:

104

±

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


Excel 2007

Можно это сделать стандартными функциями

А чем Вас не устроило формульное решение из второго сообщения

 

Ответить

mikaelw

Дата: Понедельник, 20.12.2021, 10:08 |
Сообщение № 7

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

Ранг: Форумчанин

Сообщений: 153


Репутация:

1

±

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


Excel 2010, 2013, 2016

А чем Вас не устроило формульное решение из второго сообщения

Нужно 1 раз в таблицу базы данных внести и больше, чтоб они на лету не менялись.

 

Ответить

msi2102

Дата: Понедельник, 20.12.2021, 10:41 |
Сообщение № 8

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

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

Сообщений: 291


Репутация:

104

±

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


Excel 2007

Думал макросом расставить

Макрос, если ещё актуально

[vba]

Код

Sub Макрос2()
Dim lr As Long, arr1 As Variant, arr2 As Variant, arr3 As Variant
lr = Worksheets(«Итог»).Cells(Rows.Count, 1).End(xlUp).Row
arr1 = Worksheets(«Итог»).Range(«A2:E» & lr).Value
lr = Worksheets(«Базе»).Cells(Rows.Count, 1).End(xlUp).Row
arr2 = Worksheets(«Базе»).Range(«A2:H» & lr).Value
ReDim arr3(LBound(arr2) To UBound(arr2), 1 To 2)
For n = LBound(arr2) To UBound(arr3)
    For m = LBound(arr1) To UBound(arr1)
        If arr2(n, 1) = arr1(m, 1) And arr2(n, 3) = arr1(m, 3) And arr2(n, 8) = arr1(m, 2) Then
            arr3(n, 1) = arr1(m, 4): arr3(n, 2) = arr1(m, 5): Exit For
        End If
    Next m
Next n
Worksheets(«Базе»).Range(«L2:M» & lr) = arr3
End Sub

[/vba]

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

5348583.xlsm
(156.7 Kb)

Сообщение отредактировал msi2102Понедельник, 20.12.2021, 10:55

 

Ответить

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