一、简单演示和代码展示 二、新对象/方法的介绍 1. Sort 排序,可以指设置 1~3 个排序条件,Key1、2、3,优先级最高的是 Key1。 2. IsEmpty 按字面理解就可以,往往是用来确定一个变量是否已经被赋值。这里用来判断一个单元格是否为空。 3. Offset 返回的是单元格,括号的两个参数依次为行偏移量和列偏移量。比如本例中的(1, 0),就是向下偏移 1 行。 4. EntireRow 通过某个单元格定位整行。 5. Dictionary 一种比较常用的对象,储存数据的方式为:关键字(称为 Key) - 条目(称为 Item)。 6. UBound 返回数组维可用的最大下标,因为有时候数组维不是从 1 开始的,所以,需要跟 LBound 一起,来确定一个数组的大小。 7. IsArray 检查变量是否为数组。 8. Exists Dictionary 专用。如果在 Dictionary 对象中指定的关键字存在,返回 True,若不存在,返回 False。注意,是跟 Dictionary 的关键字,也就是 Key 来比较的,而不是条目。 8. Add 在 Dictionary 的使用就是新增一组数据,两个参数依次为 Dictionary 的 Key 和 Item。 9. Keys 也是 Dictionary 专用。返回一个数组,该数组包含一个 Dictionary 对象中的全部已有的关键字。注意,这个数组的下维是从 0 开始而不是 1 。如果 Dictionary 中没有任何内容时,这个数组的下维是 -1 。 10. Resize 调整指定区域的大小。返回 Range 对象,该对象代表调整后的区域。两个参数依次为新区域的行数,新区域中的列数。 11. Transpose 转置行列。d.keys是个一维数组,我们可以简单的理解它是一组横着的数,经过 Transpose 以后,就变成了一组竖着的数。 12. RemoveAll 也是 Dictionary 专用,清空内容,释放资源和内存,也可以用 Set d = Nothing。 三、执行思路及过程分析 【1】合并 型号 和 价格 都相同的行 针对上期所说的,同一种型号出现重复价格的问题,但城市是不同的,我们又需要保留城市的信息,这就用到行合并的功能。 为了方便对比,先把 A 列和 B 列的内容,合并成临时列 D 列。 接着,对数据进行排序。 行合并的原理非常原始——对排序后 D 列,进行上一行和下一行进行比较,如果内容相同,就说明 A 列的型号和 B 列的价格都是一样的,然后我们再看 C 列,然后 C 列的内容也相同,说明是个完全重复的行,直接删掉;如果不同,那就把 C 列的内容进行合并,再删掉。 完成以后,临时列 D 的内容清空。 【2】增加辅助列 第二步,跟上期一样的,我们需要用到辅助列——在 型号 后面增加一个数字,数字代表这个型号出现的次数。 【3】获取 型号 的列表 第三步跟上一期不同,上期通过一个 辅2 列来获取列表,在 VBA 这里,就可以用 Dictionary。 先把 A 列的内容,赋予给 allA 这个变量,allA 实际上就是一个数组了。 然后,把 allA 的每一个元素取值,写进字典 d。这里需要注意两个点: 1、如果 A 列只有一行内容,allA 就不是一个数组,UBound(allA) 就会出错,所以用了个 IsArray(allA) 的判断。 2. 字典 d 增加数据时,我们只用到 Key 的值,所以 Item 可以取任何值。 现在,我们已经把型号列表保存在字典 d 的 Key里了,只需要把这些 Key 写到 G 列就可以了。这里,我们用了个 Resize 函数和 Transpose 函数。 当然,用 For 循环也可以做到的,效率就没那么高了。 【4】对 价格1~6 列写入公式 公式还是跟上期的一样,只是在 VBA 这里,需要转换为 R1C1 的样式,具体怎么转换,我这里就不讲解了。 【5】总结 本期的实例,除了 Vlookup 的一对多应用,还有 2 个比较实用的模块: 1. 删除重复行,或者合并部分内容重复的行。 2. 用 Dictionary 提取某列的唯一值。稍作一下变动,也可以实现提取多列的——主要是 allA(i, 1) 的 1 变成变量 j,然后再嵌套一个外层 For j 的循环。有兴趣的朋友,可以自己研究研究。 四、本期完整代码文字版 由于现在代码都变得比较长,代码不再直接放出,如果需要文字版代码,请留言,我会再第一时间发给你。 |
|