Юрий М, ух, ну я догадывался что малой кровью не обойтись, а есть какой то макрос, который хотя бы примерно похожие функции выполнял? повторюсь, я к сожалению даже примерно не представляю как сформулировать вопрос
В общем, вариант выше пока не разобрал... Решил пока сделать топорным методом: разбил таблицу на несколько листов с разными предметами и студентами и в сводную таблицу вернул все значения ВПРом в нужном мне виде Если вдруг, (ну вдруг, бывает такое) кому то интересно решение во вложении
Выборка с листа 1234, на лист Вариант. Добавьте на листе 1234 еще предметы и они отобразятся на листе Вариант. Порядок выбора снизу вверх. В в приложенном файле увеличил диапазон в формулах до 19 строки. Если нужно можно увеличить до необходимой строки. Делал по примеру из сообщения #1,Скрытый текст 2.
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 написал: вам выходная таблица нужна именно ЧТОБЫ соотв. предметы находились друг под другом (русский под русским, физика под физикой и т.д.) #16?..
вобщем вставила Match согласно шапке - если названия предметов загонять в шапку... после чего слово Предмет вернуть в шапку, куда хочется (например, как показала для данного файла)... реализовала "Словарь - Коллекция - Строка" - по сути 2D-измерение, разложенное в Pivot (многостолбцовый - x4 столбца на каждый предмет)... верхняя шапка одной строкой, поэтому для Позиционирования - в саму шапку прописываются предметы... *** как-то так (без сортировки) (оптимизации в сторону бОльшей универсальности код подлежит)... но то, что интересовало меня в этой теме - я уже рассмотрела
Изменено: JeyCi - 15.07.2017 19:02:47( вставила в код проставление поправки шапки - после позиционирования)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
одна строка на одного студента нужна была... запрос на 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... просто др. вариация (начало положено в файле вложенном)... если ТС захочет - может допилить
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
нарисовала ещё идею для Позиционирования в структуру-pivot:
Максим Зеленский реализовывал здесь в #22 с формированием итогового словаря на стыке 2-х ключей... (в отличие от моего "Dictionary-Collection" с последующим Application.Match)... как ещё одна альтернатива ИЛИ Application.Index сразу в ячейки - пример #3 покрутить... как ещё одна альтернатива
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Юрий М спасибо за мысль брать лишний столбик про запас в массив для бытовых нужд...
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)