Office中国论坛/Access中国论坛

标题: 转置小技巧——浅谈GetRows的使用 [打印本页]

作者: roych    时间: 2015-11-17 16:29
标题: 转置小技巧——浅谈GetRows的使用
        今天有个叫“猫哥”的群友私信给我,提及如何转置保存数据。当时的反应是,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
复制代码
[attach]57479[/attach]
       这里涉及到Excel单元格的CopyFromRecordset方法以及Resize重置单元格区域范围【其实这时候的单元格相当于一个可扩展的1×1数组】,数组的一些基本属性使用(例如Ubound判断某个维度的上限,Transpose用于转置数组
       此贴就当做Recordset的番外篇吧。有兴趣的版友可以结合以下帖子来看:
      http://www.office-cn.net/thread-119067-1-1.html

作者: tmtony    时间: 2015-11-17 16:30
Access Excel 跨界 更强大!
作者: zhuyiwen    时间: 2015-11-18 08:58
真不错!{:soso_e179:}
作者: 522650696    时间: 2016-4-14 17:06
很厉害的样子
作者: 李力军2    时间: 2016-4-20 09:12
这个有用,收藏了
作者: yanwei82123300    时间: 2019-11-11 08:52
好例子,acces+excel 太强大了




欢迎光临 Office中国论坛/Access中国论坛 (http://www.office-cn.net/) Powered by Discuz! X3.3