ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 12832|回复: 34

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

[复制链接]

TA的精华主题

TA的得分主题

发表于 2015-11-11 09:11 | 显示全部楼层 |阅读模式
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 autumnalRain 于 2015-11-11 17:00 编辑

求助贴子,希望实现的效果是[查询$]表里"标题"栏有的数据,在[采集$]表中将其记录删掉.使用RECORDSET方法的GETROWS方法将记录集转为数组。因为其特殊性,需要再次转置才能COPY到单元格区域。但在解答过程中这一行却总是报错。Sheets("采集").Range("a2").Resize(UBound(arr, 2) + 1, UBound(arr, 1) + 1) = Application.Transpose(arr)没办法只能采用注释掉的部分才能得到正确结果。
错误类型、错误代码行见见图示:请老师们指导下这行代码究竟错在哪里?


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





错误提示.png
错误代码行.png

删除.rar

1.24 MB, 下载次数: 55

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-11 09:21 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-11-11 09:23 编辑

应该不是RECORDSET的参数问题,虽然我不太明白参数的意思,但是能试的我都试过,都是
  • Sheets("采集").Range("a2").Resize(UBound(arr, 2) + 1, UBound(arr, 1) + 1) = Application.Transpose(arr)
出错!数组的维数用x = UBound(arr, 2) + 1: y = UBound(arr, 1) + 1测试得到的数字也都正确

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-11 09:27 | 显示全部楼层

不用GETROWS方法时:

本帖最后由 autumnalRain 于 2015-11-11 16:56 编辑

因为是在原数据区域操作,所以需要先清空原区域数据,然后再执行数据写入,除了标题行得到了外,操作记录集怎么没有了?
  1. Sub TEST()
  2. Dim CONN As Object, rst As Object
  3. strconn = "provider=microsoft.ACE.OLEDB.12.0;extended properties='Excel 12.0;hdr=yes';data source=" & ThisWorkbook.FullName '2007及以上
  4. 'strconn = "provider=microsoft.JET.OLEDB.4.0;extended properties='Excel 8.0;hdr=yes';data source=" & ThisWorkbook.FullName'2003
  5. Sql = "select * from [采集$] where 标题 not in (select 标题 from [查询$C4:C17])"
  6. Set CONN = CreateObject("ADODB.CONNECTION")
  7. Set rst = CreateObject("ADODB.recordset")
  8. CONN.Open strconn
  9. rst.Open Sql, CONN, 3, 3
  10. Sheets("采集").Cells.Value = ""
  11. For i = 1 To rst.Fields.Count
  12.      Sheets("采集").Cells(1, i) = rst.Fields(i - 1).Name
  13. Next
  14. Sheets("采集").Range("a2").CopyFromRecordset rst
  15. End Sub
复制代码

删除(不用GETROWS方法).rar

1.24 MB, 下载次数: 38

TA的精华主题

TA的得分主题

发表于 2015-11-11 11:27 | 显示全部楼层
Application.Transpose转不了二维数组,严格的说,转不了多行多列的数组,只能是一列换成一行

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-11 11:42 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-11-11 13:56 编辑
我是来讨说法的 发表于 2015-11-11 11:27
Application.Transpose转不了二维数组,严格的说,转不了多行多列的数组,只能是一列换成一行

谢谢老师,但是经在其它地方测试多行多列的二维数组也是可以转置的

TA的精华主题

TA的得分主题

发表于 2015-11-11 12:36 | 显示全部楼层
本帖最后由 huang1314wei 于 2015-11-11 13:12 编辑
我是来讨说法的 发表于 2015-11-11 11:27
Application.Transpose转不了二维数组,严格的说,转不了多行多列的数组,只能是一列换成一行

Application.Transpose可以转换多行多列的二维数组的,只不过如果二维数组当中有Null值时候,Application.Transpose函数会报错而以

评分

2

查看全部评分

TA的精华主题

TA的得分主题

发表于 2015-11-11 13:13 | 显示全部楼层
autumnalRain 发表于 2015-11-11 11:42
谢谢老师,我说怎么处理都不行呢!有花了给老师戴上

把数组当中的Null值转换成空值,就可以使用Application.Transpose转置否则报错

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-11 13:33 | 显示全部楼层

或者请老师给举个最简单的例子可以吗?

本帖最后由 autumnalRain 于 2015-11-11 13:41 编辑
huang1314wei 发表于 2015-11-11 13:13
把数组当中的Null值转换成空值,就可以使用Application.Transpose转置否则报错

象本例中,公司名称代码栏是NULL值吗?如果转成空值该怎么做?

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-11 13:45 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-11-11 13:58 编辑
huang1314wei 发表于 2015-11-11 13:13
把数组当中的Null值转换成空值,就可以使用Application.Transpose转置否则报错

我测试过了,多行多列的二维数组是可以转置的,但是NULL的情况不太懂。如下面,我将数据区域中的某一列全部清空只保留字段值时,还可以正常转置的,所以还请指导NULL的情况

TA的精华主题

TA的得分主题

 楼主| 发表于 2015-11-11 13:53 | 显示全部楼层
本帖最后由 autumnalRain 于 2015-11-11 14:03 编辑
  1. Sub test()
  2. arr = [a1].CurrentRegion
  3. Cells.ClearContents
  4. [a1].Resize(UBound(arr, 2), UBound(arr, 1)) = Application.Transpose(arr)
  5. End Sub
复制代码

测试多行多列数组转置.gif
测试数据.png

测试多行多列数组转置.rar

13.58 KB, 下载次数: 42

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关闭

最新热点上一条 /1 下一条

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

GMT+8, 2024-4-20 22:58 , Processed in 0.049373 second(s), 11 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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