ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: autumnalRain

[求助] GETROWS方法得到的数组为什么不可以直接转置写入到单元格中

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-13 11:19 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 百度不到去谷歌 于 2015-11-13 11:22 编辑
我是来讨说法的 发表于 2015-11-11 11:27
Application.Transpose转不了二维数组,严格的说,转不了多行多列的数组,只能是一列换成一行

这个是可以转的 只是有些数组大了 或者有错误值  或者连字符串太长了 会转不了
遇到这种情况需要自己写个数组转置函数来完成
附上一个我自己的转换函数
  1. Public Function Transpose2(arr) 'http://Excel880.com 自制转置函数,系统函数有缺陷,将二维数组行列转置
  2.     Dim brr, L1, U1, L2, U2, i&, j&
  3.     L1 = LBound(arr, 1): U1 = UBound(arr, 1)
  4.     L2 = LBound(arr, 2): U2 = UBound(arr, 2)
  5.     ReDim brr(L2 To U2, L1 To U1)
  6.     For i = L1 To U1
  7.         For j = L2 To U2
  8.             brr(j, i) = arr(i, j)
  9.         Next
  10.     Next
  11.     Transpose2 = brr
  12. End Function
复制代码


评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-13 16:31 | 显示全部楼层
感谢老师,学到知识了,没有花了,改日奉上,以表崇敬之情!

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-13 16:35 | 显示全部楼层
百度不到去谷歌 发表于 2015-11-13 11:19
这个是可以转的 只是有些数组大了 或者有错误值  或者连字符串太长了 会转不了
遇到这种情况需要自己写 ...

“如果实在想用数组输出,建议声明另一个行列与GetRows方数组相反的数组,用循环方式转置,然后将转置数组输出到工作表”

看来您和zhaogang1960老师答案异曲同工

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-13 16:49 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-11-13 17:02 编辑

附上百度不到到谷歌老师指导后的代码
  1. Dim arr
  2. Sub TEST()
  3. Dim CONN As Object, rst As Object
  4. strconn = "provider=microsoft.ACE.OLEDB.12.0;extended properties='Excel 12.0;hdr=yes';data source=" & ThisWorkbook.FullName '2007及以上
  5. 'strconn = "provider=microsoft.JET.OLEDB.4.0;extended properties='Excel 8.0;hdr=yes';data source=" & ThisWorkbook.FullName'2003
  6. Sql = "select * from [采集$] where 标题 not in (select 标题 from [查询$C4:C17])"
  7. Set CONN = CreateObject("ADODB.CONNECTION")
  8. Set rst = CreateObject("ADODB.recordset")
  9. CONN.Open strconn
  10. rst.Open Sql, CONN, 3, 3
  11. arr = rst.getrows
  12. 'Stop
  13. Sheets("采集").Cells.Value = ""
  14. For i = 1 To rst.Fields.Count
  15.      Sheets("采集").Cells(1, i) = rst.Fields(i - 1).Name
  16. Next
  17. x = UBound(arr, 2) + 1: y = UBound(arr, 1) + 1
  18. Sheets("采集").Range("a2").Resize(UBound(arr, 2) + 1, UBound(arr, 1) + 1) = Transpose2(arr)
  19. End Sub

  20. Public Function Transpose2(arr) 'http://Excel880.com 自制转置函数,系统函数有缺陷,将二维数组行列转置
  21.     Dim brr, L1, U1, L2, U2, i&, j&
  22.     L1 = LBound(arr, 1): U1 = UBound(arr, 1)
  23.     L2 = LBound(arr, 2): U2 = UBound(arr, 2)
  24.     ReDim brr(L2 To U2, L1 To U1)
  25.     For i = L1 To U1
  26.         For j = L2 To U2
  27.             brr(j, i) = arr(i, j)
  28.         Next
  29.     Next
  30.     Transpose2 = brr
  31. End Function
复制代码

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-13 16:51 | 显示全部楼层
附上百度不到去谷歌老师指导后的代码,再次表示感谢!

删除.rar

1.24 MB, 下载次数: 86

TA的精华主题

TA的得分主题

发表于 2017-4-13 10:32 | 显示全部楼层
有时getrows可以转置,有时不可以转置(除了NULL值可能还有别的不详原因),目前除了通过循环就是CopyFromRecordset了,没有别的办法。

TA的精华主题

TA的得分主题

发表于 2017-12-1 08:28 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
一般我都是通过辅助工作表来作为中转的,我不喜欢数组的循环赋值,

TA的精华主题

TA的得分主题

发表于 2018-7-23 20:41 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2019-7-28 22:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
大侠齐聚的贴,收藏了!

TA的精华主题

TA的得分主题

发表于 2019-8-15 12:58 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 xiaovba 于 2019-8-15 13:03 编辑
huang1314wei 发表于 2015-11-11 13:13
把数组当中的Null值转换成空值,就可以使用Application.Transpose转置否则报错

我现在遇到的情况是sql出来的数据集第一个值是空值,用application.transpose二次转置和一次转值均报错。

我的语句是:

Set rec = cnn.Execute(sql)
      
      arr = rec.GetRows              ‘报错
      Workbooks.Add
      [a1].CopyFromRecordset rec             '没有报错,但是无输出
      [a1].CopyFromRecordset cnn.Execute(sql)                         ’正常输出,显示数据集第一个值是空值,其余值对的
      brr = Application.Transpose(arr)                                      ‘报错,brr是variance类型
      brr=application.transpost(application.transpose(arr))         '报错
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-12-5 10:36 , Processed in 0.051769 second(s), 7 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

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