Страницы: 1
RSS
Разбиение (разделение) данных по отделам на несколько листов
 
Доброго времени суток, уважаемые эксперты!

Очень прошу помочь в написании макроса. В приложенном файле в листе "кто" перечислены 8 отделов и относящиеся к ним номера. Номера могут меняться (добавляться, удаляться). В листе "свод" содержатся в кучу данные, в которых фигурируют в хаотичном порядке все номера из листа "кто".
Задача состоит в том, чтоб из свода выдернуть (скопировать) данные и распределить их по отоносящимся к ним отделам на 8 листов с соответствующим названием отдела.
Если не затруднит, просьба прислать текст макроса в комментариях, т.к. это примерный файл и сварганил с телефона. Спасибо!
 
FrinG, написал
Цитата
Очень прошу помочь в написании макроса.
А где ваши попытки? Или все нужно сделать с нуля за вас?
 
Цитата
Kuzmich написал:
А где ваши попытки?
мои попытки тормознули на "с чего начать". Format не берет диапазон, Find я посчитал не вариантом. Подскажите хотя бы с чего начать. Я думал тут всё просто. Искал на форумах, но ничего подобного не нашел. Поэтому прибегнул к крайней мере: написать сюда
 
Цитата
на 8 листов с соответствующим названием отдела.
Вы бы привели пример одного листа, что на нем должно быть
 
Приложил измененный файл, убрал "1" в начале чисел, сбивали потому что. Добавил 8 листов, в каждый из них из "свод"а вставил то, что должно получиться. Суть в том, что к каждому отделу принадлежат свои сотрудники, но они записаны номерами. Приходит свод, в котором они все в кучу. Надо их на соответствующие листы распихать (кто в каком отделе)
 
Макрос в стандартный модуль, запускать при активном листе "кто"
Листы по отделам создаются в процессе работы макроса
Код
'при активном листе кто
Sub Razbienie()
Dim i As Long
Dim iLastRow As Long
Dim iLR As Long
Dim FoundNomer As Range
Dim j As Integer
Dim Swod As Worksheet
Dim Kto As Worksheet
  Set Swod = ThisWorkbook.Worksheets("свод")
  Set Kto = ThisWorkbook.Worksheets("кто")
  For j = 1 To 8     'цикл по строке с отделами
   iLastRow = Cells(Rows.Count, j).End(xlUp).Row
     'создаем новый лист
    Worksheets.Add After:=Worksheets(Worksheets.Count)
    With Worksheets(Worksheets.Count)
      .Name = Kto.Cells(1, j)  'название листа с именем отдела
      For i = 2 To iLastRow - 1  'цикл по строкам
        Set FoundNomer = Swod.Columns(2).Find(Kto.Cells(i, j), , xlValues, xlWhole)
        If Not FoundNomer Is Nothing Then
          iLR = Cells(Rows.Count, 1).End(xlUp).Row + 1
          Cells(iLR, 1) = FoundNomer.Offset(, -1)  'дата
          Cells(iLR, 1).NumberFormat = "dd.mm.yyyy"
          Cells(iLR, 2) = FoundNomer               'номер
        End If
      Next
    End With
    Kto.Activate
  Next
End Sub
 
Kuzmich, всё супер правильно работает! Очень помогли. Я уже хотел начать перебором через "Like".
Если не трудно, подскажите, пожалуйста, сильно ли изменится макрос, если мне нужно всю строку копировать (предполагается, что там не только значение с датой и номером). Полагаю, что изменения будут здесь,
Код
        If Not FoundNomer Is Nothing Then          
iLR = Cells(Rows.Count, 1).End(xlUp).Row + 1
          Cells(iLR, 1) = FoundNomer.Offset(, -1)  'дата
          Cells(iLR, 1).NumberFormat = "dd.mm.yyyy"
          Cells(iLR, 2) = FoundNomer               'номер
        End If
поскольку Вы сначала ставите дату, затем сам номер.

Если не ответите, то спасибо и на этом, очень признателен!
Изменено: FrinG - 16.01.2020 21:43:41
 
Цитата
нужно всю строку копировать
Всю строку с листа "свод"?
 
Да, из него.
Изменено: FrinG - 16.01.2020 22:07:23
 
В макросе нашли FoundNomer
Строка  от A до К будет Swod.Range(Swod.Cells(FoundNomer.Row, "A"), Swod.Cells(FoundNomer.Row, "K"))
Вот этот диапазон и копируйте
 
Цитата
Вот этот диапазон и копируйте
Помогите немного дожать, ну никак не могу въехать

Код
        If Not FoundNomer Is Nothing Then 'находит нужное нам значение
          Swod.Range(Swod.Cells(FoundNomer.Row, "A"), Swod.Cells(FoundNomer.Row, "K")).Copy 'копирует всю строку с ним
         'Worksheets(Worksheets.Count).Paste '(вариант 1) вставляет, но вставляются не все строки
          iLR = Cells(Rows.Count, 1).End(xlUp).Row + 1
         'Cells(iLR, 1) = Swod.Range(Swod.Cells(FoundNomer.Row, "A"), Swod.Cells(FoundNomer.Row, "K")) '(вариант 2) при таком ничего не вставляется
        End If
Изменено: FrinG - 16.01.2020 22:51:49
 
Код
Swod.Range(Swod.Cells(FoundNomer.Row, "A"), Swod.Cells(FoundNomer.Row, "K")).Copy Cells(iLR,"A")
 
Теперь всё как надо!
Страницы: 1
Наверх