龙空技术网

VBA字典实现多条件下唯一取值

VBA语言専攻 407

前言:

目前朋友们对“foreach求数组最大值”大概比较关注,兄弟们都想要了解一些“foreach求数组最大值”的相关知识。那么小编在网上搜集了一些对于“foreach求数组最大值””的相关内容,希望咱们能喜欢,兄弟们一起来了解一下吧!

【分享成果,随喜正能量】众生海海,各凭态度,众生海海,各自突破,各自去一 一走过,各自去分享生活的价值、温暖、希望和热烈。

《VBA数组与字典方案》教程(10144533)是我推出的第三套教程,目前已经是第二版修订了。这套教程定位于中级,字典是VBA的精华,我要求学员必学。7.1.3.9教程掌握后,可以解决大多数工作中遇到的实际问题。

这套字典教程共两册,一共八十四讲,今后一段时间会给大家陆续推出修订后的教程内容。今日的内容是:VBA字典实现多条件下唯一取值

第四十九讲 利用数组和字典,实现多条件下唯一取值

大家好,今日我们继续讲解VBA数组与字典解决方案,今日讲解第49讲:利用数组和字典,实现几组条件下唯一取值。

这套VBA数组与字典解决方案是我根据自己的经验写出的第三套教程,这套解决方案的系列丛书主要是面向职场人员,以实用为主,我在文章中会尽量模拟各种工作现场的实际场景,让大家能在教程中收获到很多实际解决问题的方案。

1 应用场景的具体分析

今日我模拟的场景是求出某设备的最高加工能力,下面的数据是某公司对设备的加工能力的测试,有多组数据,我们要把从这些数据提取出在相应机械和加工品名中求出日产量最高的值作为设备的加工能力基准。如下的数据:

说明:对于WW1设备在加工A型号时,日产量数据是100和114,我们要从中取出最大值114作为WW1加工A型号的基准,此程序该如何写呢?

2 实现多组条件下唯一取值的代码及代码分析

下面看实现上述场景的代码:

Sub mynzsz_49() '第49讲 利用数组和字典,实现几组条件下唯一取值

Set myDic = CreateObject("Scripting.Dictionary")

Sheets("49").Select

Myrows = [a1].End(4).Row

'ASCending 表示按正序排序(即:从小到大排序) DESCending 表示按倒序排序(即:从大到小排序)

Range("A1:C" & Myrows).Sort Key1:=Range("a1"), Order1:=xlAscending, Key2:=Range( _

"b1"), Order2:=xlAscending, Key3:=Range("c1"), Order3:=xlDescending, _

Header:=xlYes

'数据装入数组

myarr = Range("a2:c" & Myrows)

'将数据放入字典的键中,键值为键所在的行数

For i = 1 To UBound(myarr)

x = myarr(i, 1) & "|" & myarr(i, 2)

If Not myDic.exists(x) Then

myDic.Add x, i + 1

End If

Next

[e:g].ClearContents

'写入抬头

Sheets("49").Range("a1:c1").Copy Sheets("49").Range("e1")

'写入键值,按照键值写入应该取得的数据

[e2].Resize(myDic.Count, 1) = Application.Transpose(myDic.items)

For Each myrng In [e2].Resize(myDic.Count, 1)

rr = Cells(myrng, 2)

myrng.Resize(1, 3) = Cells(myrng, 1).Resize(1, 3).Value

Next

Set myDic = Nothing

MsgBox "ok!"

End Sub

代码截图:

代码解读:

1) 上述代码将各种机械加工型号的日常量提取出最大值。

2) 'ASCending 表示按正序排序(即:从小到大排序) DESCending 表示按倒序排序(即:从大到小排序)

Range("A1:C" & Myrows).Sort Key1:=Range("a1"), Order1:=xlAscending, Key2:=Range( _

"b1"), Order2:=xlAscending, Key3:=Range("c1"), Order3:=xlDescending, _

Header:=xlYes

上述代码实现单元格的排序,就是把A列,B列,C列的数据按照A列,B列,C列的顺序排序,A,B列是升序,C列是降序,这样就可以保证C列数据最大的排在最上面。

3) '数据装入数组

myarr = Range("a2:c" & Myrows)

上述代码将排序后的数据装入数组。

4 ) '将数据放入字典的键中,键值为键所在的行数

For i = 1 To UBound(myarr)

x = myarr(i, 1) & "|" & myarr(i, 2)

If Not myDic.exists(x) Then

myDic.Add x, i + 1

End If

Next

上述代码将机械和型号组合,作为数据是否重复的依据,如果不是是重复的,就装入字典的键,同时把键的键值设定为I+1,也就是此键的行数,注意这点非常重要。

5) '写入抬头

Sheets("49").Range("a1:c1").Copy Sheets("49").Range("e1")

上述代码将数据的抬头拷贝过来

6) '写入键值,按照键值写入应该取得的数据

[e2].Resize(myDic.Count, 1) = Application.Transpose(myDic.items)

上述代码将键值复制到E列的区域,注意这时候键值是应该取得的数据对应的行数值。

7 )For Each myrng In [e2].Resize(myDic.Count, 1)

rr = Cells(myrng, 2)

myrng.Resize(1, 3) = Cells(myrng, 1).Resize(1, 3).Value

Next

用一个FOR EACH循环来处理数据,由于E列的数据是应该取得的数据对应的行数值。所以我们只要用Cells(myrng, 1).Resize(1, 3).Value就可以轻松的获得必要的数据了,注意此句myrng.Resize(1, 3) = Cells(myrng, 1).Resize(1, 3).Value中先后出现的myrng的意义,前者是指循环的单元格,后者是当前单元格的数值,也是就要获取数据的行数值。

8 )Set myDic = Nothing

释放内存。

下面看代码的运行:

今日内容回向:

1 利用数值和字典,如何实现多组数据中提取唯一的值?

2 上述的实现过程中,关键点在哪里?

我多年的VBA实践经验,全部浓缩在以下十套教程中:

【分享成果,随喜正能量】要走的路很远,关山难越,但能够把握的信念才能给自己带来轻松和快乐。经过的众生海海,也都是萍水相逢,只有更多地理解和融合才不至于陷入一种边缘和寂寞。

标签: #foreach求数组最大值