ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决] 使用字典统计重复项,运行时出现错误‘13’,类型不匹配

[复制链接]

TA的精华主题

TA的得分主题

发表于 2011-12-5 10:37 | 显示全部楼层 |阅读模式
本帖最后由 hktk_hrl 于 2011-12-5 13:37 编辑

需求:有一个表格如下:

Name Number
A1 p81348318
A2 w55138413
B1 w55553413
D1 m55384381
C3 m88438131
现在想要统计同一Number下的Name,并按照下表的格式给出结果
Number Name
p81348318 A1
w55138413 A2,B1
也就是将Number相同的Name项汇总到一个单元格内,并用中文逗号隔开。
我自己写了段代码如下:
  1. Sub PreSort()
  2. '
  3.     Dim rng As Range
  4.     Dim lastR As Integer
  5.    
  6.     Set rng = Sheet1.UsedRange.End(xlDown)
  7.     lastR = rng.Row
  8.    
  9.     Number = Sheet1.Range("B2:B" & lastR)
  10.     Name = Sheet1.Range("A2:A" & lastR)
  11.    
  12.     Dim d
  13.         Set d = CreateObject("Scripting.Dictionary")
  14.         For i = 1 To UBound(Number)
  15.             If d.exists(Number(i, 1)) Then
  16.                 d(Number(i, 1)) = d(Number(i, 1)) & "," & Name(i, 1)
  17.             Else
  18.                 d(Number(i, 1)) = Name(i, 1)
  19.             End If
  20.         Next
  21.         
  22.         Sheet2.[A1].Resize(1, 2) = Array("Number", "Name")
  23.         Sheet2.[A2].Resize(d.Count, 1) = Application.Transpose(d.keys)
  24.         Sheet2.[B2].Resize(d.Count, 1) = Application.Transpose(d.items)    '运行到这一句总是出错,提示:运行时错误'13',类型不匹配
  25.    
  26. End Sub
复制代码

每次运行到这一句总是出错
[code=vb]Sheet2.[B2].Resize(d.Count, 1) = Application.Transpose(d.items) '运行到这一句总是出错,提示:运行时错误'13',类型不匹配[/code]
在这一行之前增加断点,然后进入调试,监视d.items的值,应该是正确的,是个一维数组,内容也没错。在论坛里查看其他使用字典统计重复项的例子,将结果写入单元格的部分是一样的,但是我的程序就是一直出错。十分困惑,所以在此求高手指点,感激不尽~

最后附上源文件
Book1.rar (15.13 KB, 下载次数: 75)

TA的精华主题

TA的得分主题

发表于 2011-12-5 10:49 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
这个情况我也经常遇到啊。我也想知道。

TA的精华主题

TA的得分主题

发表于 2011-12-5 10:53 | 显示全部楼层
本帖最后由 香川群子 于 2011-12-5 11:00 编辑

按楼主内容作了个附件,运行结果没有问题啊。


楼主请确认附件。

Book2.zip (8.35 KB, 下载次数: 98)



TA的精华主题

TA的得分主题

发表于 2011-12-5 11:08 | 显示全部楼层
3楼的正确的,Transpose这个函数经常出问题的。

TA的精华主题

TA的得分主题

 楼主| 发表于 2011-12-5 11:10 | 显示全部楼层
香川群子 发表于 2011-12-5 10:53
按楼主内容作了个附件,运行结果没有问题啊。

你提供的附件我试了,确实没有问题。但是我那个附件一运行就出错啊,麻烦您试下我那个附件,看是否有错?

TA的精华主题

TA的得分主题

发表于 2011-12-5 12:50 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
Sub PreSort2()
    Dim rng As Range
    Dim lastR As Long, i, k, l, arr()
    lastR = Sheet1.Range("A65536").End(xlUp).Row
    Number = Sheet1.Range("A2:B" & lastR)
    ReDim arr(1 To UBound(Number))
    Dim d
        Set d = CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(Number)
        k = Number(i, 2)
            If d.exists(k) Then
                d(k) = d(k) & "," & Number(i, 1)
               
                arr(l) = d(k)
            Else
                d(k) = Number(i, 1)
                l = l + 1
                arr(l) = d(k)
            End If
        Next
        Sheet2.[A1].Resize(1, 2) = Array("Number", "Name")
        Sheet2.[A2].Resize(d.Count, 1) = Application.Transpose(d.keys)
        For s = 1 To l
        Sheet2.Cells(s + 1, 2) = arr(s)
        Next
    End Sub

TA的精华主题

TA的得分主题

发表于 2011-12-5 13:13 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
本帖最后由 excelhomeljch 于 2011-12-5 13:15 编辑

这个错误是因为有item项的字符数超过了256个.

Sub PreSort()
    Dim rng As Range
    Dim lastR As Integer
   
    Set rng = Sheet1.UsedRange.End(xlDown)
    lastR = rng.Row
   
    Number = Sheet1.Range("B2:B" & lastR)
    Name = Sheet1.Range("A2:A" & lastR)
   
    Dim d
        Set d = CreateObject("Scripting.Dictionary")
        For i = 1 To UBound(Number)
            If d.exists(Number(i, 1)) Then
                d(Number(i, 1)) = d(Number(i, 1)) & "," & Name(i, 1)
                If Len(d(Number(i, 1))) >= 256 Then
                d(Number(i, 1)) = ""
                End If
            Else
                d(Number(i, 1)) = Name(i, 1)
            End If
        Next
        
        Sheet2.[A1].Resize(1, 2) = Array("Number", "Name")
        Sheet2.[A2].Resize(d.Count, 1) = Application.Transpose(d.keys)
        Sheet2.[B2].Resize(d.Count, 1) = Application.Transpose(d.items)    '运行到这一句总是出错,提示:运行时错误'13',类型不匹配
   
End Sub

TA的精华主题

TA的得分主题

发表于 2011-12-5 13:29 | 显示全部楼层
问题找到原因了:

transpose()行列转置函数,对转置时每个单元格内可容纳的字符长度有限制要求。

不得大于250个字符。


……
你的词典结果中,d.keys是不会超过字符长度的,
但d.items结果中,最大字符长度超过250个字符的有269,300,527共3个,
这使得结果无法由transpose函数转置输出。


而在少量数据测试时,当然就不会碰到这个问题啦。


…………
6楼把item结果直接储存到数组arr中,然后逐个输出,所以6楼的代码可以实行。




TA的精华主题

TA的得分主题

发表于 2011-12-5 13:33 | 显示全部楼层
hktk_hrl 发表于 2011-12-5 11:10
你提供的附件我试了,确实没有问题。但是我那个附件一运行就出错啊,麻烦您试下我那个附件,看是否有错?

转置函数对每个单元格内可容纳字符要求为不超过250个字符,

你的附件因为数据较多而溢出了。就是这个原因。

TA的精华主题

TA的得分主题

发表于 2011-12-5 13:34 | 显示全部楼层
香川群子 发表于 2011-12-5 13:29
问题找到原因了:

transpose()行列转置函数,对转置时每个单元格内可容纳的字符长度有限制要求。

本人在电脑测试,是不超过256,255个都可以转置
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2024-4-27 20:32 , Processed in 0.048780 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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