|
今天在论坛上看到有个版友天涯沦落20131发帖求助:如何将当前子窗体数据导出至excel。
这个版友应该不算新手了,我很奇怪他为何还会问这类问题。事实上,在Access里导入导出,本不应该成为问题。一般来说,只要有数据源,不管是表还是查询,都可以导出数据。但打开附件的瞬间,我还是给惊到了。不多说,先上图。估计大部分新手都会犯这些错误:
①:没有用子窗体。——请注意,这个是“子窗体”控件,也就是“child”。通常情况下,我们是把子窗体(窗体)拖到主窗体上形成嵌套,这样更方便交互处理。用child控件无可厚非,但应该以部署方便为前提。如何使用child控件布局,可以看看点击这里,这里就不赘述了。
②:留意到这两个子窗体的空格了么?在Access里,有特殊符号(空格也算特殊符号)就有麻烦,有麻烦就会有人去论坛发帖。这个反反复复说了不知道多少次了。看到的没看到的都互相转告一下,重要事情说三遍:字段名,表名,查询名,窗体名,报表名……不要用空格!不要用空格!!不要用空格!!!
③:是不是没在图上看到第三个标识?对的,因为没法标出来。大家看到查询了吗?没有吧?话说,Access连查询都不想创建,你到底想干吗呢?
我也不知道他是不是对Access有什么误解,还是打算把极简主义进行到底。这让我想起一句经典的话,“不要和我比懒,我懒得和你比”。
这里还是想说一句,认认真真把Access基础看看,多看看论坛上的范例。别人是如何实现窗体上数据的导入导出的。例如,“刘小军常用窗体查询”里就有数据导入导出的应用。
我们还是先回到这个问题上来:
1、普通级:如何导出子窗体的数据?——通过读取子窗体上的数据源(查询或表)来导出。
2、噩梦级:如果子窗体没有创建查询呢?——通过读取子窗体上上的SQL语句,创建一个临时查询来导出。
3、地狱级:如果我不想打开子窗体,想通过child控件来切换呢?——通过绝对引用控件来读取子窗体,在根据1和2导出。
4、骨灰级:如果我的子窗体名字有空格呢?——对不起,任务结束。因为对于窗体类,有空格的情况下,没法处理。
接下来看看我们做了什么改变:
附上代码如下:
- Private Sub Command16_Click()
- Dim qry As DAO.QueryDef
-
- If Me.子窗体.SourceObject = "人员_统计表子窗体" Then
-
- Set qry = CurrentDb.CreateQueryDef("临时表", Form_人员_统计表子窗体.RecordSource)
-
- Else
- Set qry = CurrentDb.CreateQueryDef("临时表", Form_BOM子窗体.RecordSource)
- End If
-
- DoCmd.TransferSpreadsheet acExport, acSpreadsheetTypeExcel12Xml, "临时表", "d:\结果.xlsx", True
- DoCmd.DeleteObject acQuery, "临时表"
- End Sub
复制代码
写在最后的话:
事实上,这样写VBA还是不太妥当的。尤其是当数据源越来越多的时候,你准备写多少个“if”呢?在这个时候,我们应该如何处理呢?其实,通过选项卡控件(tab)的页就可以很好地解决这个问题。——有兴趣的版友可以试试。
最后再说一遍,不要觉着麻烦,必要的子窗体还是要创建的。child控件没法直接读取数据源。即便你hard code【硬编码】,通过sourceObject来读取到child的源对象,然后你还是要打开窗体才能读取它的数据源,解决的过程并不轻松。
此外,必要的查询也是应该创建的。虽说查询有255个的限制。但关于展示数据源的查询,个人觉得还是有必要创建的。至于操作查询,如果不想创建,你还可以通过docmd.runsql直接运行SQL语句达到增删改的目的。但选择查询,很多情况下会涉及多个条件变更等等,用VBA代码处理可能有些舍近求远。
也算是学Access这么多年的一点心得吧。听不听得进去,看个人了。
|
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
评分
-
查看全部评分
|