设为首页收藏本站Access中国

Office中国论坛/Access中国论坛

 找回密码
 注册

QQ登录

只需一步,快速开始

返回列表 发新帖
查看: 9485|回复: 5
打印 上一主题 下一主题

[Access本身] 转置小技巧——浅谈GetRows的使用

[复制链接]
跳转到指定楼层
1#
发表于 2015-11-17 16:29:26 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
        今天有个叫“猫哥”的群友私信给我,提及如何转置保存数据。当时的反应是,Recordset里好像是没有这个的。所以推荐他使用Excel里的Transpose内置函数来处理,大体思路是用GetRows来讲记录集转为数组,然后再Transpose,再赋值给单元格区域。       后来回头去看看以前写的帖子,发现使用GetRows时,——实话说,我很少用这个方法{:soso_e110:}——已经把行列置换了。换句话说,根本不必再用Transpose了,只需要将单元格重置成符合维度的区域即可。

  1. '函数说明:
  2. '作用:..........................................导出数据,或转置导出数据
  3. '引用库:........................................Excel库、ADO库。
  4. '附件:..........................................根目录下需包含文件ExportData空白工作表,用于存储数据
  5. '参数:
  6. '      strSQL....................................必选,SQL查询语句
  7. '      isTranspose...............................可选,是否转置,默认为不转置。
  8. '调用方法:
  9. 'Call ExportData("第三季度套餐",True)............转置导出表“第三季度套餐”的数据。
  10. '其它:
  11. '由于使用了Excel组件,因此导出数据时比普通的DoCmd.TransferSpreadsheet运行要慢,建议需要转置时再使用本函数。


  12. Function ExportData(ByVal strSQL As String, Optional ByVal isTranspose As Boolean = False)
  13.    
  14.     Dim rst As New ADODB.Recordset
  15.    
  16.     Dim exl As New Excel.Application
  17.     Dim wb As Workbook
  18.     Dim wsh As Worksheet
  19.     '定以数组,arrFields用于存放表头,arrData用于转置数据
  20.     Dim arrFields, arrData
  21.    
  22.     Dim i As Long
  23.    
  24.     rst.Open strSQL, CurrentProject.Connection, adOpenKeyset, adLockOptimistic
  25.     '打开工作簿
  26.     Set wb = exl.Workbooks.Open(CurrentProject.Path & "\ExportData.xls")
  27.     Set wsh = wb.ActiveSheet
  28.     '清除旧数据
  29.     wsh.Cells.ClearContents
  30.     '重定以数组维度,以便存放表头独居
  31.     ReDim arrFields(rst.Fields.Count - 1)
  32.    
  33.     For i = 0 To rst.Fields.Count - 1
  34.         arrFields(i) = rst.Fields(i).Name
  35.     Next
  36.    
  37.     If isTranspose Then
  38.         arrData = rst.GetRows()
  39.         '处理表头:
  40.         'Resize用于扩展区域。需要注意的是,单元格作为数组来存储数据,是从1开始的,因此后面所有的单元格都要resize到Ubound+1
  41.          wsh.Range("A1").Resize(UBound(arrFields) + 1) = exl.WorksheetFunction.Transpose(arrFields)
  42.          wsh.Range("B1").Resize(UBound(arrData, 1) + 1, UBound(arrData, 2) + 1) = arrData
  43.     Else
  44.         wsh.Range("A1").Resize(, UBound(arrFields) + 1) = arrFields
  45.         wsh.Range("A2").CopyFromRecordset rst
  46.     End If
  47.     '保存并退出Excel
  48.     wb.Save
  49.     wb.Close
  50.     exl.Quit
  51.     '关闭记录集
  52.     rst.Close
  53. End Function
复制代码

       这里涉及到Excel单元格的CopyFromRecordset方法以及Resize重置单元格区域范围【其实这时候的单元格相当于一个可扩展的1×1数组】,数组的一些基本属性使用(例如Ubound判断某个维度的上限,Transpose用于转置数组
       此贴就当做Recordset的番外篇吧。有兴趣的版友可以结合以下帖子来看:
      http://www.office-cn.net/thread-119067-1-1.html

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

评分

参与人数 1经验 +12 收起 理由
tmtony + 12 (其它)优秀教程、原创内容、以资鼓励、其.

查看全部评分

分享到:  QQ好友和群QQ好友和群 QQ空间QQ空间 腾讯微博腾讯微博 腾讯朋友腾讯朋友
收藏收藏1 分享分享 分享淘帖 订阅订阅

点击这里给我发消息

2#
发表于 2015-11-17 16:30:54 | 只看该作者
Access Excel 跨界 更强大!

点击这里给我发消息

3#
发表于 2015-11-18 08:58:52 | 只看该作者
真不错!{:soso_e179:}
4#
发表于 2016-4-14 17:06:32 | 只看该作者
很厉害的样子
5#
发表于 2016-4-20 09:12:21 | 只看该作者
这个有用,收藏了
6#
发表于 2019-11-11 08:52:44 | 只看该作者
好例子,acces+excel 太强大了
您需要登录后才可以回帖 登录 | 注册

本版积分规则

QQ|站长邮箱|小黑屋|手机版|Office中国/Access中国 ( 粤ICP备10043721号-1 )  

GMT+8, 2024-11-13 14:03 , Processed in 0.092102 second(s), 31 queries .

Powered by Discuz! X3.3

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表