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

Заранее очень благодарен

P.S. Правда пытался найти на форуме что-то, но не знаю даже как сформулировать
Изменено: Shtopich - 11.07.2017 23:50:02
 
Shtopich, нужен Ваш файл-пример.
 
Без проблем
 
Юрий М,
 
А Excel-файла нет?
 
Юрий М, Извиняюсь не тот сбросил
 
Макрос нужно писать.
 
Юрий М, ух, ну я догадывался что малой кровью не обойтись, а есть какой то макрос, который хотя бы примерно похожие функции выполнял?
повторюсь, я к сожалению даже примерно не представляю как сформулировать вопрос
 
На мой взгляд формулировка, описание + файл дают нормальное описание задачи. Готовый макрос под свои нужды вряд ли найдёте.
 
Только с "автоматикой" непонятно - что под этим понимать? Я про название темы.
 
Вот если бы просто написал сортировка по человеку, мне бы ответили типа "руками сортируй-перетаскивай")
 
А сортировка тут и ни причём ) Поменял название.
 
Юрий М, аха, да, так понятней)
 
Вариант с формулой в диспетчере имен.
 
gling, если честно не очень понял принцип работы, откуда и куда идет выборка)
 
В общем, вариант выше пока не разобрал...
Решил пока сделать топорным методом: разбил таблицу на несколько листов с разными предметами и студентами и в сводную таблицу вернул все значения ВПРом в нужном мне виде
Если вдруг, (ну вдруг, бывает такое) кому то интересно решение во вложении
Изменено: Shtopich - 12.07.2017 10:12:44
 
Цитата
Shtopich написал:
откуда и куда идет выборка
Выборка с листа 1234, на лист Вариант. Добавьте на листе 1234 еще предметы и они отобразятся на листе Вариант. Порядок выбора снизу вверх. В в приложенном файле увеличил диапазон в формулах до 19 строки. Если нужно можно увеличить до необходимой строки. Делал по примеру из сообщения #1,Скрытый текст 2.
Изменено: gling - 12.07.2017 20:17:15
 
gling, идею как перемещаются в "Вариант" какбудто бы понял, но чет не пойму что тварится в Диспетчере имен)
Не дорос еще похоже)
Спасибо
 
Цитата
Shtopich написал:
Решил пока сделать топорным методом
вам выходная таблица нужна именно ЧТОБЫ соотв. предметы находились друг под другом (русский под русским, физика под физикой и т.д.) #16?..
или просто разложить всё в горизонтальной последовательности?
Цитата
Shtopich написал: по людям но в горизонтальном развороте.
собрать в словарь людей и коллекции предметов можно так
Код
Sub Dic_Col_PereborStudentov()
'(словарь коллекций)
'КЛЮЧ - по студенту и номеру зачётки (словарь)
'ЗНАЧЕНИЕ - по предмету, дате, аудитории, баллу (коллекция)
Dim a, i&, t$, Dic As Object
Dim el, col
With Application: .ScreenUpdating = False: .EnableEvents = False: .DisplayAlerts = False: .Calculation = xlManual: End With

'удаление листа PT если есть
On Error Resume Next
ThisWorkbook.Sheets("PT").Delete
On Error GoTo 0

'задание исходного массива
With ThisWorkbook.Sheets("1234")
    LR = .Cells(.Rows.Count, "A").End(xlUp).Row
    a = .Range("A1:I" & LR).Value
End With    

'формирование словаря
Set Dic = CreateObject("Scripting.Dictionary")
    With Dic
        .CompareMode = 1
        For i = 1 To UBound(a)
            t = a(i, 1) & "|" & a(i, 2) & "|" & a(i, 3) & "|" & a(i, 4) & "|" & a(i, 5)
            If Not .exists(t) Then
                .Add t, New Collection
                .Item(t).Add a(i, 6) & "|" & a(i, 7) & "|" & a(i, 8) & "|" & a(i, 9)
            Else
                .Item(t).Add a(i, 6) & "|" & a(i, 7) & "|" & a(i, 8) & "|" & a(i, 9)
            End If
        Next
    End With

 'выгрузка     
    With ThisWorkbook.Worksheets.Add
    .Name = "PT"
    For Each el In Dic.keys    
        Debug.Print "СТУДЕНТ " & el
        For Each col In Dic.Item(el)
            Debug.Print "ПРЕДМЕТ " & col
        Next
    Next
    End With
'..................
With Application: .ScreenUpdating = True: .EnableEvents = True: .DisplayAlerts = True: .Calculation = xlAutomatic: End With
End Sub
... вопрос выгрузки зависит от нужной вам последовательности (которую вы не описали в #1)...
Изменено: JeyCi - 13.07.2017 09:05:38
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Цитата
JeyCi написал: вам выходная таблица нужна именно ЧТОБЫ соотв. предметы находились друг под другом (русский под русским, физика под физикой и т.д.) #16?..
вобщем вставила Match согласно шапке - если названия предметов загонять в шапку... после чего слово Предмет вернуть в шапку, куда хочется  ;) (например, как показала для данного файла)...
реализовала "Словарь - Коллекция - Строка" - по сути 2D-измерение, разложенное в Pivot (многостолбцовый - x4 столбца на каждый предмет)...
верхняя шапка одной строкой, поэтому для Позиционирования - в саму шапку прописываются предметы...
***
как-то так
(без сортировки)
(оптимизации в сторону бОльшей универсальности код подлежит)... но то, что интересовало меня в этой теме - я уже рассмотрела  :)  
Изменено: JeyCi - 15.07.2017 19:02:47 ( вставила в код проставление поправки шапки - после позиционирования)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
а чем сводная не устроила?
Изменено: TheBestOfTheBest - 14.07.2017 17:05:56
Неизлечимых болезней нет, есть неизлечимые люди.
 
одна строка на одного студента нужна была... запрос на SQL'е развернул бы Предметы по верхней шапке (запрос в коде)
Код
TRANSFORM FIRST(cstr(t.[Дата экзамена]) + '|'+ cstr(t.[Номер аудитории]) + '|'+ cstr(t.[Балл]))  
SELECT t.[Фамилия], t.[Имя], t.[Отчество], t.[Серия документа], t.[Номер документа] 
FROM [1234$] t WHERE NOT t.[Фамилия] IS NULL 
GROUP BY t.[Фамилия], t.[Имя], t.[Отчество], t.[Серия документа], t.[Номер документа]
PIVOT t.[Предмет]
p.s.
потом перегружать в коде это всё в массив и раскладывать как хочется ИЛИ для выгруженного через rs.Copy циклом в коде вставлять столбцы и делать TextToColumns... просто др. вариация (начало положено в файле вложенном)... если ТС захочет - может допилить
Изменено: JeyCi - 15.07.2017 08:03:31
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Ну и мой вариант ))
Итоговая таблица каждый раз перезаписывается.
 
 нарисовала ещё идею для Позиционирования в структуру-pivot:

Максим Зеленский реализовывал здесь в #22 с формированием итогового словаря на стыке 2-х ключей... (в отличие от моего "Dictionary-Collection" с последующим Application.Match)... как ещё одна альтернатива
ИЛИ
Application.Index сразу в ячейки - пример #3 покрутить... как ещё одна альтернатива
Изменено: JeyCi - 15.07.2017 09:41:22
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Юрий М спасибо за мысль брать лишний столбик про запас в массив для бытовых нужд...  :)  
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Страницы: 1
Наверх