Excel精英培训网

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

[已解决]类型不匹配问题

[复制链接]
发表于 2012-12-1 10:59 | 显示全部楼层 |阅读模式
Sub Eee()
If Range("a1") = "" Then
    MsgBox "无数据可处理。"
    Exit Sub
  End If
   
    Dim d, Temp
    Dim R&, R1
   
    Dim arr, arr1
    Set d = CreateObject("Scripting.Dictionary")
    R = Range("A65536").End(xlUp).Row
    R1 = Range("e65536").End(xlUp).Row
    arr = Range("A1:A" & R).Value
    arr1 = Range("e1:e" & R1).Value
    For Each Temp In arr
        d(Temp) = 1
    Next
    For Each Temp In arr1
    If Not d.Exists(Temp) Then
        d(Temp) = 1
    Else
        d.Remove (Temp)
    End If
    Next
    Range("b1").Resize(d.Count, 1) = Application.Transpose(d.keys)
  End Sub
最佳答案
2012-12-1 15:38
本帖最后由 suye1010 于 2012-12-1 15:46 编辑
  1. Sub Eee()
  2. If Range("a1") = "" Then
  3.     MsgBox "无数据可处理。"
  4.     Exit Sub
  5.   End If   
  6.     Dim d, Temp, dc, R, R1,arr, arr1
  7.     Set d = CreateObject("Scripting.Dictionary")
  8.     R = Application.WorksheetFunction.CountA(Columns("A"))
  9.     R1 = Application.WorksheetFunction.CountA(Columns("E"))
  10.     arr = Range("A1:A" & R).Value
  11.     arr1 = Range("e1:e" & R1).Value
  12.     For Each Temp In arr
  13.         d(Temp) = 1
  14.     Next
  15.     For Each Temp In arr1
  16.     If Not d.Exists(Temp) Then
  17.         d(Temp) = 1
  18.     Else
  19.         d.Remove (Temp)
  20.     End If
  21.     Next
  22.     For Each dc In d.keys
  23.         k = k + 1
  24.         Cells(k, 2) = dc
  25.     Next
  26.   End Sub
复制代码

类型不匹配.rar

708.02 KB, 下载次数: 16

发表于 2012-12-1 11:25 | 显示全部楼层
你使用的是07版,并且数据行超过65536行
要把 65536 改成 1048576 就可以了

R = Range("A1048576").End(xlUp).Row
R1 = Range("1048576").End(xlUp).Row
回复

使用道具 举报

发表于 2012-12-1 11:26 | 显示全部楼层
你的数据行数为70475,超过了65536,所以Range("A65536").End(xlUp).Row返回的值是1,造成了For each temp in arr语句中arr不是数组,所以提示类型不匹配
回复

使用道具 举报

发表于 2012-12-1 11:31 | 显示全部楼层
你的数据行数为70475,超过了65536,所以Range("A65536").End(xlUp).Row返回的值是1,造成了For each temp in arr语句中arr不是数组,所以提示类型不匹配
将R的赋值语句改为以下的试试:
    R = Application.WorksheetFunction.CountA(Columns("A"))
回复

使用道具 举报

 楼主| 发表于 2012-12-1 14:46 | 显示全部楼层
本帖最后由 fangniuji 于 2012-12-1 14:47 编辑
suye1010 发表于 2012-12-1 11:31
你的数据行数为70475,超过了65536,所以Range("A65536").End(xlUp).Row返回的值是1,造成了For each temp  ...


谢谢你的帮忙,可能我不会改,你帮我一下,谢谢。好像这句 Range("b1").Resize(d.Count, 1) = Application.Transpose(d.keys)也有问题

点评

Application.Transpose(arr) 中arr所允许的最大数组元素个数为65536,超过这个就会报错,所以可以将赋值过程用循环来进行  发表于 2012-12-1 15:45
回复

使用道具 举报

 楼主| 发表于 2012-12-1 14:47 | 显示全部楼层
mxg825 发表于 2012-12-1 11:25
你使用的是07版,并且数据行超过65536行
要把 65536 改成 1048576 就可以了

谢谢你的帮忙,可能我不会改,你帮我一下,谢谢。好像这句 Range("b1").Resize(d.Count, 1) = Application.Transpose(d.keys)也有问题
回复

使用道具 举报

发表于 2012-12-1 15:18 | 显示全部楼层
貌似是超出长度限限了,
回复

使用道具 举报

发表于 2012-12-1 15:30 | 显示全部楼层
一过63336,就报错了。
貌似有潜在的长度限制。
测了几次也是。
回复

使用道具 举报

发表于 2012-12-1 15:31 | 显示全部楼层
QQ截图20121201153019.jpg
回复

使用道具 举报

发表于 2012-12-1 15:38 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suye1010 于 2012-12-1 15:46 编辑
  1. Sub Eee()
  2. If Range("a1") = "" Then
  3.     MsgBox "无数据可处理。"
  4.     Exit Sub
  5.   End If   
  6.     Dim d, Temp, dc, R, R1,arr, arr1
  7.     Set d = CreateObject("Scripting.Dictionary")
  8.     R = Application.WorksheetFunction.CountA(Columns("A"))
  9.     R1 = Application.WorksheetFunction.CountA(Columns("E"))
  10.     arr = Range("A1:A" & R).Value
  11.     arr1 = Range("e1:e" & R1).Value
  12.     For Each Temp In arr
  13.         d(Temp) = 1
  14.     Next
  15.     For Each Temp In arr1
  16.     If Not d.Exists(Temp) Then
  17.         d(Temp) = 1
  18.     Else
  19.         d.Remove (Temp)
  20.     End If
  21.     Next
  22.     For Each dc In d.keys
  23.         k = k + 1
  24.         Cells(k, 2) = dc
  25.     Next
  26.   End Sub
复制代码
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-15 18:35 , Processed in 0.339807 second(s), 15 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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