Экспорт результатов кросс-таблицы в Excel из MS Access - PullRequest
2 голосов
/ 08 декабря 2008

Я пытался с ограниченным успехом экспортировать набор результатов кросс-таблицы в Excel с помощью Access 2003. Иногда экспорт работает правильно, и Excel показывает без ошибок. В других случаях, используя те же параметры запроса, я получаю ошибку 3190 - слишком много полей. Я использую опцию TransferSpreadsheet в макросе, который вызывается из кода VB.

Макрос имеет следующие параметры: Тип передачи: экспорт Тип электронной таблицы: Microsoft Excel 8-10 Имя таблицы: (это имя моего запроса) Имя файла: (выходной файл Excel, который существует в каталоге) Имеет имена полей: Да

Запрос не должен содержать информации, превышающей 14 столбцов, поэтому ограничение Excel в 255 столбцов не должно быть проблемой. Кроме того, данные в базе данных не меняются во время запроса, поэтому один и тот же запрос даст тот же набор результатов.

Одним из единственных решений, которые я до сих пор читал в сети, является закрытие набора записей перед запуском макроса, но это удар или промах.

Ваши мысли / помощь очень ценятся!

Ответы [ 3 ]

2 голосов
/ 08 декабря 2008

У меня есть один, работающий в качестве макроса MS Access. Он использует действие OutputTo с:

  • Тип объекта = Запрос
  • Имя объекта = [WhwhatQueryName]
  • Формат вывода = MicrosoftExcel (*. Xls)
  • Автозапуск = Нет
  • (все остальное пусто)

Я ненавижу использовать макросы в MS Access (это кажется нечистым), но, возможно, попробую.

1 голос
/ 06 марта 2009

Если вы готовы использовать небольшой vba, а не придерживаться исключительно макросов, вам может помочь следующее. Этот модуль берет любой sql, который вы добавляете, и экспортирует его в определенное место на листе Excel. После модуля два примера его использования: один для создания совершенно новой рабочей книги, другой - для открытия уже существующей. Если вы не уверены в использовании SQL, просто создайте требуемый запрос, сохраните его и затем укажите «SELECT * FROM [YourQueryName]» для Sub в качестве параметра QueryString.

Sub OutputQuery(ws As excel.Worksheet, CellRef As String, QueryString As String, Optional Transpose As Boolean = False)

    Dim q As New ADODB.Recordset
    Dim i, j As Integer

    i = 1

    q.Open QueryString, CurrentProject.Connection, adOpenForwardOnly, adLockReadOnly


    If Transpose Then
        For j = 0 To q.Fields.Count - 1
            ws.Range(CellRef).Offset(j, 0).Value = q(j).Name
            If InStr(1, q(j).Name, "Date") > 0 Or InStr(1, q(j).Name, "DOB") > 0 Then
                ws.Range(CellRef).Offset(j, 0).EntireRow.NumberFormat = "dd/mm/yyyy"
            End If
        Next

        Do Until q.EOF
            For j = 0 To q.Fields.Count - 1
                ws.Range(CellRef).Offset(j, i).Value = q(j)
            Next
            i = i + 1
            q.MoveNext
        Loop
    Else
        For j = 0 To q.Fields.Count - 1
            ws.Range(CellRef).Offset(0, j).Value = q(j).Name
            If InStr(1, q(j).Name, "Date") > 0 Or InStr(1, q(j).Name, "DOB") > 0 Then
                ws.Range(CellRef).Offset(0, j).EntireColumn.NumberFormat = "dd/mm/yyyy"
            End If
        Next

        Do Until q.EOF
            For j = 0 To q.Fields.Count - 1
                ws.Range(CellRef).Offset(i, j).Value = q(j)
            Next
            i = i + 1
            q.MoveNext
        Loop
    End If

    q.Close

End Sub

Пример 1:

Sub Example1()
    Dim ex As excel.Application
    Dim wb As excel.Workbook
    Dim ws As excel.Worksheet

    'Create workbook
    Set ex = CreateObject("Excel.Application")
    ex.Visible = True
    Set wb = ex.Workbooks.Add
    Set ws = wb.Sheets(1)

    OutputQuery ws, "A1", "Select * From [TestQuery]"
End Sub

Пример 2:

Sub Example2()
    Dim ex As excel.Application
    Dim wb As excel.Workbook
    Dim ws As excel.Worksheet

    'Create workbook
    Set ex = CreateObject("Excel.Application")
    ex.Visible = True
    Set wb = ex.Workbooks.Open("H:\Book1.xls")
    Set ws = wb.Sheets("DataSheet")

    OutputQuery ws, "E11", "Select * From [TestQuery]"
End Sub

Надеюсь, это вам пригодится.

0 голосов
/ 10 декабря 2008

Обходной путь - сначала добавить запрос в таблицу, а затем экспортировать его.

DoCmd.SetWarnings False
 DoCmd.OpenQuery "TempTable-Make" 
 DoCmd.RunSQL "DROP TABLE TempTable" 
 ExportToExcel()
DoCmd.SetWarnings True

TempTable-Make - это запрос рабочей таблицы, основанный на кросс-таблице.

Здесь - соответствующая функция ExportToExcel, которую вы можете использовать.

...