ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[求助] 将sql结果(含有空值null)赋值给数组出错时如何解决

[复制链接]

TA的精华主题

TA的得分主题

发表于 2018-4-23 14:30 | 显示全部楼层 |阅读模式
本帖最后由 香苦咖啡 于 2018-4-24 10:29 编辑

将sql结果(含有空值null)赋值给数组出错时如何解决
    Conn.Open strConn    '打开数据库链接
    Rst.Open strSQL, Conn, 1, 3    '执行查询,并将结果输出到记录集对象
'    Sheets(kcbh).Range("BA1:BA" & X).ClearContents
    If Rst.RecordCount > 0 Then
    ReDim Frr1(1 To 9, 1 To Rst.RecordCount)
    Frr1 = Rst.GetRows

1.rar

43.66 KB, 下载次数: 18

TA的精华主题

TA的得分主题

发表于 2018-4-23 15:02 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
试了一下。
Frr1 = Rst.GetRows 这步不会出错。

[a1].Resize(3, 1) = Application.Transpose(arr) 这个会出错

如果实在要这么用,用循环吧。

TA的精华主题

TA的得分主题

发表于 2018-4-23 15:42 | 显示全部楼层
将sql语句中空值处理,让null=""
sql = "select iif([a] is null,' ',a) from [DATA$]"

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-23 16:06 | 显示全部楼层
还是一样,非常奇怪,
Rst.Open strSQL, Conn, 1, 3    '执行查询,并将结果输出到记录集对象
执行后没有问题 但是无论下一句代码是什么都会出错

TA的精华主题

TA的得分主题

发表于 2018-4-23 16:14 | 显示全部楼层
香苦咖啡 发表于 2018-4-23 16:06
还是一样,非常奇怪,
Rst.Open strSQL, Conn, 1, 3    '执行查询,并将结果输出到记录集对象
执行后没有 ...

如果不涉及到机密,最好把文件传上来

TA的精华主题

TA的得分主题

发表于 2018-4-23 18:10 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
  1. Set oRS = Cn.Execute(strSql)
  2.     vRs = oRS.GetRows
  3.     ReDim vData(1 To UBound(vRs, 2) + 1, 1 To UBound(vRs) + 1) '如果要增加数据库字段标题,则(1 To UBound(vRs, 2) + 2, 1 To UBound(vRs) + 1)
  4.     oRS.MoveFirst
  5.     For nRow = 0 To UBound(vRs, 2)
  6.         For nCol = 0 To UBound(vRs)
  7.             'If nRow = 0 Then vData(1, nCol + 1) = oRS.Fields(nCol).Name '加数据库字段标题
  8. '            vData(nRow + 2, nCol + 1) = vRs(nCol, nRow) '数据
  9. '            vData(nRow + 2, nCol + 1) = IIf(IsNull(vData(nRow + 2, nCol + 1)), "", vData(nRow + 2, nCol + 1))'将null转空值
  10.             vData(nRow + 1, nCol + 1) = vRs(nCol, nRow) '数据
  11.             vData(nRow + 1, nCol + 1) = IIf(IsNull(vData(nRow + 1, nCol + 1)), "", vData(nRow + 1, nCol + 1))
  12.         Next
  13.     Next
复制代码

TA的精华主题

TA的得分主题

发表于 2018-4-23 21:03 | 显示全部楼层
transpose有很多限制啊;最好是新开个数组循环转过吧,比transpose速度还会快点。

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-24 10:11 | 显示全部楼层
测试 错误和数组没有关系
执行完Rst.Open strSQL, Conn, 1, 3 是有结果的 但是在f8就出错了

TA的精华主题

TA的得分主题

 楼主| 发表于 2018-4-24 10:31 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
xyxcc177 发表于 2018-4-23 16:14
如果不涉及到机密,最好把文件传上来

已经上传,麻烦再帮忙看看

TA的精华主题

TA的得分主题

发表于 2018-4-24 21:09 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
本帖最后由 ivccav 于 2018-4-24 21:16 编辑

很简单的问题,transpose不可以有Null,且行数不能超过65536,
这种问题直接定义一个函数来转就行了,速度比Excel自带的函数还要快很多!

且GetRows生成的数组不符合我们习惯的思维,本来就需要翻转一次,自定义函数,快速稳定。

Function transpose(drr)
    Dim brr(), L1&, U1&, L2&, U2&
    L1 = LBound(drr): U1 = UBound(drr)
    L2 = LBound(drr, 2): U2 = UBound(drr, 2)
    ReDim brr(L2 To U2, L1 To U1)
    For i = L1 To U1
        For j = L2 To U2
            If IsNull(drr(i, j)) Then drr(i, j) = ""
            brr(j, i) = drr(i, j)
        Next
    Next
    transpose = brr
End Function

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

本版积分规则

关闭

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

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

GMT+8, 2024-4-24 00:59 , Processed in 0.047861 second(s), 13 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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