Страницы: 1
RSS
Вывод уникального списка титулов и подсчет количества задействованных специальностей в разрезе каждого титула, формирование таблицы по определённому шаблону.
 
Добрый день. Есть такая проблема, нужно формировать отчеты в определённом формате (для руководства шаблоне), они наглухо отказываются воспринимать смарт табличку.

1) Есть лист "ФИО и должность". Данный лист формируется по средствам сбор из разных книг с помощью запроса PwrQuery.
Необходимо чтобы из этого листа формировался лист "ТЛР", наверное с помощью макроса.
Например, в строку 4 заносился титул. А далее считались количество должности на титуле(день\ночь), и значение помещались в соответствующую ячейку титула.
Есть шаблон на листе шаблон для ТЛР.

2) Есть лист "По начальникам". Его так же необходимо формировать из листа "ФИО и должность людей"
По принципу Определения уникальных имен в столбце "NAME". Созданием шапки с этим именем, и указанием под ней титулов, относящихся к этому имени. И распределением подсчитанных специальностей титул(день\ночь). И в конце каждой такой сборки считались итоги
Есть шаблон на листе “ шаблон По начальникам”.
В файле есть похожий макрос, но я очень слабо ещё разбираюсь в этом, к сожалению нет времени учиться.

Помогите пожалуйста с макросом.
И еще такой вопрос -  как правильно написать запрос в pwrquery что бы накапливалась собранная информация по датам на листе "ФИО и должность"?
ПРИКРЕПИЛ ФАЙЛ В АРХИВЕ, ТАК ПОЧЕМУ ТО ЧИТСЫЙ ФАЙЛ КРЕПИТСЯ С ДВОЙНЫМ РАСШИРЕНИЕМ

[пример см.в сообщениях ниже]
 
DevilByte, а вы сами пробовали скачать и открыть ваш файл? Попробуйте. У меня ошибка при открытии. Если переименовать в XLSM, то открывается, то при переходе на лист ТЛР файл аварийно закрывается
Изменено: New - 17.11.2020 18:06:04
 
Цитата
New написал:
вы сами пробовали скачать и открыть ваш файл
Здравствуйте. Файл должен иметь расширение xlsb. Почему то при за ливки с планшета, файл при повторном скачивание получает двойное расширение. Не могу понять в чем проблема(((. Попробуйте с архива открыть, если нет, то перезалью файл когда буду на работе.

[пример см.в сообщениях ниже]
 
так же не открывается
 
Пдтверждаю -не открывается.
Создайте небольшой пример, найдите нормальнй компьютер и с него прикрепите файл к сообщению
 
Цитата
vikttur написал:
Создайте небольшой пример,
Там вроде и так небольшой пример, я урезал его на 90%, я могу дать ссылку на облако? . Я кстати вижу не только на своей теме. Ещё пару раз встречал. Даже при загрузке с компа.  
Изменено: DevilByte - 18.11.2020 16:24:59
 
при открытии последнего файла XLSM у меня выскакивает сразу окно выбора принтера. Надо закрыть его пару раз. При попытке открыть лист "ТЛР" файл сразу аварийно закрывается

P.S. Если вы уже удалили 90% всех ненужных данных, то почему в файле 8 листов?
Изменено: New - 18.11.2020 17:13:32
 
Странно конечно, у меня сейчас все нормально работает. Ничего не вылетает, даже макросы сохранённые в книге работают, файл создавался в  MS Office 365

Цитата
New написал: ...почему в файле 8 листов?
Если эти листы как то мешали,  то я оставил только те которые описал, хотя сильно на вес файла это не повлияло, он как работал так и работает
 
О лишних строках/столбцх. Лист ТЛР. Стаем на любую ячейку с данными, жмем Ctrl+End (есть такие клавиши на клавиатуре). Выделяется ячйка BK3766. Это значит что все строки до 3766 и столбца ВК грузят книгу.  А данные только до строки 100.  3,5 тысяч ЛИШНИХ строк в используемом диапазоне!
Шаблондля ТЛР. То же самое.
Лист ФИО и должности. Зачем для ПРИМЕРА тысячи строк?

Пример - это простая демонстрация, где не должно быть лишней шелухи, которая отвлекает внимание помогающих
 
Убрал строки  в Листе ФИО, оставил около 80 штук. Пожалуйста помогите с моим вопросом
 
DevilByte,
Цитата
DevilByte написал:
Например, в строку 4 заносился титул. А далее считались количество должности на титуле(день\ночь), и значение помещались в соответствующую ячейку титула.
а где на листе ФИО определено ночь это или день?
Не бойтесь совершенства. Вам его не достичь.
 
Mershik,на листе "ФИО" там есть столбец "СМЕНА" , 1 - это первая смена, 2 - это вторая смена(ночь), После столбца смена идёт столбец титул на котором ведутся работы. можно конечно цифры заменить на слова день, ночь, я думал уже об этом, так наверное и читабельнее будет.  
Изменено: DevilByte - 18.11.2020 19:04:32
 
ТС, ваш файл так же глючит. При открытии листа ТЛР и Шаблон для ТЛР файл аварийно закрывается. Мне удалось пересохранить файл в формат XLS, тогда файл нормально открылся
Изменено: New - 18.11.2020 19:03:05
 
New,ну. Я вам клянусь что на многих машинах файл этот работает. Я чесн не могу понять в чем дело. Может это какая нибудь защиа срабатывала? (
 
DevilByte, чет питался понять, не дошло, видимо в файле данные на листе ТЛР просто стоят - это не является желаемым результатом?
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, да это просто данные, сейчас не существует ни какого способа автоматического заполнения, там были простейшие формулы, которые подщитывади данные на листе "ФИО". Но использование формул не вариант, так как специальности могут добавятся, и титулы на которых выполняютя работы,, меняются постонно. Смарт табличку я делал, но руководству это не нравится. ( а от таких сложных макросов я далёк.  
Изменено: DevilByte - 18.11.2020 19:14:12
 
DevilByte, что бы написать, допустим мне, макрос нужна логика и еще лучше показать в файле, что было до и что должно поучтся после работа макрос...а пока я не понимаю какие изначально даныне на листе и что должно туда макросом подставится...подождите может кто поймет например New) видимо в работе)
Не бойтесь совершенства. Вам его не достичь.
 
Mershik,я вроде бы описывал в самом первом сообщение, но может плохо это выходит..
Двайте ещё раз попробую

1) есть лист ФИО, из него будут браться данные из столбцов специальность, смена, титул.

2) данные из этого массива должны попадать на лист ТЛР. Например макрос определил уникальные титулы, создал для них столбцы (день ночь) и посчитав количество специальностей внёс их в ячейки на против прописаного списка на листе ТЛР
3) для листа по начальника, тоже самое только например нужно определить в листе ФИО, столбце name уникальное имя, и под ним уже уникальные титулы и так же подсчитать людей
Изменено: DevilByte - 18.11.2020 19:27:26
 
Цитата
DevilByte написал:
я вроде бы описывал в самом первом сообщение
я
Цитата
Mershik написал:
чет питался понять, не дошло
и еще
Цитата
Mershik написал:
лучше показать в файле, что было до и что должно поучтся после работа макрос...
но а так ожидайте кто-то может поймет
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, лист ФИО должен стать как  листы ТЛР и лист по начальникам.  
Изменено: DevilByte - 18.11.2020 19:42:24
 
DevilByte, ну удачи)
все что понял) это подставить уникальные Титулы и посчитать кол-во...
Код
Sub sdds()
Application.ScreenUpdating = False
Dim col As New Collection, i As Long, lr As Long, n As Long, sh As Worksheet, sh2 As Worksheet
Set sh = Worksheets("ФИО и должность людей"): Set sh2 = Worksheets("ТЛР")
lr = sh.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lr
    On Error Resume Next
    col.Add sh.Cells(i, 6), CStr(sh.Cells(i, 6))
Next i
k = 4
For i = 1 To col.Count
    sh2.Range(Cells(4, k), Cells(4, k + 1)).Merge
    sh2.Cells(4, k) = col(i)
    For n = 57 To 88
        x1 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "1")
        x2 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "2")
        If x1 > 0 Then sh2.Cells(n, k) = x1
        If x2 > 0 Then sh2.Cells(n, k + 1) = x2
    Next n
    k = k + 2
Next i
Application.ScreenUpdating = True
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Цитата
Mershik написал:
например New
нет, я тоже не понял смысл и забросил
 
Mershik, New, В общем оставил на листе ФИО несколько строк. На листе ТЛР Указаны в шапке титулы , которые присутствуют в листе ФИО. Один Титул это один столбец, и в нем подсчитывается количество специальностей работающих на этом титуле. Но титулы могут появляться или убираться, если работ ни каких нет. Вот можно сделать так что бы при запуске макроса, лист ТЛР очищался кроме столбцов A и B.  Затем создавал для каждого титула столбец, и в нем считал специальности.  
Изменено: DevilByte - 19.11.2020 07:31:25
 
DevilByte, как-то так, если что доработаете как нужно.
Код
Sub sdds()
Application.ScreenUpdating = False
Dim col As New Collection, i As Long, lr As Long, n As Long, sh As Worksheet, sh2 As Worksheet, sh3 As Worksheet
Set sh = Worksheets("ФИО и должность людей"): Set sh2 = Worksheets("ТЛР"): Set sh3 = Worksheets("шаблон для ТЛР")
sh2.Cells(2, 3) = "по состоянию на " & Date

lcol = Cells(5, Columns.Count).End(xlToLeft).Column
If Cells(5, Columns.Count).End(xlToLeft).Column > 6 Then
    sh2.Range(Cells(1, 4), Cells(1048576, lcol - 3)).Delete Shift:=xlToLeft
End If
        sh3.Range("A:B").Copy
        sh2.Range("D:E").Insert Shift:=xlToRight
lr = sh.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lr
    On Error Resume Next
    If sh.Cells(i, 6) <> Empty Then
    col.Add sh.Cells(i, 6), CStr(sh.Cells(i, 6))
    End If
Next i
k = 4
For i = col.Count To 1 Step -1
    sh2.Range(sh2.Cells(4, k), sh2.Cells(4, k + 1)).Merge
    sh2.Cells(4, k) = col(i)
    For n = 6 To 88
        x1 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "День")
        x2 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "Ночь")
        If x1 > 0 Then sh2.Cells(n, k) = x1
        If x2 > 0 Then sh2.Cells(n, k + 1) = x2
    Next n
    If i > 1 Then
        sh3.Range("A:B").Copy
        sh2.Range("D:E").Insert Shift:=xlToRight
    Else
        Exit For
    End If
Next i
Application.ScreenUpdating = True
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Mershik,офигеть! оно! а можно такое же для листа "ПО начальникам"? там суть в том что есть например один начальник у него 2 титула, есть второй начальник у него могут быть такие же титулы.  и нужно для каждого начальника титула отдельно считать
 
Цитата
DevilByte написал:
можно такое же для листа "ПО начальникам"?
делайте по аналогии.

Тема:  Вывод уникального списка титулов и подсчет количества задействованных специальностей в разрезе каждого титула
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, добрый день. Я к сожалению так и не смог за это время ничего особо понять в макросе.
Вот на что меня хватило, и то думаю это не правильно
Код
Sub Nachalnike()Application.ScreenUpdating = False 'отключение обновления дисплея'
Dim col As New Collection, i As Long, lr As Long, n As Long, sh As Worksheet, sh2 As Worksheet, sh3 As Worksheet 'создание объектов и объявление переменных'
Set sh = Worksheets("ФИО и должность людей"): Set sh2 = Worksheets("По начальнкам"): Set sh3 = Worksheets("шаблон По начальнкам") 'Присвоение переменным объектов'
sh2.Cells(2, 3) = "по состоянию на " & Date


lcol = Cells(5, Columns.Count).End(xlToLeft).Column 'наверное удаление строк по условию'
If Cells(5, Columns.Count).End(xlToLeft).Column > 6 Then 'суммирование данных по признакам'
    sh2.Range(Cells(1, 4), Cells(1048576, lcol - 3)).Delete Shift:=xlToLeft 'определение положения ячеек в листе'
End If
        sh3.Range("A:B").Copy 'копирование шаблона'
        sh2.Range("D:E").Insert Shift:=xlToRight 'вставка шаблона в нужный диапазон и лист'
lr = sh.Cells(Rows.Count, 1).End(xlUp).Row
For i = 2 To lr
    On Error Resume Next
    If sh.Cells(i, 6) <> Empty Then
    col.Add sh.Cells(i, 6), CStr(sh.Cells(i, 6))
    End If
Next i
k = 4
For i = col.Count To 1 Step -1
    sh2.Range(sh2.Cells(4, k), sh2.Cells(4, k + 1)).Merge
    sh2.Cells(4, k) = col(i)
    For n = 6 To 96 'номера строк с какой по какую производить вставку посчитанных диапазонов'
        x1 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "День") 'определение смены в титуле'
        x2 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "Ночь") 'определение смены в титуле'
        If x1 > 0 Then sh2.Cells(n, k) = x1
        If x2 > 0 Then sh2.Cells(n, k + 1) = x2
    Next n
    If i > 1 Then
        sh3.Range("A:B").Copy
        sh2.Range("D:E").Insert Shift:=xlToRight
    Else
        Exit For
    End If
Next i
Application.ScreenUpdating = True 'включение обновления экрана после выполнения макроса'
End Sub

Но я так и не понял как определить уникальные значения в нужном столбце, и как сделать так что бы он для столбца Name  брал относящиеся к нему титулы, и считал в них специальность. Подскажите куда смотреть и что делать
Изменено: DevilByte - 22.11.2020 12:21:29
 
DevilByte, не уверен ,что понятно расписал)
Код
Sub sdds()
Application.ScreenUpdating = False
Dim col As New Collection, i As Long, lr As Long, n As Long, sh As Worksheet, sh2 As Worksheet, sh3 As Worksheet ' объявление переменных
Set sh = Worksheets("ФИО и должность людей"): Set sh2 = Worksheets("ТЛР"): Set sh3 = Worksheets("шаблон для ТЛР") ' присваивание значений переменным
sh2.Cells(2, 3) = "по состоянию на " & Date 'подстановка текущей даты

lcol = Cells(5, Columns.Count).End(xlToLeft).Column 'последний заполненный столбец в 5 строке активного листа (ТЛР)
If Cells(5, Columns.Count).End(xlToLeft).Column > 6 Then ' проверка количества столбцов на листе ТЛР если их больше 6
    sh2.Range(Cells(1, 4), Cells(1048576, lcol - 3)).Delete Shift:=xlToLeft ' удаляем c 4 до последнего заполненного столбца минут 3
End If
        sh3.Range("A:B").Copy ' копируем столбец "ШАБЛОН"
        sh2.Range("D:E").Insert Shift:=xlToRight 'вставляем его после ед. изм и перед день ВСЕГО
lr = sh.Cells(Rows.Count, 1).End(xlUp).Row 'последняя заполненная строка в 1 столбце листа "ФИО и должность людей"
For i = 2 To lr ' цикл от 2 ячейки до последней заполненной листа "ФИО и должность людей" столбца 6
    On Error Resume Next ' отключаем появление ошибки при добавлении в коллекцию повторяющегося значения
    If sh.Cells(i, 6) <> Empty Then 'если ячейка не пустая
        col.Add sh.Cells(i, 6), CStr(sh.Cells(i, 6)) 'то добавляем ее в коллекцию уникальных
    End If
Next i ' следующая строка цикла
k = 4 'c какого столбца будут добавляться уникальные значения на лист ТЛР
For i = col.Count To 1 Step -1 ' цикл по значениям коллекции от последнего до первого
    sh2.Range(sh2.Cells(4, k), sh2.Cells(4, k + 1)).Merge 'объединение ячеек столбца к  и к+1
    sh2.Cells(4, k) = col(i) ' вставка значения из коллекции по порядку
    For n = 6 To 88 'цикл от 6 строки до 88 листа ТЛР
        x1 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "День") ' подсчет количества ячеек на листе "ФИО и должность людей" с режимом день и титула
        x2 = Application.WorksheetFunction.CountIfs(sh.Columns(6), col(i), sh.Columns(3), sh2.Cells(n, 2), sh.Columns(5), "Ночь") ' подсчет количества ячеек на листе "ФИО и должность людей" с режимом ночь и титула
        If x1 > 0 Then sh2.Cells(n, k) = x1 'если больше нуля подставляем количество
        If x2 > 0 Then sh2.Cells(n, k + 1) = x2 ''=если больше нуля подставляем количество
    Next n 'след значение цикла т.е. следующая строка
    If i > 1 Then 'если переменная больше 1 то добавляем новые столбцы для следующего значения титула
        sh3.Range("A:B").Copy ' копируем столбец "ШАБЛОН"
        sh2.Range("D:E").Insert Shift:=xlToRight 'вставляем его после ед. изм и перед день ВСЕГО
    Else 'если переменная равна 1 то не добавляем шаблон столбца т.к. это последнее значение и добавление столбцов из шаблона приведет к пустому столбцу поэтому
        Exit For ' выходим из цикла
    End If
Next i
Application.ScreenUpdating = True
End Sub
Не бойтесь совершенства. Вам его не достичь.
 
Mershik, ну как считаются значения в столбце я примерно начал понимать и как записываются. Но все таки не ясно как получить уникальные значения из столбца, а потом записать их в строку. Понятно вы объявили и создали коллекцию,, объявили переменные и присвоили им значения, и далее отключи ошибки при добавление новых значений в коллекцию.

Но как теперь из этой коллекции, из столбца name получить уникальные имена, а потом для каждого имени найти соответствующие титулы и уже считать в титуле для этого начальника людей? и еще для коллекция не был объявлен тип, получается что она имеет variant по умолчанию и может хранить все типы данных в себе?
Понятно что нужно присвоить переменным другие листы на  на которых я хочу производить вставку информации, а дальше как сделать по схеме что описал выше не понимаю(
Изменено: DevilByte - 24.11.2020 15:06:02
Страницы: 1
Наверх