如何在Access VBA / SQL中创build一个循环来selectlogging并输出到Excel?

我需要一些帮助写一些VBA / SQL代码到Access中的模块,它应该做到以下几点:

  • 循环表“学校” ,只有一个领域( 学校名称 )。

  • 使用第一个表中的每个值从Table'ChildData'中selectlogging,其中包含有关个别孩子的几个字段,包括他们参加的学校( SchoolName )。

  • 对于每所学校,将其参加学习的孩子的数据导出到为该学校命名的单独的Excel工作簿中。

任何人都可以给我任何出发点? 请注意,我对VBA或SQL知之甚less,几乎从零开始,所以即使是最基本的解释也是非常有帮助的!

谢谢,AVN

我看不到任何问题,表明你需要任何复杂的东西。

第一步是创build一个连接学校和学生的查询,当它运行时,通过菜单导出到Excel。 如果这样做,那么你需要改变它,以便你一次输出一所学校。 这样做的“简单”方法是在学校添加查询参数,以便每次查询运行时,只显示一个学校。

现在,如果你想自动化,它会变得更复杂,因为参数会阻碍。

所以,我的build议是创build一个未绑定的表单,上面有一个combobox,显示学校列表。 然后,使用对该combobox的引用作为查询的条件,并使用它来驱动命令button后面的代码:

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 

现在,这并没有使这个过程自动化,但是至less可以很容易地连续输出每个报告。

如果你想让它自动化,一个简单的方法就是将表单绑定到Schools表,并将你的查询绑定到表单上学校名称的显示。 然后你可以通过命令button浏览表格的logging并输出每个学校的报告:

  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 

这将为您绑定到表格中的每个学校输出一个电子表格。

创build一个连接学校两个表格的查询会更简单,然后使用学校excel中的关键点作为页面,并使用显示页面将每个学校放在一个单独的页面上

如果你想做的更复杂的方式,那么在VBA,你需要从学校表中logging所有学校的logging集,以及来自具有所需字段的孩子数据的logging集和针对学校领域的参数。

然后在VBA中使用do循环控制,在school.EOF = false的同时继续进行,并为每个学校logging获取childdatalogging集,并将其放入Excel

我倾向于在Excel VBA中执行此操作,并使用copyfromrecordset将数据放入Excel中 – 这足以为每个学校创build一个新工作表,并将工作表名称设置为学校。 您需要将相关引用添加到VBA项目 – DAO或ADO – 才能连接到Access数据。

如上所述,您可以在string中使用“”来获得报价。 例:

 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;" 

还有一种方法是创build一个select查询来拉取数据,然后使用DoCmd.OutputTo:

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

您也可以使用DoCmd.TransferSpreadsheet:

 DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "MyQuery", "C:\Test.xls", True