С Новым годом! Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.98/64: Рейтинг темы: голосов - 64, средняя оценка - 4.98
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 11
1
Excel

Макрос для добавления нужных строк из одной таблицы в другую

05.12.2018, 15:47. Показов 12060. Ответов 10
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Добрый день!
Я полный новичок в написании макросов, и мне крайне необходима помощь..
Ситуация: есть документ Excel, в котором две вкладки: «выгрузка» сотрудников, которая формируется ежедневно из системы и «список» сотрудников. По своей структуре таблицы идентичны, однако в «списке» сотрудников нет только что принятых в организацию сотрудников. Они отображаются в выгрузке.
Задача: Необходимо из «выгрузки» перенести вновь принятых сотрудников в «список».
На данный момент во вкладке «выгрузка» я сделала столбец «мониторинг», который на основе формул определяет, какого сотрудника необходимо внести на вкладку «список».
Т.е. перенести информацию из 7 строки вкладки «Выгрузка», на первую пустую строку после таблицы на вкладку «Список». В данном случае это 20 строка. А затем аналогично перенести строку 13 вкладки «Выгрузка» на 21 строку вкладки «Список».
Подскажите, пожалуйста, синтаксис написания макроса, который бы самостоятельно определял пустую строку на вкладке «Список» для дальнейшего переноса информации.
Заранее всем большое спасибо за помощь!
Вложения
Тип файла: xlsx Список сотрудников.xlsx (39.9 Кб, 72 просмотров)
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.12.2018, 15:47
Ответы с готовыми решениями:

Добавления даных из одной таблицы в другую без дублирования
Задача: добавить данные из таблицы Т2 в таблицу Т1, идентичные по структуре, но при этом избежать...

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

Народ подскажите макрос который бы из одной таблицы по id вписывал содержимое в другую?!
Т.е у меня талица в 3000 строк,в каждой строке от 1 до 7 id номера..расставленные рандомно, и во...

Запрос на вставку строк из одной таблицы в другую
Добрый день. Не подскажите, пожалуйста, как правильно написать запрос, что бы вставились записи в...

10
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
05.12.2018, 16:49 2
Лучший ответ Сообщение было отмечено Ksania как решение

Решение

Тебе с форматированием надо ?

Visual Basic
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
Sub Внести_сотрудника()
    Dim ws As Worksheet, lastRow&, r As Range, v, col As New Collection
    
    Set ws = Sheets("Spisok")
    ws.Activate
    lastRow = ws.Cells(ws.Rows.Count, 1).End(xlUp).Row + 1
    
    With Sheets("Выгрузка")
        Set r = .[a1]
        On Error Resume Next
        Do
            Set r = .Cells.Find("Внести", r)
            Err.Clear
            col.Add .Range(.Cells(r.Row, 1), .Cells(r.Row, r.Column - 1)), r.Address
            If Err Then Exit Do
        Loop
    End With
    
    For Each v In col
        v.Copy
        ws.Cells(lastRow, 1).Activate
        ws.Paste
        lastRow = lastRow + 1
    Next
    
End Sub
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
05.12.2018, 17:04 3
Макрос для добавления нужных строк из одной таблицы в другую


И тишина...
потом можешь отсортировать еще
0
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 11
05.12.2018, 17:29  [ТС] 4
fever brain, , большое спасибо за оперативную помощь!
Для рутинной офисной работы это просто спасение!!

Искренне пытаюсь понять эту часть макроса, но пока... безуспешно
Visual Basic
1
2
3
4
5
6
7
8
9
10
With Sheets("Выгрузка")
        Set r = .[a1]
        On Error Resume Next
        Do
            Set r = .Cells.Find("Внести", r)
            Err.Clear
            col.Add .Range(.Cells(r.Row, 1), .Cells(r.Row, r.Column - 1)), r.Address
            If Err Then Exit Do
        Loop
    End With
Можно как для умственно отсталого...что тут происходит?
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
05.12.2018, 17:37 5
Цитата Сообщение от Ksania Посмотреть сообщение
Можно как для умственно отсталого...что тут происходит?
Здесь в теле цикла производится поиск по слову *внести* из второй таблицы
и записывается вся строка кроме ячейки с этим словом в коллекцию Col.add ...
цикл бесконечный и при совпадении адреса производится выход из цикла If Err Then Exit Do
затем эти строчки копируются перебором из коллекции в лист Spisok

Добавлено через 2 минуты
а записываются новые строчки в пустые строчки листа spisok которые находятся ниже, вы писали что это 20-21 строчка
у меня это 19-20

Можно еще улучшить, ускорить, и защитить от *дурака* этот макрос
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
05.12.2018, 17:45 6
Вот например. если изменить найденную ячейку со словом *внести* на *ок* то
строки перенесуться только один раз
Макрос для добавления нужных строк из одной таблицы в другую

Вот небольшое дополнение
r.Value = "Ок"
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
    With Sheets("Выгрузка")
        Set r = .[a1]
        On Error Resume Next
        Do
            Set r = .Cells.Find("Внести", r)
            r.Value = "Ок"
            Err.Clear
            col.Add .Range(.Cells(r.Row, 1), .Cells(r.Row, r.Column - 1)), r.Address
            If Err Then Exit Do
        Loop
    End With
тоесть в память коллекции они уже попали, *ок* поставили
и из коллекции скинули в первую таблицу, так вам форматирование (закрашенный фон) нужно ?
0
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 11
05.12.2018, 17:52  [ТС] 7
fever brain, боюсь, что единственный "дурак" тут я

Общий принцип макроса поняла..
Но есть пара частных идиотских вопросов: что конкретно обозначают эти строки?
Никогда такого не видела
Set r = .[a1]
Set r = .Cells.Find("Внести", r)
col.Add .Range(.Cells(r.Row, 1), .Cells(r.Row, r.Column - 1)), r.Address

Добавлено через 3 минуты
Цитата Сообщение от fever brain Посмотреть сообщение
ак вам форматирование (закрашенный фон) нужно ?
Нет, форматирование можно убрать
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
05.12.2018, 18:55 8
Set r = .[a1] - ссылка на стартовую ячейку поиска точка это потомучто мы ее используем в теле доступа листа *выгрузка*
With Sheets("Выгрузка")

Set r = .Cells.Find("Внести", r) - следующая r (range) ссылается на предыдущую в теле цикла и тд
пока не возникнет ошибки повтора если там было 10 строк со словом внести то цикл завершиться ровно после 10 строк записи

col.Add .Range(.Cells(r.Row, 1), .Cells(r.Row, r.Column - 1)), r.Address --- а в коллекцию записываем весь диапазон (всю найденную строчку) с кодовым словом адреса это может быть L7 или L13

Цитата Сообщение от Ksania Посмотреть сообщение
Нет, форматирование можно убрать
Вот немного подправил
Visual Basic
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
Sub Внести_сотрудника()
    Dim lastRow&, r As Range, v, col As New Collection
    Sheets("Spisok").Activate
    lastRow = Cells(Rows.Count, 1).End(xlUp).Row + 1
    With Sheets("Выгрузка")
        Set r = .[a1]
        On Error Resume Next
        Do
            Set r = .Cells.Find("Внести", r)
            
            r.Value = "Ок"
            Err.Clear
            
            col.Add .Range(.Cells(r.Row, 1), .Cells(r.Row, r.Column - 1)), r.Address
            
             'Здесь можно убрать цвет из импортной строки вкладки Выгрузка я ее пока закоментировал
'            .Range(.Cells(r.Row, 1), .Cells(r.Row, r.Column)).Interior.ColorIndex = xlNone  'убираем цвет
            
            If Err Then Exit Do
            
        Loop
        If col.Count = 0 Then MsgBox "Ничего не найденно", vbExclamation: Exit Sub
    End With
    
    For Each v In col
        v.Copy
        With Range(Cells(lastRow, 1), Cells(lastRow, v.Count))
            .Select
            ActiveSheet.Paste
            .Interior.ColorIndex = xlNone 'убираем цвет из вставленной строки
 
        End With
        lastRow = lastRow + 1
    Next
    Application.CutCopyMode = False
 
End Sub
1
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 11
06.12.2018, 13:48  [ТС] 9
fever brain, большое спасибо за вашу помощь!
Конечно, не до конца поняла все тонкости макроса.. надеюсь, понимание придет со временем)
Но макрос работает просто безупречно!! Даже наши огромные выгрузки его не пугают

Единственное, столкнулась с другой трудностью. Макрос определяет сотрудников, которых необходимо перенести в другую таблицу по слову "внести". Это слово в оригинале моего документа выводит формула, а макрос распознает только значение.
Пробовала написать еще один макрос заместо формулы, но он не работает: думает очень долго,а потом напротив всех сотрудников в выгрузке пишет "внести". Суть закладывала простую: сверь каждый табельный номер из "выгрузки" с табельными номерами в "списке". Если находятся идентичный номер в "списке", но в выгрузке ставь "Ок", в противном случае -"Внести". Может подскажете, в чем моя ошибка? Буду очень благодарна

Visual Basic
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
Sub Определяем_вновь_принятых()
Dim oWBthis As Object
Dim oWSthis As Object
Dim oWSbase As Object
Dim i, j As Integer
 
Call Prepare
 
Set oWBthis = ThisWorkbook
Set oWSthis = oWBthis.Worksheets("Spisok")
Set oWSbase = oWBthis.Worksheets("Выгрузка")
 
i = 2
Do While Len(oWSthis.Cells(i, 1).Value) > 0
j = 2
Do While Len(oWSbase.Cells(j, 1).Value) > 0
If oWSbase.Cells(j, 1).Value = oWSthis.Cells(i, 1).Value Then
oWSbase.Cells(j, 12).Value = "Ок"
Else: oWSbase.Cells(j, 12).Value = "Внести"
End If
j = j + 1
Loop
i = i + 1
Loop
                   
Сall Ended
 
End Sub
 
Sub Prepare()
    Application.AskToUpdateLinks = False
    Application.ScreenUpdating = False
    Application.Calculation = xlCalculationManual
    Application.EnableEvents = False
    Application.DisplayAlerts = False
    ActiveSheet.DisplayPageBreaks = False
End Sub
Sub Ended()
    Application.AskToUpdateLinks = True
    Application.ScreenUpdating = True
    Application.Calculation = xlCalculationAutomatic
    Application.EnableEvents = True
    Application.DisplayAlerts = True
End Sub
0
oh my god
1455 / 794 / 161
Регистрация: 05.01.2016
Сообщений: 2,307
Записей в блоге: 8
07.12.2018, 08:54 10
Цитата Сообщение от Ksania Посмотреть сообщение
большое спасибо за оперативную помощь!
Я не волшебник. а всего-лишь военный хакер
но! в бугалтеры к вам я тож не нанимался


могу предложить только песню
http://megapesni.me/get/online... lbaski.mp3
0
0 / 0 / 0
Регистрация: 26.09.2018
Сообщений: 11
07.12.2018, 09:24  [ТС] 11
fever brain, в любом случае, еще раз большое спасибо за помощь!
0
07.12.2018, 09:24
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
07.12.2018, 09:24
Помогаю со студенческими работами здесь

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

Не получается вставить несколько строк из одной таблицы в другую
Добрый день. Нужно вставить в таблицу oc_product_to_category в столбцы category_id,...

Как переместить множество строк с одной таблицы в другую
Вот такой вот код ALTER PROCEDURE dbo.СохраненнаяПроцедура3 AS declare @cena money declare...

Ошибка при переносе строк из одной таблицы в другую
Добрый вечер! У меня возникла проблема, при переносе строк из одной таблицы в другую, выбивает...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
11
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru