2009-09-21 17 views
1

我需要写一些VBA/SQL代码到Access中的一个模块,它应该做以下一些帮助:如何在Access VBA/SQL中创建一个循环来选择记录并输出到Excel?

  • 遍历表“学校”,只有一个字段(SchoolName) 。

  • 使用在第一个表的每个值从表“ChildData”选择记录,有个别孩子的几个领域,包括他们参加(SchoolName)哪所学校。

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

任何人都可以给我任何出发点吗?请注意,我对VBA或SQL几乎一无所知,而且几乎从头开始,因此即使是最基本的解释也会非常有帮助!

感谢, AVN

+0

您是否可以创建包含学校和ChildData的查询? – JeffO 2009-09-21 14:58:02

+0

我有一张桌子,里面包含了我需要的所有信息,是您的意思吗? 也许我已经过度复杂了,建议通过一个单独的列表中所有的学校,并逐个拉出来? – AVN 2009-09-21 15:13:31

回答

0

它会更简单,以创造其加入学校的两个表的查询,然后使用Excel中枢轴与学校的网页,并使用show页面获得每个学校在一个单独的页面上

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

然后在VBA中使用DO循环控制,其进行的同时school.EOF = false,并为每所学校记录获得childdata记录,并把它到Excel

我会倾向于做这在Excel VBA并使用copyfromrecordset将数据放入Excel中 - 简单地为每个学校创建一个新工作表并将工作表名称设置为学校。您需要将相关引用添加到VBA项目 - DAO或ADO - 才能连接到Access数据。

+0

我真的需要它将每个学校的数据输出到一个单独的文件,因为这些数据将发送到学校,我们必须保护个人的儿童数据。 所以不幸的是,它必须是比数据透视表更复杂的方法。 另外,我宁愿在一个单一的Access数据库中做所有的工作,因为每月运行这个报告的人在访问或excel上都不那么热,所以我想要“一次点击”可能。 访问选项的更多提示? – AVN 2009-09-21 14:57:50

1

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

第一步是创建一个连接学校和学生的查询,当它运行时,通过菜单导出到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 

这将输出为表中的每个学校你已经绑定到形式的电子表格。

+0

谢谢大卫,看起来它会做我想做的。 我会在接下来的几天尝试一下,让你知道。 Avn – AVN 2009-09-22 09:11:04

0

如前所述,您可以在字符串内使用“”来获得报价。例如:

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 
相关问题