Access911.net   |   a9BBS   |   OTaA System  
  搜索文章:  
Access911欢迎您光临  
   主页      上传      繁體版       论坛     
设为首页  |  加入收藏   
  
你现在的位置:文章索引 -> 文章分类 -> 窗体  
 首页|  近日更新|  下载  |  文章索引  |  搜索|  术语|  承接工程|  
 
系统正在加载内容,请耐心等待...
 
 查询
 窗体
 报表
 
 
 VBA
 函数
 ADO/DAO/ADO.NET
 API
 ADP
 安全
 发布
 OA
 ASP/ASP.NET
 其他语言
 控件
 DELPHI
 C#/.Net
 本站
 其他
 小例程
 常用软件
 参考文档
 业主作品
 网友大作
 
 
友情链接
 access911.net
 
访问人次
 1701905
 
站长 E-Mail
 net911@sina.com
 access911@gmail.com
 
RSS 订阅

显示附加信息 >>>

如何在导出表到EXCEL时让用户随意选择字段?

作者:cg1  摘自:access911.net  :cg1  更新日期:2008-4-17  浏览人次:

 

问题:

如何用 VBA 在查询 和 表里有条件的选择 字段 然后导入到 EXCEL 里?
如何在导出表到EXCEL时让用户随意选择字段?

 

方法一:

两种方法,原理都一样:根据用户选择,动态生成查询,这个查询的列就是用户要输出的列,再用 OutPutTo 输出即可。但是界面表现不一样。
方法一,用子窗体的数据表视图,这样用户可以右键单击某列,然后选择隐藏。程序中只要判断一下,隐藏的列不输出就可以了
图片如下:
按此在新窗口浏览图片

Private Sub Command1_Click()
    Dim ctl As Control
    Dim strSQL As String
    
    '扫描子窗体上所有的控件,如果是文本框或者组合框,就判断是否被用户隐藏了
    For Each ctl In Me.sub1.Form.Controls
        '注意,这个判断还能继续添加,比如复选框也可以
        If ctl.ControlType = acTextBox Or _
            ctl.ControlType = acComboBox Then
            '如果用户隐藏了列,就说明用户不需要打印,在组织SQL语句的时候也不加进去了
            If ctl.ColumnHidden = False Then
                strSQL = strSQL & "[" & ctl.ControlSource & "],"
            End If
        End If
    Next
    
    '修饰一下 SQL 语句
    If Len(strSQL) > 0 Then
        strSQL = Mid(strSQL, 1, Len(strSQL) - 1)
        '注意:Me.sub1.Form.RecordSource 必须是一个表名或者查询名,不允许是sql语句
        strSQL = "select " & strSQL & " from " & Me.sub1.Form.RecordSource
        Debug.Print strSQL
        UpdateView "~tmp打印临时", strSQL
        DoCmd.OutputTo acOutputQuery, "~tmp打印临时", acFormatXLS, CurrentProject.path & "\" & Me.sub1.Form.RecordSource & ".xls"
        MsgBox "输出已完成,请查看以下文件" & CurrentProject.path & "\" & Me.sub1.Form.RecordSource & ".xls"
    Else
        MsgBox "没有选定任何字段,无法进行输出"
    End If
    
End Sub


'ControlType的常量
'常量 控件
'acBoundObjectFrame 绑定对象框
'acCheckBox 复选框
'acComboBox 组合框
'acCommandButton 命令按钮
'acCustomControl ActiveX(自定义)控件
'acImage 图像
'acLabel 标签
'acLine 线条
'acListBox 列表框
'acObjectFrame 未绑定对象框或图表
'acOptionButton 选项按钮
'acOptionGroup 选项组
'acPage 页
'acPageBreak 分页符
'acRectangle 矩形
'acSubform 子窗体 / 子报表
'acTabCtl 选项卡
'acTextBox 文本框
'acToggleButton 切换按钮


Function UpdateView(ByVal viewName As String, ByVal sql As String)
On Error Resume Next
    Dim strSQL As String
    
    '如果系统中已经存在这个查询,先删除;
    '如果不存在,则会出错,不过没关系,前面已经用 On Error Resume Next 屏蔽错误了。
    strSQL = "drop view [" & viewName & "]"
    Debug.Print strSQL
    CurrentProject.Connection.Execute strSQL
    Debug.Print Err.Description
    
    '创建一个新的查询
    strSQL = "create view [" & viewName & "] as " & sql
    Debug.Print strSQL
    CurrentProject.Connection.Execute strSQL
    Debug.Print Err.Description
    
        
    '注意,也可以使用 Dao 方式,这样即使是参数查询也不会出错了
    
'    '如果系统中已经存在这个查询,先删除;
'    '如果不存在,则会出错,不过没关系,前面已经用 On Error Resume Next 屏蔽错误了。
'    CurrentDb.QueryDefs.Delete viewName
'    '创建一个新的查询
'    CurrentDb.CreateQueryDef viewName, sql
    
End Function



示例下载:
http://access911.net/down/eg/eg_columnselectionexport.rar
 (199KB)


 


方法二:

方法二,使用组合框显示所有表和查询,列表框显示所有字段,编程量更大,但是可重用性更好一点。
图片如下:
按此在新窗口浏览图片



'选择表名或者查询名
Private Sub Combo0_AfterUpdate()
    Me.List2.RowSource = Me.Combo0.Value
    Me.List4.RowSource = ""
End Sub

'根据选择,实行输出
Private Sub Command6_Click()
    Dim strSQL As String
    For i = 0 To Me.List4.ListCount - 1
        strSQL = strSQL & "[" & Me.List4.Column(0, i) & "],"
    Next
    '修饰一下 SQL 语句
    If Len(strSQL) > 0 Then
        strSQL = Mid(strSQL, 1, Len(strSQL) - 1)
        '注意:Me.sub1.Form.RecordSource 必须是一个表名或者查询名,不允许是sql语句
        strSQL = "select " & strSQL & " from " & Me.Combo0.Value
        Debug.Print strSQL
        UpdateView "~tmp打印临时", strSQL
        DoCmd.OutputTo acOutputQuery, "~tmp打印临时", acFormatXLS, CurrentProject.path & "\" & Me.Combo0.Value & ".xls"
        MsgBox "输出已完成,请查看以下文件" & CurrentProject.path & "\" & Me.Combo0.Value & ".xls"
    Else
        MsgBox "没有选定任何字段,无法进行输出"
        
    End If
    
End Sub

'动态生成查询
Function UpdateView(ByVal viewName As String, ByVal sql As String)
On Error Resume Next
    '如果系统中已经存在这个查询,先删除;
    '如果不存在,则会出错,不过没关系,前面已经用 On Error Resume Next 屏蔽错误了。
    CurrentDb.QueryDefs.Delete viewName
    '创建一个新的查询
    CurrentDb.CreateQueryDef viewName, sql
End Function

'窗体打开时自动从数据库中读取所有的表名和查询名,并在 combo0 中显示出来
Private Sub Form_Open(Cancel As Integer)
    Dim tbl As TableDef
    Dim qry As QueryDef
    For Each tbl In CurrentDb.TableDefs
        Me.Combo0.AddItem "表:" & tbl.Name & ";" & tbl.Name
    Next
    For Each qry In CurrentDb.QueryDefs
        If qry.Type = dbQSelect Or qry.Type = dbQSetOperation Then
            Me.Combo0.AddItem "查询:" & qry.Name & ";" & qry.Name
        End If
    Next
    
    
End Sub


'双击左侧列表框可以将需要打印的字段加入右侧列表框
Private Sub List2_DblClick(Cancel As Integer)
    Dim i As Long
    Dim blnRepeat As Boolean
    
    '为了避免重复,这里会多做一个判断
    For i = 0 To Me.List4.ListCount - 1
        If Me.List4.Column(0, i) = Me.List2.Value Then
            blnRepeat = True
            Exit For
        End If
    Next
    
    If blnRepeat = False Then
        Me.List4.AddItem Me.List2.Value
    End If
End Sub

'双击右侧列表框可以删除不需要打印的字段
Private Sub List4_DblClick(Cancel As Integer)
    Me.List4.RemoveItem Me.List4.ListIndex
End Sub



示例下载:
http://access911.net/down/eg/eg_columnselectionexport.rar
 (199KB)

 


本站文章旨在为该问题提供解决思路及关键性代码,并不能完成应该由网友自己完成的所有工作,请网友在仔细看文章并理解思路的基础上举一反三、灵活运用。

access911.net 原创文章,作者本人对文章保留一切权利。
如需转载必须征得作者同意并注明本站链接

 

 
相关文章
     没有手动相关文章
     如何将整个 MDB 中所有的表全部导出到一个 XLS 中去?
     一个将数据导出到EXCEL的存储过程
     新手来看:我是否可以将Excel数据导入?
     新手来看:如何将数据表导出备份到excel表格
     Excel当有多列合并单元格时如何只选中其中一列?
     如何制作复杂报表——利用Excel输出复杂报表
     如何将ACCESS MDB 中的表导出成文本格式
     如何实现ACCESS数据及对象的导入导出?
     如何将表导出为ASP文件?
     SQL SERVER 与ACCESS、EXCEL的数据转换
 
评论
     查看或发表更多的评论,请单击这里。
 
 
 
 
 
   
  Access911.net   |   a9BBS   |   OTaA System   |
建站日期:2000年4月2日  |  设计施工:陈格 ( access911 & cg1 )
 Copyright © 2000 - 2003 COMET, 陈格 保留所有权利