作工程报价,经常需要结合国家的定额来做报价单。根据定额的编号,很容易获得定额的价格,方便报价。以前做报价单的时候,都是用VlookUP函数来查找定额编号在反馈相应的价格。今天要讲的例子就是用VBA取代Vlookup函数。
报价单往往都有很多行。快速的数据处理,用VBA明显会比VlookUP要快的多。
问题如下:
![39b76408477d4ac76805479be6c6bd04.png](https://i-blog.csdnimg.cn/blog_migrate/45daee49b0274fbe411289f3a27bc8fb.jpeg)
![cccefdfc550daf0e7568a1a7e7ea2307.png](https://i-blog.csdnimg.cn/blog_migrate/c299ff41664a9862a0e3bce9c5adc980.jpeg)
问题描述:
1:根据定额工作表里面的定额编号,获取黄色单元格区域的内容;
2:在报价单的工作里面,查找与定额编号匹配的数据填入。
解决的思路详解:
1:为了运行的速度,把定额工作表里面的数据,全部放入arr数组;
2:把定额编号作为字典的key,定额工作表里面的 项目名称+单位+数量作为字典的item。本例会把这三项数据,放入数组装入字典。 及字典套数组
3:查找字典的key,并输出数组。
代码运行的结果如下:
![3a6c4e07fbb0fd4e442073d50aba786a.gif](https://i-blog.csdnimg.cn/blog_migrate/5a99be11ffaca13a18e060810b1e1dfd.gif)
代码如下:
![ee68d412ca1b4301c16d85a0a28bad56.png](https://i-blog.csdnimg.cn/blog_migrate/b14379ab625b082cb61fbd71936af9dc.jpeg)
Sub test() Dim arr, d, Rng As Range Application.ScreenUpdating = False Set d = CreateObject("scripting.dictionary") With Sheets("定额") arr = .Range("c6:f" & .Cells(.Rows.Count, 3).End(xlUp).Row) End With For i = 1 To UBound(arr) d(arr(i, 1)) = Array(arr(i, 2), arr(i, 3), arr(i, 4)) Next With Sheets("报价单") For Each Rng In .Range("c6:c" & Cells(.Rows.Count, 3).End(xlUp).Row) Rng.Offset(0, 1).Resize(1, 3) = d(Rng.Value) Next End With Application.ScreenUpdating = TrueEnd Sub
代码解析
1:2行 Dim定义变量;
2:4行 后期绑定字典;
3:5~7行 把定额工作表里面的数据放入arr数组(本句代码是常用代码);
4:9~11行 遍历arr数组,把定额编号作为字典的key,把项目名称+单位+数量作为字典的item;
5:14行 遍历报价单工作表里的数据区域;
6:15行 把查询到的字典对应的item放入指定的单元格区域;
本例思考:
1:本例并没有事实更新的功能。请结合VBA的事件,做一个自动运行的代码。
2:本例在代码运行之前,没有清除填写单元格区域的内容,欢迎留言写入相应的代码。
小结:
解决本问题,需要用的知识点:
1:数组的运用
2:字典的运用