В отношении:
Я не могу найти способ создания новых страниц в отчете с помощью VBA, и поэтому я ограничен только первой страницей.
Похоже, ваше решение №1 предполагает несвязанный отчет.
Я думаю, что я бы сделал, чтобы в качестве источника строк использовалась форма кросс-таблицы, поэтому у вас будут записи для генерации страниц, изатем определите элементы управления вашего отчета без ControlSource (за исключением элементов управления, которые связаны с полями, которые всегда присутствуют в CrossTab).Затем вы можете назначить ControlSources во время выполнения на основе определенных столбцов.Вот SQL для кросс-таблицы, полученной из приложения, над которым я сейчас работаю:
TRANSFORM First(impNoMatch.PersonID) AS FirstOfPersonID
SELECT impNoMatch.LastName, impNoMatch.FirstBame
FROM impNoMatch
GROUP BY impNoMatch.LastName, impNoMatch.FirstName
PIVOT impNoMatch.Status;
Теперь вы знаете, что поля в предложении SELECT будут присутствовать всегда, поэтому, если вы открыли набор записей вИспользуемая вами строка SQL и подсчет количества полей в коллекции полей набора записей (вы не можете использовать набор записей отчета, если это не набор записей ADO, т. Е. Не привязан к источнику записей):
Dim strSQL As String
Dim rsFields As DAO.Recordset
Dim lngFieldCount As Long
strSQL = Me.Recordsource
Set rsFields = CurrentDB.OpenRecordset(strSQL)
lngFieldCount = rsFields.Fields.Count
Изчто, поскольку вы знаете количество полей в операторе SELECT (т. е. заголовки строк), вы можете рассчитать количество динамических элементов управления, которые вы хотите назначить, и вы можете использовать коллекцию полей этого набора записей, чтобы назначить ControlSources и отобразить элементы управления.,
Вы начнете со всех своих элементов управления, которые будут отображать динамические поля, установленные так, чтобы их свойство Visible было ЛОЖНО.Вы также будете использовать соглашение об именах для этих элементов управления.В приведенном ниже коде я использовал txtNN, где NN - числовой индекс в коллекции Fields, отформатированный как 2 цифры.Вот код (который добавляет строки к тому, что перечислено выше, и запускается в событии OnOpen):
Dim strSQL As String
Dim rsFields As DAO.Recordset
Dim lngFieldCount As Long
Dim l As Long
Dim strControlName As String
strSQL = Me.RecordSource
Set rsFields = CurrentDb.OpenRecordset(strSQL)
lngFieldCount = rsFields.Fields.Count
For l = 2 To lngFieldCount - 1
strControlName = "txt" & Format(l, "00")
Me(strControlName).ControlSource = rsFields.Fields(l).Name
Me(strControlName).Visible = True
Next l
rsFields.Close
Set rsFields = Nothing
Теперь, если вы хотите проявить фантазию, вы можете переформатировать элементы управления, изменив ширину и горизонтальный /Вертикальная позиция.Если вы делаете это, вы должны сделать это в другом событии, и это немного сложно выбрать.Единственное хорошее место для этого - событие OnFormat заголовка группы отчетов.Если у вас нет группы, вы можете добавить группу, которая ничего не делает.В случае моей кросс-таблицы двухуровневая сортировка по фамилии и имени и заголовок по группе «Имя», в котором ничего нет, является хорошим местом для использования события OnFormat для изменения внешнего вида / макета элементов управления в отчете.
Что касается вашего вопроса о том, как научиться это делать, я рекомендую взять книгу по программированию для среднего / продвинутого уровня.Руководство для разработчиков Access является золотым стандартом и включает в себя множество примеров программного управления отчетами.