Как создать цикл в Access VBA / SQL для выбора записей и вывода в Excel? - PullRequest
1 голос
/ 21 сентября 2009

Мне нужна помощь в написании кода VBA / SQL в модуль в Access, который должен выполнять следующие действия:

  • Просмотрите таблицу «Школы» , только с одним полем ( SchoolName ).

  • Используйте каждое значение в первой таблице, чтобы выбрать записи из Таблицы 'ChildData' , с несколькими полями об отдельных детях, включая школу, в которой они учатся ( SchoolName ).

  • Для каждой школы экспортируйте данные о посещающих ее детей в отдельную книгу Excel, названную для этой школы.

Кто-нибудь может дать мне какие-нибудь отправные точки? Помните, что я очень мало знаю о VBA или SQL и начинаю с нуля, поэтому даже самые простые объяснения были бы очень полезны!

Спасибо, AVN

Ответы [ 3 ]

1 голос
/ 22 сентября 2009

Я не вижу в вашем вопросе ничего, что указывает на то, что вам нужно что-то сложное.

Первым шагом является создание запроса, объединяющего школы и учащихся, и, когда он выполняется, экспорт в Excel через меню. Если это работает, то вам нужно изменить его так, чтобы вы выводили по одной школе за раз. Самый простой способ сделать это - добавить в запрос параметр School, чтобы при каждом запуске запроса отображалась только одна школа.

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

Итак, я предлагаю создать несвязанную форму, в которой есть поле со списком, отображающее список школ. Затем вы используете ссылку на это поле со списком в качестве критерия для своего запроса и используете его для управления кодом за командной кнопкой:

  Private Sub cmdOutputSchool_Click()
    If IsNull(Me!cmbSchool) Then
       MsgBox "You must first choose a school from the dropdown.", _
         vbExclamation, "Choose a school"
    Else
       DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
         "qrySchoolOutput", CurrentProject.Path & "\" & Me!cmbSchool & ".xls"
    End If
  End Sub

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

Если вы хотите, чтобы это было автоматизировано, один из простых способов сделать это - привязать форму к таблице школ и привязать ваш запрос к отображению названия школы в форме. Затем вы можете заставить командную кнопку просмотреть записи формы и вывести отчет для каждой школы:

  Private Sub cmdOutputSchool_Click()
    With Me.RecordsetClone
      .MoveFirst
      Do Until .EOF
        Me.Bookmark = .Bookmark
        DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel9, _
          "qrySchoolOutput", CurrentProject.Path & "\" & Me!SchoolName & ".xls"
        .MoveNext
      Loop
    End With
  End Sub

Это выведет электронную таблицу для каждой школы в таблице, которую вы привязали к форме.

0 голосов
/ 25 сентября 2009

Как уже упоминалось, вы можете использовать "" внутри строки, чтобы получить цитату. Пример:

MsgBox "I am an ""Example""."

Что касается другого, вам на самом деле не нужен VBA для этого. Вы можете сделать это с помощью запроса:

SELECT ChildData.* INTO [Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:\Example.xls].[MyWorksheet]
FROM ChildData INNER JOIN Schools ON ChildData.SchoolName = Schools.SchoolName;

Конечно, вы можете сделать то же самое с VBA, если вам действительно нравится это:

CurrentDB.Execute "SELECT ChildData.* INTO [Excel 8.0;HDR=YES;IMEX=2;DATABASE=C:\Example.xls].[MyWorksheet] FROM ChildData INNER JOIN Schools ON ChildData.SchoolName = Schools.SchoolName;"

Еще один способ - создать запрос на выборку, который извлекает ваши данные, а затем использовать DoCmd.OutputTo:

DoCmd.OutputTo acOutputQuery,"MyQuery",acFormatXLS,"C:\Test.xls"

Вы также можете использовать DoCmd.TransferSpreadsheet:

DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "MyQuery", "C:\Test.xls", True
0 голосов
/ 21 сентября 2009

Было бы проще создать запрос, объединяющий две таблицы в школе, а затем использовать сводную таблицу в Excel со школой в качестве страницы и использовать страницы показа для вывода каждой школы на отдельной странице

Если вы хотите сделать это более сложным способом, чем в VBA, вам нужен набор записей из таблицы школ, который показывает все школы, и набор записей из дочерних данных с обязательными полями и параметром против школьного поля.

Затем в VBA вы используете элемент управления циклом do, который продолжается, пока school.EOF = false, и для каждой школьной записи получите набор записей childdata и поместите его в Excel

Я бы хотел сделать это в Excel VBA и использовать copyfromrecordset, чтобы поместить данные в Excel - достаточно просто, чтобы создать новый лист для каждой школы и установить имя листа для школы. Вам необходимо добавить соответствующие ссылки на проект VBA - DAO или ADO - чтобы иметь возможность подключаться к данным Access.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...