大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第65讲内容:从字典提取数据后,实现乱序排序.
对于排序而言,方式有很多,有升序,有降序,今日我们讲解既不是升序也不是降序,是乱序.为什么会有这种排序呢?我们知道,在很多情况下,人们是很讲究顺序的,在某种场合下,把谁排在后面,人家都会不高兴,那么怎么办,只能是采取这种乱序的排序方案,也就是说,在排序的时候,没有一定的规律,是随机的,这样就可以避免一些人们的不高兴了.怎么实现这种乱序排序呢?我们看下面的实例.
实例讲解,在下面的A列中,有若干个城市名,我们要在其中提取不重复的数据,并给出出现的次数,然后按一种乱序排序发布这些城市名.
思路分析:对于数据的排重和提取出现次数,这些对于字典来说是很简单的了,这里不再过多的讲解;所谓乱序,就是没有排序的规律,要靠随机数来解决,所以要产生一组随机数,然后对应数据,当按随机数进行排序后,就是乱序了,特点是每次排序的结果都会不同.下面看代码:
代码:
Sub mynzsz_65() '第65讲 从字典提取数据后,实现乱序排序
Sheets("65").Select
Set mydic = CreateObject("Scripting.Dictionary") '字典
'给字典赋值
For Each ran In Sheets("65").Range("a2:a" & Cells(Rows.Count, 1).End(xlUp).Row)
If ran.Value <> "" Then
If Not mydic.exists(ran.Value) Then
mydic.Add ran.Value, 1 '需要注意此处要加VALUE
Else
mydic(ran.Value) = mydic(ran.Value) + 1
End If
End If
Next
'清理待填充区域
[e:g].ClearContents
Sheets("65").Range("e1") = "数据": Sheets("65").Range("f1") = "次数"
'回填数据
Sheets("65").[E2].Resize(mydic.Count) = WorksheetFunction.Transpose(mydic.keys)
For i = 1 To mydic.Count
Cells(i + 1, "f") = mydic(Cells(i + 1, "e").Value)
Next
'添加随机数据
r = Range("e1").CurrentRegion.Rows.Count
For i = 2 To r
Cells(i, "g") = Int((Rnd * 100) + 1)
Next
'实现乱序排序Randomize
Set rng = Range(Cells(1, "e"), Cells(r, "g"))
rng.Sort key1:=Range(Cells(1, "g"), Cells(r, "g")), Order1:=xlDescending, Header:=xlYes
'清除添加的随机数据
Columns("g").Clear
Set mydic = Nothing
End Sub
代码截图:
代码讲解:
1 上述过程实例了:数据的排重和提取,及乱序的排序,数据的提取利用了MYDIC字典解决,这里不再过多的讲解;然后用Cells(i, "g") = Int((Rnd * 100) + 1)获取了随机数,并对其进行排序.
2 '添加随机数据
r = Range("e1").CurrentRegion.Rows.Count
For i = 2 To r
Cells(i, "g") = Int((Rnd * 100) + 1)
Next
上述代码中将随机数Int((Rnd * 100) + 1)放到Cells(i, "g")单元格中.
3 Set rng = Range(Cells(1, "e"), Cells(r, "g"))
rng.Sort key1:=Range(Cells(1, "g"), Cells(r, "g")), Order1:=xlDescending, Header:=xlYes
上述代码指定排序区域,然后按照指定的列进行排序.
4 '清除添加的随机数据
Columns("g").Clear
上述代码清空随机数.
下面看代码的运行:
在开始的时候讲过,乱序排序每次结果是不同的,我们再次点击,看看结果:
今日内容回向:
1 如何实现乱序排序?
2 乱序排序的特点是什么?