Страницы: 1
RSS
Копирование/перемещение текста по условию
 
Здравствуйте, уважаемые форумчане! Прошу помогите с одним вопросом. Каждый день в Excel имеется отчет о приходе/уходе сотрудников из офиса в алфавитном порядке, их количество колеблется (30-35). Есть общий табель присутствия на работе, в котором все фамилии в алфавитном порядке (40). Вопрос в следующем: как сделать так, чтобы можно было скопировать время прихода пришедших и вставить его в нужные ячейки напротив соответствующих фамилий в общем табеле без лишних махинаций? Примерно алгоритм себе представляю так: внешний цикл идет по фамилиям первого листа и сравнивает их с фамилиями на втором листе (внутренний цикл). Когда находит совпадение, копирует значение ячейки лист2.строка.N,столбец.N+1 в лист1.строка.N,столбец.N+1. К сожалению, не силен в синтаксисе VBA...
П.С. возможности генерации отчета сразу в необходимый табель в нужные ячейки нету, так что имеется 2 листа (оба в книге есть). Не будет проблемой, если кто-то из уважаемых коллег сможет предложить вариант копирования из одной части страницы в другую, с первым листом вполне можно работать. На данный момент время прихода из второго листа копируется руками отдельно для (плюс-минус) каждой фамилии каждый день. Можно ли облегчить эту задачу, например, с помощью макроса?
 
Цитата
asilay написал:
лист2.строка.N,столбец.N+1 в лист1.строка.N,столбец.N+1
Точнее лист2.строка.N,столбец.N+1 и лист2.строка.N,столбец.N+2 в лист1.строка.N,столбец.N+1 и в лист1.строка.N,столбец.N+2

Заранее благодарен за ваше время
Изменено: asilay - 07.08.2017 09:43:37
 
Цитата
Можно ли облегчить эту задачу, например, с помощью макроса?
Код
Sub iCopy()
Dim i As Long
Dim iLastRow As Long
Dim FoundCell As Range
Dim FoundDateCol As Integer
   iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
 With Worksheets("Лист2")
  For i = 3 To iLastRow
       FoundDateCol = Rows(1).Find(.Range("B1"), , xlFormulas, xlWhole).Column
    Set FoundCell = .Columns(1).Find(Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
       Cells(i, FoundDateCol) = .Cells(FoundCell.Row, 2)
       Cells(i, FoundDateCol + 1) = .Cells(FoundCell.Row, 3)
     End If
  Next
 End With
End Sub
 
asilay, может, все таки, впр?
 
К сожалению, не знаю, что такое впр...
 
извиняюсь. впр не подходит по причине ежедневной смены данных на листе2 без сохранения предыдущих данных.
 
Цитата
К сожалению, не знаю, что такое впр...
Ну, а что такое макрос, тем более
 
Цитата
Kuzmich написал:
For i = 3 To iLastRow
Пытаюсь упростить Ваше решение, избавляясь от своих же названий столбцов (удалил пару лишних строк сверху), но когда меняю i=3 на i=1, выходит ошибка 91.
И еще... Как можно скорректировать решение таким образом, чтобы можно было сначала скопировать первый столбец (время прихода), а затем второй (время ухода), так как опять же здесь бывают несостыковки и работать приходится отдельно со столбцами. При данном решении если копируешь сначала первый столбец (второй пуст), то при копировании второго столбца (первый пуст) на листе 1 первый столбец затирается. Может здесь можно сделать корректировку на пропуск пустых строк?
Изменено: asilay - 07.08.2017 11:51:18
 
Цитата
Kuzmich написал:
Ну, а что такое макрос, тем более
Вы правы, я не занимался никогда изучением макросов, впервые появилась такая задача, надеюсь на советы специалистов)
 
В вашем первом примере на листе1 были даты в строке1.
Макрос подтягивает данные с лист2 в лист1 согласно дате
 
Для второго примера, копирование столбца 3
Код
Sub iCopy()
Dim i As Long
Dim iLastRow As Long
Dim FoundCell As Range
Dim FoundDateCol As Integer
   iLastRow = Cells(Rows.Count, "A").End(xlUp).Row
 With Worksheets("Лист2")
  For i = 3 To iLastRow
       'FoundDateCol = Rows(1).Find(.Range("B1"), , xlFormulas, xlWhole).Column
    Set FoundCell = .Columns(1).Find(Cells(i, "A"), , xlValues, xlWhole)
     If Not FoundCell Is Nothing Then
       'Cells(i, FoundDateCol) = .Cells(FoundCell.Row, 2)
       'Cells(i, FoundDateCol + 1) = .Cells(FoundCell.Row, 3)
       Cells(i, 3) = .Cells(FoundCell.Row, 3)
     End If
  Next
 End With
End Sub
 
Цитата
asilay написал: Можно ли облегчить эту задачу
Как вариант - имейте плоскую таблицу, в которую каждый день добавляйте новые данные, а по необходимости из них делайте выборки/отчеты.
ps Вникните в Правила - пп 2.2, 2.3, особенно в части РЕАЛЬНЫХ данных и форматов.
"Ctrl+S" - достойное завершение ваших гениальных мыслей!.. ;)
 
Kuzmich, извините, видимо, я не так выразился, моя вина. я бы не хотел комментить часть кода каждый раз, когда работаю с такой таблицей. не могли бы Вы помочь мне с универсальным макросом, который будет копировать только имеющиеся данные, пропуская пустые столбцы? то есть хотелось бы одним макросом отработать сначала по столбцу прихода, а потом им же отработать по столбцу ухода
Цитата
Kuzmich написал:
Макрос подтягивает данные с лист2 в лист1 согласно дате
большое спасибо, что решили сделать по феншую, но теперь я застрял и не могу это упростить:)) может быть поправите, чтобы начинался отсчет с 1-й строчки, без учета типа ячейки?
 
Цитата
не могли бы Вы помочь мне с универсальным макросом, который будет копировать только имеющиеся данные
Я думаю, что макрос в первом примере как раз и является универсальным.
Он переносит данные с листа2 согласно дате в ячейке В1 на лист1 в колонки, соответствующие этой дате.
Попробуйте изменить дату в В1 на 03.08.2017 и запустите макрос при активном листе1. Посмотрите, куда
перенесутся данные.
 
Большое Вам спасибо, Kuzmich,  я разобрался!
Страницы: 1
Читают тему
Наверх