Excel精英培训网

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

vba中使用index字符数为什么不能超过255?

  [复制链接]
发表于 2011-7-20 01:14 | 显示全部楼层 |阅读模式
rt同样的语句,当第1个参数中某单元格的字符数超过255时,index就不可用了.
为什么?

test.rar (9.72 KB, 下载次数: 20)
发表于 2011-7-20 10:58 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2011-7-20 10:59 | 显示全部楼层
回复

使用道具 举报

发表于 2011-7-20 11:10 | 显示全部楼层
Zipall 发表于 2011-7-20 10:59
回复 爱疯 的帖子

10是2位数

b10=REPT(ROW(),127),可以
b10=REPT(ROW(),128),就不可以了。

即,也就是引用工作表函数时,数组元素字符长度>255就出错了。


回复

使用道具 举报

 楼主| 发表于 2011-7-20 11:18 | 显示全部楼层
回复 爱疯 的帖子

想知道为什么?
回复

使用道具 举报

发表于 2011-7-20 11:52 | 显示全部楼层
我曾问过另一个类似问题,当时吕布版主找出原因了。
'MS原文:http://support.microsoft.com/kb/832136/zh-cn/
MS对那个问题有交代,我测试验证过。

  1. Sub Test1()
  2.     Dim s As String, Arr(0) As String
  3.     On Error Resume Next
  4.     Do Until Err.Number = 1004
  5.         s = s & "A"
  6.         Arr(0) = s
  7.         Range("A1") = Arr
  8.     Loop
  9.     MsgBox Len(s)
  10.     '03返回912
  11.     '07返回8204
  12.     '10返回8204
  13. End Sub
复制代码
如今,你的问题是在这问题基础上,又加了一个条件(引用工作表函数)。我用上面方式作了部分测试:



  1. Sub Test2()
  2.     Dim s As String
  3.     Dim Arr(1 To 1, 1 To 1) As String
  4.     Dim x As Long
  5.     On Error Resume Next
  6.     Do Until Err.Number <> 0
  7.         s = s & "A"
  8.         Arr(1, 1) = s
  9.         Range("A1") = Application.WorksheetFunction.Index(Arr, 0, 1)
  10.     Loop
  11.     x = Len(s)
  12.     Stop    'x=32768
  13. End Sub
  14. Sub Test3()
  15.     Dim s As String
  16.     Dim Arr(1 To 1, 1 To 1) As String
  17.     Dim x As Long
  18.     On Error Resume Next
  19.     Do Until Err.Number <> 0
  20.         s = s & "A"
  21.         Arr(1, 1) = s
  22.         Range("A1") = Application.WorksheetFunction.Index(Arr, 1, 0)
  23.     Loop
  24.     x = Len(s)
  25.     Stop    'x=32768
  26. End Sub
  27. Sub Test4()
  28.     Dim s As String
  29.     Dim Arr() As Variant
  30.     Dim x As Long
  31.     On Error Resume Next
  32.     Do Until Err.Number <> 0
  33.         s = s & "A"
  34.         Arr = [a1:b2].Value
  35.         Arr(1, 1) = s
  36.         Arr(1, 2) = s
  37.         Arr(2, 1) = s
  38.         Arr(2, 2) = s
  39.         Range("A1:A2") = Application.WorksheetFunction.Index(Arr, 0, 1)
  40.     Loop
  41.     x = Len(s)
  42.     Stop    'x=256
  43. End Sub
复制代码

我猜想,是因为单元格赋值给数组后,MS为避免用户出错,所以做了“人性化”处理吧(即限制不能>255)。
可惜,没找着MS对此的原文解释。


回复

使用道具 举报

 楼主| 发表于 2011-7-20 12:38 | 显示全部楼层
本帖最后由 Zipall 于 2011-7-20 12:41 编辑

回复 爱疯 的帖子

谢谢你给的链接和测试.
我进一步测试,发现和arr的变量类型有关.



  1. Sub Test4()
  2.     Dim Arr(0)
  3.     Arr(0) = WorksheetFunction.Rept(1, 32767)
  4.     Range("A1") = Application.Index(Arr, 0, 1)
  5.     MsgBox Len([A1])
  6. End Sub
复制代码

上面的会报错,下面的则不会.

  1. Sub Test5()
  2.   Dim Arr(0) As String
  3.   Arr(0) = WorksheetFunction.Rept(1, 32767)
  4.   Range("A1") = Application.Index(Arr, 0, 1)
  5.    MsgBox Len([A1])
  6. End Sub
复制代码


说明问题和这个 Variant 数据类型有关.
那么现在的问题就是如何一次性将单元格区域的值赋值给一个变量类型为string的数组?
回复

使用道具 举报

发表于 2011-7-20 12:50 | 显示全部楼层
本帖最后由 爱疯 于 2011-7-20 13:04 编辑

由于03单元格的限制(65536行,256列)。


  • 而变量的值,可以来自单元格;也可以来自其它途径(如常量,数组等)。
  • 经过处理之后,
  • 若仍旧输出到单元格,
为尽可能避免意想不到的错误,于是有了65536或256之限。

于是猜想凡是与单元格“来来往往”,便有此限,甚至可能有更严格的限制。至于限制的宽紧度如何,由于我拿不出充分数量的例子来证明,也举不出MS的解释,所以只能作为猜想,但我感觉方向是对的。

回复

使用道具 举报

发表于 2011-7-20 13:16 | 显示全部楼层
Zipall 发表于 2011-7-20 12:38
回复 爱疯 的帖子

谢谢你给的链接和测试.

刚刚一起发的,所以没看见这楼。

要是我理解,test4()出错实质是由于当某某条件下可能发生错误,只不过现在看到的是通过修改数据类型得以避免,让人意外,也确实意外。这个某某,我又解释不了,需要更广的、更深的知识来解释。

我还是相信:65536和256,将是与单元格来来往往的最低底限,MS可能由于这样或那样的原因,放松这个限制。
回复

使用道具 举报

发表于 2011-7-20 13:26 | 显示全部楼层
跟着学习来了。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-4 08:31 , Processed in 0.456424 second(s), 9 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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