加载中…
博文
标签:

excel

vba

字典

分类: excel经验

'字典学习

 

'声明本模块中默认的比较方式,只能是text或者binary;如果不声明的的话,默认为二进制比较,但是对VBA字典中的比较方式没有影响。。

'Option Compare Text    '文本比较,不区分大小写;例如:"a" =  "A" 会返回true

'Option Compare Binary  '系统默认的比较方式,二进制比较,区分大小写;例如: "a" =  "A" 会返回false"a" > "A" 会返回true

 

Sub 字典学习()

'00 综述

   '四个属性:comparemode,count,key,item

   '六个方法:add,exists,items,keys,remove,removeall

   'key关键字

   'item

 

'01 字典的引用方式

   '01 前端引用,需要先勾选字典脚本:工具-引用-Microsoft scripting runtime,然后才可以使用,程序迁移不方便;输入d.后会有下拉框提示

'   Dim d As New Dictionary

   '02 后端引用,不需要勾选字典脚本,程序迁移方便;输入d.后没有提示

   Dim d As Object

   Set d = CreateObject("scripting.dictionary")

 

'02 comparemode属性;设置比较方式。

'   d.CompareMode = -1               '使用 Option Compare 陈述式的设定进行比较。经测试VBA中不适用,不知VB中能不能用。

'   d.CompareMode = BinaryCompare    '0;默认的比较方式;进行二进制比较,区分大小写

'   d.CompareMode = TextCompare      '1;进行文本比较,不区分大小写

'   d.CompareMode = DatabaseCompare  '2;仅用于 Microsoft Access。进行基于您自己资料库中资讯的比较。

 

'03 add方法;向字典中添加元素。

   On Error Resume Next

   For i = 1 To 4

        '要用range("a1").value格式输入域keyitem

        '如果不加.value,则字典的key为单元格,在进行输出的时候会出现错误;

        '例如:不加.value的时候,Debug.Print d.Item("a")会输出空值

        '也可以先把值装入数组,再从输入装入字典。类似:'arr = Range("a2:b" & i),然后让字典从数组中获取值,提高程序运行速度。

        d.Add Range("a" & i + 1).Value, Range("b" & i + 1).Value    '如果key已存在会报错

'        d(Range("a" & i + 1).Value) = Range("b" & i + 1).Value     '没有写add,效果同上;但是如果key已存在,会直接覆盖item,不会报错,相当于修改item

   Next

   On Error GoTo 0

'   MsgBox d.Item("a")

 

'04 count属性;统计字典中元素的个数

    j1 = d.Count

    Debug.Print j1

'05 key属性,用于修改key

    d.Key("a") = "g"  'key属性用法,修改已有的key值,如果字典中没有待修改的key值,则会报错

    Debug.Print d.Item("g")   '输出结果为苹果

'    d.Key("e") = "h"

  

'06 item属性:

'    Debug.Print d.Item("g")   '输出key"g"的项,对应的item值;

    d.Item("b") = "西红柿" '相当于d("b")= "西红柿";如果key值不存在,也相当于d.add("b") = "西红柿",存在的话,会报错。

    'd("b") 等于d.item("b")

    [G1] = d("b")

    [G2] = d.Item("b")

   

'07 exists判断一个key是否已经存在,返回布尔值,此方法最常用。

'    If d.Exists("a") = True Then xxx

 

'08 keys方法和items方法,一般用于把值输出到数组,进行进一步处理或输出

    arr = d.Keys

    brr = d.Items

    Range("e1:e4") = Application.Transpose(d.Keys)

    Range("f1:f4") = Application.Transpose(d.Items)

   

'09 remove方法,清除字典中的一条记录

    d.Remove ("b")

   

'10 removeall方法,清除字典中的所有元素

    d.RemoveAll 'removeall之后d仍然是字典对象

    Set d = Nothing '此操作完成后未赋值的object对象

   

'11 总结

   '字典一般用在去重,计数等方面,一定程度上代替函数中的vlookupcountif

   '一般先把数据装入数组,然后用字典进行去重和计数处理,其中主要会用到exists方法。

   '然后进行其他操作,然后把值输入到单元格中,或者把数据输出到数组,再进一步输出到单元格中。

   '最后把数组和字典setnoting以释放内存

   

End Sub


阅读    收藏 
标签:

excel

循环

vba

填表

分类: excel经验
本文要点:
        工作中有时需要批量填很多表格,数据量很大的话,一张一张地填非得累死个屁的,想用编程的方法实现,又不会写代码,但是录制个宏我们还是会的,而宏往往不能循环起来,本文巧妙地规避了这个问题,在不写一句代码的基础上,实现了快速填表。
   
举例如下:

1 工作中的要求:把下表填到工作表1中。

2 工作表1如下:

3 首先我们要复制一下这个工作簿,以作备份。

4 复制完如下(请无视那个PPT文件):


5 打开后点击录制宏,设置快捷键,我设置的是Ctrl+q,比较顺手。

6 首先在工作表1上点右键,选择移动或复制工作表,注意勾选创建副本,创建工作表1(2)。


7 填写工作表1(2)中的内容,注意除日期外,不要手打,要引用前表中的内容。


8 填完表后,复制粘贴该部分,选择只粘贴值。


9 这一步的作用是去掉公式引用,为下一步做准备,完成效果如下图。


10 回到这个表,删除已经录入完的这一行。


11 光标定位在A2这个位置,以便观察进度。停止录制宏。


12 按住刚才设置的快捷键Ctrl+q,效果如下:


13 完工后如下

最后,这个文件还有一个问题是,这些工作表是倒序排列的,直接全选打印的话顺序就倒了,不方便我们打印怎么行呢?至于如下解决这个问题,下一篇再写

阅读    收藏 
  
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有