Excel精英培训网

 找回密码
 注册
数据透视表40+个常用小技巧,让你一次学会!
查看: 3659|回复: 15

[已解决]请教个sql取值的问题

[复制链接]
发表于 2013-6-24 15:54 | 显示全部楼层 |阅读模式
在如下的程序取值时, 指标算法 字段值过长,取出后的单元格,只能看到部分(我看了下,只有256个字符),其他的部分就缺失了,麻烦帮忙看看,怎么修改能完整的取出数据,谢谢!
  1. Set conn = CreateObject("ADODB.Connection")
  2. conn.Open "dsn=excel files;dbq=" & ThisWorkbook.FullName
  3. Sql = "select  所在场景,'" & scene_name & "'," & data_h & ",指标ID, 指标名称,指标类型,'','','',指标来源表1,指标来源表2,指标来源表3,指标来源表4, 指标算法 from [场景指标字典数据$a:m] where 所在场景='" & scene_type & "' "
  4. Sheets("提取的场景级指标").[A3].CopyFromRecordset conn.Execute(Sql)
  5. conn.Close: Set conn = Nothing
复制代码
最佳答案
2013-6-25 20:54
本帖最后由 wcymiss 于 2013-6-25 20:57 编辑

啊哈,原来是数据类型在作怪。

长度不超过255的字符串,在数据库里的类型是adVarWChar,超过了就是adLongVarWChar类型。

sql结果集的数据类型,根据前8行来判断,你数据的前8行都是长度不超过255的字符串,所以该字段被默认为是adVarWChar类型,所有的数据最长只能为255个字符。
如果你数据的前8行里有超过255的字符串,该字段就会默认为是adLongVarWChar类型了,数据也会显示完整了。

这个8行在注册表里可修改,修改为0的话,系统就会根据所有的数据进行判断。不过这样运行效率将会降低不少。

代码修改:
Dim RegPath As String
RegPath = "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\Jet\4.0\Engines\Excel\TypeGuessRows"
CreateObject("WScript.shell").RegWrite RegPath, 0, "REG_DWORD"
这三句放在打开ado之前。是针对oledb的Jet连接的。别忘了ado的连接要用jet这句才有效。

ado关闭后别忘了恢复注册表的值:
CreateObject("WScript.shell").RegWrite RegPath, 8, "REG_DWORD"
发表于 2013-6-24 15:57 | 显示全部楼层
你这个要把值一个一个的写入Excel单元格才不会截断
回复

使用道具 举报

 楼主| 发表于 2013-6-24 15:59 | 显示全部楼层
吕?布 发表于 2013-6-24 15:57
你这个要把值一个一个的写入Excel单元格才不会截断

那怎么能让数据完整呢?
回复

使用道具 举报

发表于 2013-6-24 16:03 | 显示全部楼层
用截取函数放在2个单元格中
回复

使用道具 举报

 楼主| 发表于 2013-6-24 16:05 | 显示全部楼层
rexlei 发表于 2013-6-24 16:03
用截取函数放在2个单元格中

并不确定这个字段的数据长度,假如有2560个字符,就需要放到10个单元格么?有没有放到一个单元格的方法呢?
回复

使用道具 举报

发表于 2013-6-24 16:09 | 显示全部楼层
2530786302 发表于 2013-6-24 16:05
并不确定这个字段的数据长度,假如有2560个字符,就需要放到10个单元格么?有没有放到一个单元格的方法呢 ...

2560应该不能放在一个单元格中 我记得一个单元格中最多存1024个字符,512个汉字


回复

使用道具 举报

 楼主| 发表于 2013-6-24 16:31 | 显示全部楼层
rexlei 发表于 2013-6-24 16:09
2560应该不能放在一个单元格中 我记得一个单元格中最多存1024个字符,512个汉字

呵呵,只是假如而已……
根据目前sql取数的要求,既然是一个单元格的数据,用代码取值后,按理也应该可以在一个单元格呈现的,所以需要实现这个就可以呢
回复

使用道具 举报

发表于 2013-6-24 21:46 | 显示全部楼层
吕布已经回答了
回复

使用道具 举报

 楼主| 发表于 2013-6-24 22:49 | 显示全部楼层
开辆小富康 发表于 2013-6-24 21:46
吕布已经回答了
  1. Set sht = ThisWorkbook.Worksheets("提取的场景级指标")
  2. sht.Cells(i, 10) = rs("指标来源表1")
  3. sht.Cells(i, 11) = rs("指标来源表2")
  4. sht.Cells(i, 12) = rs("指标来源表3")
  5. sht.Cells(i, 13) = rs("指标来源表4")
  6. sht.Cells(i, 14) = rs("指标算法")
复制代码
这样的方式么?我试过,数据还是被截断了呢
回复

使用道具 举报

发表于 2013-6-25 14:19 | 显示全部楼层
连接语句conn.Open "dsn=excel files;dbq=" & ThisWorkbook.FullName
改成:
conn.Open "Provider=Microsoft.jet.OLEDB.4.0;Extended Properties=Excel 8.0;Data Source=" & ThisWorkbook.FullName

conn.Open "Provider=Microsoft.ACE.OLEDB.12.0;Extended Properties=Excel 12.0;Data Source=" & ThisWorkbook.FullName
前者是2003适用,后者高版本适用。


回复

使用道具 举报

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

本版积分规则

小黑屋|手机版|Archiver|Excel精英培训 ( 豫ICP备11015029号 )

GMT+8, 2024-5-3 03:38 , Processed in 0.406341 second(s), 10 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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