Excel精英培训网

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

[已解决]请求完善代码,让数组一次i循环得出结果

[复制链接]
发表于 2011-1-20 23:25 | 显示全部楼层 |阅读模式
10学分

题意是:
B2开始往下(B列内)与f列的多个数据对比,如果其中1个相同,记录同行的c列为结果

最后按照f列的多个数据横向列示结果。

问题的关键在:
1.只能从B2一次开始在B列网下找相同的数据,一直找到B列的最后一个单元格,所要的结果就已经出来,而不是可以让B2多次开始向下对比数据
2.需要数组完成。
3.结果不可以用先定义一个很大的数组来装入结果,需要找到一个相同,扩大一个数组来装找到的接口


就像通过本例学习如下知识
1.B列只循环一次就可以完成多个结果的对比得到结果(因为只循环一次,所以速度可以更快)
2.怎么扩大未知结果的数组

最后请大虾们一定帮助赐教

1.JPG




2.JPG


数组一次i循环解决.rar (51.46 KB, 下载次数: 27)

发表于 2011-1-21 00:12 | 显示全部楼层
回复 xdwy81129 的帖子

说实在的没怎么看明白你的表,如果时你是想在指定区域中去查找找最后一个符合条件的单元格的话,可以用以下代码

Set C = .Range("A1:A1000").Find(.Cells(H, 1), lookat:=xlWhole, SearchDirection:=xlPrevious)

.Range("A1:A1000").Find=到指定区域A1:A1000中去查找值  .Cells(H, 1)

lookat:=xlWhole   =完全匹配

SearchDirection:=xlPrevious  =从A1开始倒查 也就是从A1000查到A1

如果不要此参数 就是从A1开始往下查...(也就是从A1开始查到A1000)

具体用法你可以查找帮助  Range.Find  

点评

不对,需要用数组,而且是一次循环b列得出多个结果 find没有想用,会用这个的,我想学习数组了  发表于 2011-1-21 00:13
回复

使用道具 举报

发表于 2011-1-21 00:22 | 显示全部楼层
这个我没办法...

我也学习一下吧!!期待高手的答案

点评

谢谢关注  发表于 2011-1-21 00:56
回复

使用道具 举报

发表于 2011-1-21 08:28 | 显示全部楼层
结果是啥?

评分

参与人数 1 +4 收起 理由
xdwy81129 + 4 再评分一次,因为最佳选了吕布老师 同时非.

查看全部评分

回复

使用道具 举报

发表于 2011-1-21 08:42 | 显示全部楼层
像在闯关,限制条件太多,速度未必快多少
是这样?
  1. Sub sadssss()
  2.     Dim arrYS
  3.     Dim arrTJ
  4.     Dim StrTJ
  5.     Dim arrJG
  6.     arrTJ = WorksheetFunction.Transpose(Range("F1:F27").Value)
  7.     arrYS = Range("b3:c" & [b65536].End(3).Row)
  8.     ReDim arrJG(1 To UBound(arrTJ))
  9.     StrTJ = Join(arrTJ, ",")
  10.     For i = 1 To UBound(arrYS)
  11.         j = InStr(StrTJ, arrYS(i, 1))
  12.         If j > 0 Then
  13.             j = (j - 1) / 4 + 1
  14.             If arrJG(j) = "" Then
  15.                 arrJG(j) = arrYS(i, 2)
  16.             Else
  17.                 arrJG(j) = arrJG(j) & "," & arrYS(i, 2)
  18.             End If
  19.         End If
  20.     Next i
  21.     For j = 1 To UBound(arrJG)
  22.         arrTJ = Split(arrJG(j), ",")
  23.         Cells(3, j + 7).Resize(UBound(arrTJ) + 1, 1) = WorksheetFunction.Transpose(arrTJ)
  24.     Next j
  25. End Sub
复制代码

点评

发现该程序有个小补丁:如果B列第一次出现的相同,而c列为空白,则求出的答案往上移动了一行,同样的,如果B列一开始都是空白,则求出的答案就往上移动多少空白  发表于 2011-1-23 02:54

评分

参与人数 1 +4 收起 理由
xdwy81129 + 4 还是有高人解决的呀,非常的感谢,就像学习.

查看全部评分

回复

使用道具 举报

发表于 2011-1-21 08:45 | 显示全部楼层    本楼为最佳答案   


  1. Sub 布Demo()
  2.     Dim arrCer As Variant
  3.     Dim arrData As Variant
  4.     Dim arrResult() As String
  5.     Dim arrDataCounts() As Long
  6.     Dim lMaxDataCounts As Long
  7.     Dim i As Long, j As Long
  8.     ' 读取数据
  9.     arrCer = Range("F1:F27")
  10.     arrData = Range("B3:C4000")
  11.     ' 初始化数组
  12.     ReDim arrDataCounts(LBound(arrCer, 1) To UBound(arrCer, 1))
  13.     ReDim arrResult(LBound(arrCer, 1) To UBound(arrCer, 1), 1 To 1)
  14.     ' 算出结果
  15.     For i = LBound(arrData, 1) To UBound(arrData, 1)
  16.         For j = LBound(arrCer, 1) To UBound(arrCer, 1)
  17.             If arrData(i, 1) = arrCer(j, 1) Then
  18.                 ' 列数据计数累加1
  19.                 arrDataCounts(j) = arrDataCounts(j) + 1
  20.                 ' 必要时扩展结果数组
  21.                 If lMaxDataCounts < arrDataCounts(j) Then
  22.                     lMaxDataCounts = arrDataCounts(j)
  23.                     ReDim Preserve arrResult(LBound(arrResult, 1) To UBound(arrResult, 1), 1 To lMaxDataCounts)
  24.                 End If
  25.                 ' C列数据写入结果数组
  26.                 arrResult(j, arrDataCounts(j)) = arrData(i, 2)
  27.             End If
  28.         Next j
  29.     Next i
  30.     ' 写结果
  31.     Range("H3").Resize(UBound(arrResult, 2), UBound(arrResult, 1)) = Application.WorksheetFunction.Transpose(arrResult)
  32. End Sub

复制代码

点评

吕布老师的代码更快,而且最后输出是一次性,强烈学习了  发表于 2011-1-21 20:15

评分

参与人数 1 +4 收起 理由
xdwy81129 + 4 详细拜读了代码,非常符合题意,想学习到的.

查看全部评分

回复

使用道具 举报

发表于 2011-1-21 08:48 | 显示全部楼层
学习高手的代码
回复

使用道具 举报

发表于 2011-1-21 08:50 | 显示全部楼层
传个附件上来

数组一次i循环解决.rar

62.6 KB, 下载次数: 20

评分

参与人数 1 +2 收起 理由
xdwy81129 + 2 最符合题意,也没有发现补丁,再次感谢

查看全部评分

回复

使用道具 举报

发表于 2011-1-22 21:19 | 显示全部楼层
学习战神!!!
回复

使用道具 举报

 楼主| 发表于 2011-1-23 03:09 | 显示全部楼层
回复 amulee 的帖子

第一个循环增加一句:
    If arrjg(j) = "" Then arrjg(j) = ","

第二个循环增加一句:
If Left(arrjg(j), 1) = "," Then arrjg(j) = Mid(arrjg(j), 2, Len(arrjg(j)))

补丁消灭掉了

再次向阿木老师指教其他思维方式解答问题表示感谢
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-10 06:26 , Processed in 0.243067 second(s), 17 queries , Gzip On, Yac On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

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