Office中国论坛/Access中国论坛
标题: [分享]导出数据表型子窗体内容到Excel [打印本页]
作者: 海狸先生 时间: 2005-8-16 03:19
标题: [分享]导出数据表型子窗体内容到Excel
看到网上的一些导出例子是用 复制拷贝 的方法 把子窗体内容导出,在记录多的时候就很慢
下面是我结合从网上找到的一些资料和查自带帮助 写下的,希望给大家带来方便
Private Sub ImportToExcel()
Dim oExcel As Object
Dim oBook As Object
Dim i As Integer
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add()
Me.子窗体.Form.Recordset.MoveFirst
For i = 0 To Me.子窗体.Form.Recordset.Fields.Count - 1
oBook.Worksheets(1).Cells(1, i + 1).Value = Me.子窗体.Form.Recordset.Fields(i).Name
Next
oBook.Worksheets(1).Range("A2").CopyFromRecordset Me.子窗体.Form.Recordset
oBook.SaveAs ("d:\Test.xls")
oBook.Close False
oExcel.Quit
Set oBook = Nothing
Set oExcel = Nothing
End Sub
[此贴子已经被作者于2005-8-15 19:23:51编辑过]
作者: 爱情插班生 时间: 2005-8-16 03:30
不用客气![em01][em01][em01]
作者: 海狸先生 时间: 2005-8-16 03:49
晕
作者: wu8313 时间: 2005-8-16 04:39
首先谢谢海狸先生的无私共享。
可是,我发现个问题,还请教一下:
参见贴图--
[attach]12465[/attach]
[此贴子已经被作者于2005-8-15 20:43:57编辑过]
作者: 海狸先生 时间: 2005-8-16 04:54
修改了一下,加入防错On Error GoTo erritDim oExcel As Object
Dim oBook As Object
Dim i As Integer
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add()
Me.子窗体.Form.Recordset.MoveFirst
For i = 0 To Me.子窗体.Form.Recordset.Fields.Count - 1
oBook.Worksheets(1).Cells(1, i + 1).Value = Me.子窗体.Form.Recordset.Fields(i).Name
Next oBook.Worksheets(1).Range("A2").CopyFromRecordset Me.子窗体.Form.Recordset
oBook.SaveAs ("d:\Test.xls")
MsgBox "导出成功"errexit:
oBook.Close False
oExcel.Quit
Set oBook = Nothing
Set oExcel = Nothing
Exit Suberrit:
MsgBox "错误号为" & Err.Number & " 错误说明:" & Err.Description
Resume errexit
作者: wu8313 时间: 2005-8-16 05:09
上述问题已经不存在,感谢。相信,也是可以作为成熟代码来使用了。我原来,总是拐弯地的另存 子窗体数据源 为一个临时表,然后导出,看来应该改掉了,还是觉得海狸先生给出的好。
作者: LucasLynn 时间: 2005-8-16 16:21
以下是引用wu8313在2005-8-15 21:09:00的发言:
上述问题已经不存在,感谢。相信,也是可以作为成熟代码来使用了。
我原来,总是拐弯地的另存 子窗体数据源 为一个临时表,然后导出,看来应该改掉了,还是觉得海狸先生给出的好。
你这样做也有好处,就是能够导出成多种格式,各有各的优点。
作者: 红寺 时间: 2005-8-16 18:25
http://support.microsoft.com/kb/247412/这里比较全,可以看看
作者: chajiangliang 时间: 2005-8-16 19:04
用ADO來操作Excel 又快﹐又靈活. 除非要特別的格式化﹐一般的也都可以搞定.http://www.office-cn.net/forum.php?mod=viewthread&tid=30811
作者: 红寺 时间: 2005-8-16 19:32
请问楼上的rivate Declare Function ShellExecute Lib "shell32.dll" Alias "ShellExecuteA" _
(ByVal hwnd As Long, ByVal lpszOp As String, _
ByVal lpszFile As String, ByVal lpszParams As String, _
ByVal LpszDir As String, ByVal FsShowCmd As Long) _
As Long
Private Const SW_NORMAL = 1此段代码什么情况下非要不可?我好像没看见哪里用到他
作者: chajiangliang 时间: 2005-8-16 19:57
打開文件時用到. ShellExecute Me.hwnd, "Open", App.Path & "\Results\Orders1.xls", "", "C:\", SW_SHOWNORMAL
作者: esmile 时间: 2005-8-17 05:43
提示: 作者被禁止或删除 内容自动屏蔽
作者: 李寻欢 时间: 2005-8-17 06:15
标题: 凑凑热闹^_^
[attach]12491[/attach]
Public Sub OutputSubForm(frmMainForm As Form, frmSubFormName As String)
'*****************************************************
'使用示例:OutputSubForm Me, Me.订单子窗体.Name
'http://www.accfans.net 李寻欢
'2005-08-16
'******************************************************
Dim strSql As String
Dim strRecordSource As String
Dim strLinkChildfields As String
Dim strLinkMasterFields As String
Dim strFilter As String
Dim blnFilterOn As Boolean
Dim strLinkSQL As String
Dim Rs As Recordset
Dim Qd As QueryDef
On Error GoTo Outputerr:
Set Rs = frmMainForm.Controls(frmSubFormName).Form.RecordsetClone
Set Qd = CurrentDb.CreateQueryDef("qryTemp")
strRecordSource = frmMainForm.Controls(frmSubFormName).Form.RecordSource
strLinkChildfields = frmMainForm.Controls(frmSubFormName).LinkChildFields
strLinkMasterFields = frmMainForm.Controls(frmSubFormName).LinkMasterFields
strFilter = frmMainForm.Controls(frmSubFormName).Form.Filter
blnFilterOn = frmMainForm.Controls(frmSubFormName).Form.FilterOn
If strLinkChildfields <> "" Then
Select Case Rs.Fields(strLinkChildfields)
Case dbChar
strLinkSQL = strLinkChildfields & "='" & frmMainForm.Controls(strLinkMasterFields) & "'"
Case Else
strLinkSQL = strLinkChildfields & "=" & frmMainForm.Controls(strLinkMasterFields)
End Select
End If
If blnFilterOn = True Then
If strLinkSQL <> "" Then
strLinkSQL = strLinkSQL & " and " & strFilter
Else
strLinkSQL = strFilter
End If
End If
If InStr(strRecordSource, "Select ") > 0 Then
strSql = Left(strRecordSource, Len(strRecordSource) - 2)
Else
strSql = "Select * From " & strRecordSource
End If
If InStr(strRecordSource, " where ") > 0 Then
If strLinkSQL <> "" Then
strSql = strSql & " and " & strLinkSQL
End If
Else
If strLinkSQL <> "" Then
strSql = strSql & " where " & strLinkSQL
End If
End If
Qd.SQL = strSql
DoCmd.OutputTo acOutputQuery, "qryTemp"
DoCmd.DeleteObject acQuery, "qryTemp"
Rs.Close
Set Rs = Nothing
Exit Sub
Outputerr:
Rs.Close
Set Rs = Nothing
If IsNull(DLookup("[Name]", "MSysObjects", "[Name] = 'qryTemp'")) = False Then
DoCmd.DeleteObject acQuery, "qryTemp"
End If
MsgBox Err.Description
End Sub
作者: 爱情插班生 时间: 2005-9-8 23:43
整理:1.子窗体导出,筛选,2. 奇怪的lookup_筛选字符....
并提出问题: 如何不导出隐藏列! swdq [attach]13010[/attach]
[em01][em01][em01]
[此贴子已经被作者于2005-9-9 17:45:01编辑过]
作者: hsn2914 时间: 2005-9-10 02:08
当一个掉到海里的人求救的时候,他所需要的是一个救生圈,而不是学游泳的方法。获救以后想必他自己会去学会游泳,因为不是每次都会有人及时地丢给你一个救生圈。非常感谢海狸先生!
作者: sea.er 时间: 2005-9-10 05:59
抛砖引玉,都是好东东[em02]
作者: GORYUNGBBS 时间: 2005-9-10 06:28
好东西,不过我不大明白.以下命令就可以实现. 不过没比较速度和格式如何.
docmd.OutputTo acOutputForm,formname,acformatXls,filename,autostart
作者: LucasLynn 时间: 2005-9-10 16:47
以下是引用hsn2914在2005-9-9 18:08:00的发言:
当一个掉到海里的人求救的时候,他所需要的是一个救生圈,而不是学游泳的方法。
获救以后想必他自己会去学会游泳,因为不是每次都会有人及时地丢给你一个救生圈。
非常感谢海狸先生!
我小时候我爸带我去江里手把手地教我学游泳,学了三年没学会,第四年夏天我爸不耐烦了,把我一个人丢在江中央,折腾到水面上快没动静了才把我捞上来,歇了一会儿又把我丢下去了,结果不到一礼拜,我就一个人在水里狗刨了。
作者: tmtony 时间: 2005-9-10 17:18
以下是引用LucasLynn在2005-9-10 8:47:00的发言:
我小时候我爸带我去江里手把手地教我学游泳,学了三年没学会,第四年夏天我爸不耐烦了,把我一个人丢在江中央,折腾到水面上快没动静了才把我捞上来,歇了一会儿又把我丢下去了,结果不到一礼拜,我就一个人在水里狗刨了。
倒是个好方法
作者: zyz218 时间: 2005-9-11 00:39
好贴就顶一下
作者: huanghai 时间: 2005-9-12 05:06
我也来加一帖,基础跟楼主的愿意差点不多,不家一种方法更简单,就是使用代码全选子窗体记录,然后复制,打开EXCEL粘贴即可,这样不要判断哪些字段显示了,哪些字段隐身了。我的代码如下。Function myOutputToExcel(Rst As Object) If (Rst.EOF Or Rst.BOF) And Rst.RecordCount = 0 Then
MsgBox "没有可导出的数据!", vbQuestion, gAppTitle
Exit Function
End If 'Dim xlsApp As Excel.Application
Dim xlsApp As Object Set xlsApp = CreateObject("Excel.Application")
xlsApp.Workbooks.Add
xlsApp.Visible = True Dim C As Integer With xlsApp.Workbooks(1).Worksheets(1)
For C = 0 To Rst.Fields.Count - 1
.Cells(1, C + 1) = Rst.Fields(C).Name
Next
Rst.MoveFirst
.Cells(2, 1).CopyFromRecordset Rst
.Cells.Select
xlsApp.ActiveWindow.Selection.Font.Size = 9
.Cells.EntireColumn.AutoFit
.Cells(1, 1).Select End WithEnd Function
作者: 午夜兰花 时间: 2005-9-15 17:04
到底谁的方法最好啊???
作者: wxf16 时间: 2005-9-22 23:08
good
作者: wxf16 时间: 2005-9-22 23:09
好!
作者: wxf16 时间: 2005-9-22 23:09
[em01]
作者: congee 时间: 2005-9-29 00:48
很精彩的描述
作者: LucasLynn 时间: 2005-9-29 01:10
标题: 我也来凑个热闹
导出窗体Recordset为任意Access支持格式的数据文件
以下代码将DAO的RecordSet(包括Access窗体的Recordset)中的当前数据导出为任何Access支持的导出格式。无论你这个Recordset是从窗体的,还是代码创建的,是筛选后结果,还是链接了字段的主窗体,本程序均能正确导出结果,格式包括任何Access支持的导出格式。
'调用范例
Private Sub Botton_Click()
Call Output_Recordset(Me.Recordset)
End Sub
<DIV class=quote>
'公共模块
Option Compare Database
Option Explicit
Public Sub Output_Recordset(ByRef frmRs As DAO.Recordset)
Dim frmField As DAO.Field
Dim daoDbs As DAO.Database
Dim daoRs As DAO.Recordset
Dim strSQL As String
Dim strFields As String
Set daoDbs = Application.CurrentDb
Set daoRs = frmRs.Clone
strSQL = "CREATE TABLE USysDAORecordsetOutport"
strFields = "("
For Each frmField In daoRs.Fields
strFields = strFields & frmField.Name & " "
Select Case frmField.Type
Case dbBigInt:
strFields = strFields & "Currency"
Case dbBinary:
strFields = strFields & "Binary"
Case dbBoolean:
strFields = strFields & "Bit"
Case dbByte:
strFields = strFields & "TinyInt"
Case dbChar:
strFields = strFields & "Char"
Case dbCurrency:
strFields = strFields & "Money"
Case dbDate:
strFields = strFields & "DateTime"
Case dbDecimal:
strFields = strFields & "Decimal"
Case dbDouble:
strFields = strFields & "Double"
Case dbFloat:
strFields = strFields & "Float"
Case dbGUID:
strFields = strFields & "Guid"
Case dbInteger:
strFields = strFields & "Integer"
Case dbLong:
strFields = strFields & "Long"
Case dbLongBinary:
strFields = strFields & "LongBinary"
Case dbMemo :
strFields = strFields & "Memo"
Case dbNumeric:
strFields = strFields & "Numeric"
Case dbSingle:
strFields = strFields & "Single"
Case dbText:
strFields = strFields & "Text(" & frmField.Size & ")"
Case dbTime:
strFields = strFields & "Time"
Case dbTimeStamp:
strFields = strFields & "DateTime"
Case dbVarBinary:
strFields = strFields & "VarBinary"
End Select
strFields = strFields & ","
Next frmField
strFields = Left(strFields, Len(strFields) - 1) & ")"
On Error Resume Next
daoDbs.Execute "DROP TABLE USysDAORecordsetOutport"
On Error GoTo 0
daoDbs.Execute strSQL & strFields
daoRs.MoveFirst
Do Until daoRs.EOF
strSQL = "INSERT INTO USysDAORecordsetOutport("
strFields = " Values("
For Each frmField In daoRs.Fields
If Not IsNull(frmField.Value) And Not IsEmpty(frmField.Value) Then
strSQL = strSQL & frmField.Name & ","
If frmField.Type = dbText Then
strFields = strFields & "'" & frmField.Value & "',"
Else
strFields = strFields & frmField.Value & ","
End If
End If
Next frmField
strSQL = Left(strSQL, Len(strSQL) - 1) & ")"
strFields = Left(strFields, Len(strFields) - 1) & ")"
daoDbs.Execute strSQL & strFields
daoRs.MoveNext
Loop
DoCmd.OutputTo acOutputTable, "USysDAORecordsetOutport"
daoDbs.Execute "DR
作者: zerosailing 时间: 2005-11-21 01:33
向无私的海里先生致敬!
作者: zerosailing 时间: 2005-11-21 01:40
还有Mr.LucasLynn和Mr. huanghai!!
作者: cdwlove 时间: 2005-12-5 21:35
有没有实例看看!!!
作者: ok003 时间: 2006-2-7 22:21
以下是引用esmile在2005-8-16 21:43:00的发言:
很好,其实改为通用函数岂不更好?
Public Sub rs2xls(rs As Object)
'将子窗体记录复制到XLS中
On Error GoTo errit
'set rs = Me.子窗体.Form.Recordset
Dim oExcel As Object
Dim oBook As Object
Dim i As Integer
Set oExcel = CreateObject("Excel.Application")
Set oBook = oExcel.Workbooks.Add()
rs.MoveFirst
For i = 0 To rs.Fields.Count - 1
oBook.Worksheets(1).Cells(1, i + 1).Value = rs.Fields(i).Name
Next
oBook.Worksheets(1).Range("A2").CopyFromRecordset rs
oBook.SaveAs ("C:\Book1.xls") ''我可以自己选择保存路径和文件名吗?
MsgBox "导出成功"
'打開文件時用到.
'ShellExecute Application.hWndAccessApp, "Open", "d:\Test.xls", "", "d:\", SW_NORMAL
errexit:
oBook.Close False
oExcel.Quit
Set oBook = Nothing
Set oExcel = Nothing
Exit Sub
errit:
MsgBox "错误号为" & Err.Number & " 错误说明:" & Err.Description
Resume errexit
End Sub
然后在窗体中调用即可:
Private Sub Command1_Click()
rs2xls subfrm.Form.Recordset '子窗体: subfrm
End Sub
我试了一下很好用,只是第二次导出时得把第一次导出的book1.xls挪开或者改名,不然的话就得覆盖了,我想请问可不可以选择路径和文件名
?
作者: ok003 时间: 2006-2-7 22:48
以下是引用爱情插班生在2005-9-8 15:43:00的发言:
整理:1.子窗体导出,筛选,2. 奇怪的lookup_筛选字符....
并提出问题: 如何不导出隐藏列! swdq [attach]13010[/attach]
[em01][em01][em01]
还有就是怎么导出字段的标题?我的表格设置字段名为字母,标题是汉字,怎么可以导出去的xls表标题也是汉字?
比如我要导出去的子窗体字段引用为"xm",字段的标题是"姓名",我想要导出去的表,标题是"姓名",而不是"xm"
[此贴子已经被作者于2006-2-7 14:49:09编辑过]
作者: h333 时间: 2006-4-28 00:45
真精彩
作者: ederais 时间: 2008-5-16 14:26
边顶边看边下~~
作者: ABCaccess 时间: 2008-6-1 12:57
谢谢你与大众分享
作者: chaojianan 时间: 2009-10-24 15:27
谢谢海狸先生。
作者: shines 时间: 2011-1-14 14:16
谢谢分享
欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) |
Powered by Discuz! X3.3 |