如何在Access VBA/SQL中创建循环以选择记录并输出到Excel?
我需要一些关于在Access中将VBA/SQL代码写入模块的帮助,该模块应执行以下操作:如何在Access VBA/SQL中创建循环以选择记录并输出到Excel?,sql,excel,ms-access,vba,loops,Sql,Excel,Ms Access,Vba,Loops,我需要一些关于在Access中将VBA/SQL代码写入模块的帮助,该模块应执行以下操作: 循环浏览表“学校”,只包含一个字段(学校名称) 使用第一个表中的每个值从表'ChildData'中选择记录,其中包含几个关于单个孩子的字段,包括他们就读的学校(SchoolName) 对于每所学校,将其在校学生的数据导出到以该学校命名的单独Excel工作簿中 有人能给我一些出发点吗?请注意,我对VBA或SQL都知之甚少,而且我几乎是从零开始的,因此即使是最基本的解释也会非常有用 谢谢, AVN创建一个连
- 循环浏览表“学校”,只包含一个字段(学校名称)
- 使用第一个表中的每个值从表'ChildData'中选择记录,其中包含几个关于单个孩子的字段,包括他们就读的学校(SchoolName)
- 对于每所学校,将其在校学生的数据导出到以该学校命名的单独Excel工作簿中
AVN创建一个连接学校上两个表的查询,然后使用excel中的pivot和school作为页面,并使用show页面将每个学校放在一个单独的页面上,这样会更简单 如果要以更复杂的方式执行此操作,则在VBA中,需要从显示所有学校的“学校”表中获取一个记录集,从具有必填字段的childdata中获取一个记录集,以及针对“学校”字段的一个参数 然后在VBA中使用do循环控件,该控件在school.EOF=false时进行,并为每个学校记录获取childdata记录集,并将其放入Excel
我倾向于在Excel VBA中执行此操作,并使用copyfromrecordset将数据放入Excel-非常简单,可以为每个学校创建一个新的工作表,并将工作表名称设置为“学校”。您需要添加对VBA项目的相关引用(DAO或ADO),以便能够连接到Access数据。创建一个连接学校上两个表的查询,然后使用excel中的pivot(学校)作为页面,并使用show(显示)页面将每个学校放在单独的页面上,这样会更简单 如果要以更复杂的方式执行此操作,则在VBA中,需要从显示所有学校的“学校”表中获取一个记录集,从具有必填字段的childdata中获取一个记录集,以及针对“学校”字段的一个参数 然后在VBA中使用do循环控件,该控件在school.EOF=false时进行,并为每个学校记录获取childdata记录集,并将其放入Excel
我倾向于在Excel VBA中执行此操作,并使用copyfromrecordset将数据放入Excel-非常简单,可以为每个学校创建一个新的工作表,并将工作表名称设置为“学校”。您需要添加VBA项目的相关引用—DAO或ADO—才能连接到Access数据。在您的问题中,我看不到任何表示您需要任何复杂内容的内容 第一步是创建一个连接学校和学生的查询,当查询运行时,通过菜单导出到Excel。如果这样做有效,那么您需要修改它,以便一次输出一所学校。实现这一点的“简单”方法是在查询中添加一个有关学校的参数,以便每次查询运行时,只显示一个学校 现在,如果你想自动化,它会变得更复杂,因为参数会妨碍你 因此,我的建议是创建一个未绑定的表单,表单上有一个组合框,显示学校列表。然后使用对该组合框的引用作为查询条件,并使用该引用在命令按钮后面驱动代码:
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
现在,这并不能使过程自动化,但至少可以使连续输出每个报告变得容易
如果希望它自动化,一种简单的方法是将表单绑定到Schools表,并将查询绑定到表单上学校名称的显示。然后,您可以使用命令按钮浏览表单记录并输出每个学校的报告:
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
这将在您绑定到表单的表格中输出每个学校的电子表格。我看不到您的问题中有任何表明您需要任何复杂内容的内容 第一步是创建一个连接学校和学生的查询,当查询运行时,通过菜单导出到Excel。如果这样做有效,那么您需要修改它,以便一次输出一所学校。实现这一点的“简单”方法是在查询中添加一个有关学校的参数,以便每次查询运行时,只显示一个学校 现在,如果你想自动化,它会变得更复杂,因为参数会妨碍你 因此,我的建议是创建一个未绑定的表单,表单上有一个组合框,显示学校列表。然后使用对该组合框的引用作为查询条件,并使用该引用在命令按钮后面驱动代码:
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
现在,这并不能使过程自动化,但至少可以使连续输出每个报告变得容易
如果希望它自动化,一种简单的方法是将表单绑定到Schools表,并将查询绑定到表单上学校名称的显示。然后,您可以使用命令按钮浏览表单记录并输出每个学校的报告:
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
这将为您绑定到表单的表中的每个学校输出一个电子表格。如前所述,您可以在字符串中使用“”来获取报价。例如:
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;"
还有一种方法是创建一个select查询来提取数据,然后使用DoCmd.OutputTo:
DoCmd.OutputTo acOutputQuery,"MyQuery",acFormatXLS,"C:\Test.xls"
您还可以使用DoCmd.TransferSpreadsheet:
DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel8, "MyQuery", "C:\Test.xls", True
如前所述,您可以在字符串中使用“”来获取引号。例如:
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;"
还有一个