Excel精英培训网

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

[已解决]求助

[复制链接]
发表于 2012-10-19 14:32 | 显示全部楼层 |阅读模式
VBA求助 Book2.xls12.rar (9.54 KB, 下载次数: 24)
excel精英培训的微信平台,每天都会发送excel学习教程和资料。扫一扫明天就可以收到新教程
 楼主| 发表于 2012-10-19 17:43 | 显示全部楼层
回复

使用道具 举报

 楼主| 发表于 2012-10-20 08:53 | 显示全部楼层
oplkj 发表于 2012-10-19 17:43
求助,求助,求助,求助,

求助,求助,求助,求助,

回复

使用道具 举报

发表于 2012-10-20 08:58 | 显示全部楼层
这个直接用字典也好解的嘛。
回复

使用道具 举报

 楼主| 发表于 2012-10-20 09:13 | 显示全部楼层
hwc2ycy 发表于 2012-10-20 08:58
这个直接用字典也好解的嘛。

我不懂,大师帮出下手吧,
回复

使用道具 举报

发表于 2012-10-20 09:42 | 显示全部楼层
  1. Sub 提取()
  2.     Dim arr, i, j, k As Long
  3.    
  4.     Dim dic1 As Object, dic2   As Object, dic3 As Object
  5.     Set dic1 = CreateObject("scripting.dictionary")
  6.     Set dic2 = CreateObject("scripting.dictionary")
  7.     Set dic3 = CreateObject("scripting.dictionary")
  8.     Dim arrRst() As String
  9.     arr = Range("f13").CurrentRegion
  10.     For i = 1 To UBound(arr)
  11.         For j = 1 To UBound(arr, 2)
  12.             Select Case j
  13.                 Case 1, 4, 7, 10, 13
  14.                     If arr(i, j) <> "" Then dic1(arr(i, j)) = dic1(arr(i, j)) + 1
  15.                 Case 2, 5, 8, 11, 14
  16.                     If arr(i, j) <> "" Then dic2(arr(i, j)) = dic2(arr(i, j)) + 1
  17.                 Case 3, 6, 9, 12, 15
  18.                     If arr(i, j) <> "" Then dic3(arr(i, j)) = dic3(arr(i, j)) + 1
  19.             End Select
  20.         Next
  21.     Next
  22.     For Each i In dic1.keys
  23.         If Val(dic1(i)) > 1 And Val(dic1(i)) < 5 Then
  24.             k = k + 1
  25.             ReDim Preserve arrRst(1 To 1, 1 To k)
  26.             arrRst(1, k) = "'" & Format(i, "000")
  27.         End If
  28.         If Val(dic1(i)) > 3 And Val(dic1(i)) < 6 Then
  29.             k = k + 1
  30.             ReDim Preserve arrRst(1 To 1, 1 To k)
  31.             arrRst(1, k) = "'" & Format(i, "000")
  32.         End If
  33.     Next
  34.    
  35.     For Each i In dic2.keys
  36.         If Val(dic2(i)) > 0 And Val(dic2(i)) < 3 Then
  37.             k = k + 1
  38.             ReDim Preserve arrRst(1 To 1, 1 To k)
  39.             arrRst(1, k) = "'" & Format(i, "000")
  40.         End If
  41.         If Val(dic2(i)) > 3 And Val(dic2(i)) < 6 Then
  42.             k = k + 1
  43.             ReDim Preserve arrRst(1 To 1, 1 To k)
  44.             arrRst(1, k) = "'" & Format(i, "000")
  45.         End If
  46.     Next

  47.     For Each i In dic3.keys
  48.         If Val(dic3(i)) > 0 And Val(dic3(i)) < 2 Then
  49.             k = k + 1
  50.             ReDim Preserve arrRst(1 To 1, 1 To k)
  51.             arrRst(1, k) = "'" & Format(i, "000")
  52.         End If
  53.         If Val(dic3(i)) > 3 And Val(dic3(i)) < 6 Then
  54.             k = k + 1
  55.             ReDim Preserve arrRst(1 To 1, 1 To k)
  56.             arrRst(1, k) = "'" & Format(i, "000")
  57.         End If
  58.     Next

  59.     Range("a1").Resize(k) = Application.WorksheetFunction.Transpose(arrRst)
  60. End Sub
复制代码
回复

使用道具 举报

发表于 2012-10-20 09:43 | 显示全部楼层
结果你自己验证,我再优化下代码。
回复

使用道具 举报

 楼主| 发表于 2012-10-20 09:57 | 显示全部楼层
hwc2ycy 发表于 2012-10-20 09:43
结果你自己验证,我再优化下代码。

大于3且小于6的指全部列(不分三部分),结果有误
回复

使用道具 举报

发表于 2012-10-20 10:15 | 显示全部楼层
  1. Sub 提取2()
  2.     Dim arr, i, j, k As Long, l
  3.     Dim arrDic(1 To 3, 1 To 3), arrCon
  4.     For i = 1 To 3
  5.         Set arrDic(i, 1) = CreateObject("scripting.dictionary")
  6.     Next
  7.     arrDic(1, 2) = 1
  8.     arrDic(1, 3) = 5
  9.     arrDic(2, 2) = 0
  10.     arrDic(2, 3) = 3
  11.     arrDic(3, 2) = 0
  12.     arrDic(3, 3) = 2
  13.     arrCon = Array(3, 6)
  14.     Dim arrRst() As String
  15.     arr = Range("f13").CurrentRegion
  16.     For i = 1 To UBound(arr)
  17.         For j = 1 To UBound(arr, 2)
  18.             Select Case j
  19.                 Case 1, 4, 7, 10, 13
  20.                     If arr(i, j) <> "" Then arrDic(1, 1)(arr(i, j)) = arrDic(1, 1)(arr(i, j)) + 1
  21.                 Case 2, 5, 8, 11, 14
  22.                     If arr(i, j) <> "" Then arrDic(2, 1)(arr(i, j)) = arrDic(2, 1)(arr(i, j)) + 1
  23.                 Case 3, 6, 9, 12, 15
  24.                     If arr(i, j) <> "" Then arrDic(3, 1)(arr(i, j)) = arrDic(3, 1)(arr(i, j)) + 1
  25.             End Select
  26.         Next
  27.     Next
  28.     For i = 1 To UBound(arrDic)
  29.         For Each j In arrDic(i, 1).keys
  30.             l = Val(arrDic(i, 1)(j))
  31.             If l > arrDic(i, 2) And l < arrDic(i, 3) Then
  32.                 k = k + 1
  33.                 ReDim Preserve arrRst(1 To 1, 1 To k)
  34.                 arrRst(1, k) = "'" & j
  35.             End If
  36.             If l > arrCon(0) And l < arrCon(1) Then
  37.                 k = k + 1
  38.                 ReDim Preserve arrRst(1 To 1, 1 To k)
  39.                 arrRst(1, k) = "'" & j
  40.             End If
  41.         Next
  42.     Next
  43.     Range("b1").Resize(k) = Application.WorksheetFunction.Transpose(arrRst)
  44. End Sub
复制代码
回复

使用道具 举报

发表于 2012-10-20 10:17 | 显示全部楼层
oplkj 发表于 2012-10-20 09:57
大于3且小于6的指全部列(不分三部分),结果有误

哦,明白了。那就还得加加一个字典。
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-25 17:41 , Processed in 0.390859 second(s), 11 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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