VBA, чтобы сделать таблицу, когда имена полей являются динамическими - PullRequest
2 голосов
/ 19 ноября 2008

У меня есть перекрестный запрос, который использует функцию динамической даты, чтобы получить заголовки столбцов и, следовательно, имена полей. Пример: ForecastPeriod: DateAdd ("m", [Period], [StartDate]) Это означает, что каждый раз, когда я запускаю кросс-таблицу, у меня могут появляться разные имена полей. Мне нужно взять результаты этой кросс-таблицы и объединить ее с результатами 3 других аналогичных кросс-таблиц, чтобы создать новую таблицу. Прямо сейчас я использую запрос make table и 3 запроса на добавление. Причина, по которой я это делаю, заключается в том, чтобы включить 4 разных категории данных для каждой позиции материала в течение периода прогнозирования.

Результат выглядит примерно так:

Категория материала Значение Per1 ... Значение Per2 ...... Значение Per24

МатА Спрос 0 ... 10 ....... 0

долларов США MatA $ 0 ... $ 10 ....... $ 0

Прогноз MatA 10 ... 20 ....... 50

MatA Прогноз Долларов $ 10 ... $ 20 ....... $ 50

Проблема в том, что запрос make table уже построен на основе результатов текущего кросс-таблицы. Когда я буду запускать кросс-таблицу в следующем месяце, результаты будут иметь разные имена полей. Поэтому я застрял, вручную изменяя периоды в дизайне запросов make table, удаляя тот, которого больше нет в результатах, и добавляя новый.

Есть ли способ использовать VBA для создания новой таблицы, не зная имен полей, до тех пор, пока не запустится кросс-таблица?

Или есть способ кодировать имена полей или извлекать их из кросс-таблицы после ее запуска?

Если я использую код вроде: strSQL = "ВЫБЕРИТЕ tblForecast.Material, tblForecast.Category, tblForecast.X" & _ "INTO tblTemp" & _ "ОТ tblForecast;"

Я действительно не знаю, как будет называться tblForecast.X. Это может быть 11/1/08 или 12/1/08 и т. Д.

Если я объявляю переменную для хранения имени поля и использую код даты, чтобы изменить его, как мне добавить его в таблицу? Должен ли я использовать Alter Table?

Я уверен, что это можно сделать, я просто не могу понять, как это сделать, поэтому любая помощь будет оценена !! Спасибо!

Ответы [ 2 ]

2 голосов
/ 21 ноября 2008

VBA для создания таблицы, отражающей столбцы запроса:

Dim db As DAO.Database
Dim tdf As DAO.TableDef
Dim qdf As DAO.QueryDef
Dim fld As DAO.Field
Dim SourceField As DAO.Field

Set db = CurrentDb

'Create a new tabledef
Set tdf = New DAO.TableDef

'Reference existing, saved querydef
Set qdf = db.QueryDefs("Query1")

tdf.Name = "Table2"

'iterate fields in the query and create fields in the new tabledef
For Each SourceField In qdf.Fields
    Set fld = tdf.CreateField(SourceField.Name, SourceField.Type, SourceField.Size)
    tdf.Fields.Append fld
Next

'Table is created and saved when the tabledef is appended to the current db
db.TableDefs.Append tdf
1 голос
/ 20 ноября 2008

Для кросс-таблицы можно использовать собственные заголовки, например:

ColHead:"Month" & DateDiff("m",[SaleDate],Forms!frmForm!txtSomeDate)

В результате заголовки столбцов будут называться «Месяц» и смещением от txtSomeDate.

Также возможно использовать vba для создания нового запроса.

...