淘先锋技术网

首页 1 2 3 4 5 6 7

VBA学习笔记

基础代码

本人为VBA的初学者,简单学一些代码提高工作效率,在此处记载一些自己的心得,同时也将自己简单的代码记录于此,代码简单,并且没有过多的高端用法,甚至有很多用的不当和错误的地方,有需要的人可以简单参考,如果是大神请不要笑话,毕竟我是一个野生的VBA程序员。

1、获取对应表的行数和列数

    表行数 = Sheets("表名").UsedRange.Rows.Count
    表列数 = Sheets("表名").UsedRange.Columns.Count

2、初始化工作表的基本操作

sub 初始化()
	'定义一个数组并且赋值
	表头数组 = Array("id", "员工号", "姓名", "身份证号", "手机", 	"在京居住地", "上午体温", "异常情况说明", "备注", "部门名称", "公司名称", "目前是否异常、咳嗽、发热、腹泻、乏力、呼吸困难、肌肉酸痛", "员工类型", "下午体温", "提交日期")		
	'此段代码暂时通过录制宏的方式实现,功能是选中工作表中所有行,然后删除,用来清空工作表
	Sheets("工作表名").Select
	Cells.Select
	Selection.Delete Shift:=xlUp
	Range("A1").Select	
	'获取数组长度
	表头数组长度 = UBound(首页表头数组) - LBound(首页表头数组) + 1    
	'通过循环将表头内容写入对应工作表的首行,以用来初始化表格
	For i = 1 To 表头数组长度    
		Sheets("工作表名").Cells(1, i) = 表头数组(i - 1)    
	Next i
end sub

3、将区域 赋值给数组

    Sheets("隔离清单").Select
    Dim 隔离清单表数组()
    隔离清单表数组 = Sheets("隔离清单").Range(Cells(1, 1), Cells(隔离清单表行数, 隔离清单表列数)).Value
    隔离清单表数组行数 = UBound(隔离清单表数组) - LBound(隔离清单表数组) + 1

4、标准化的程序前序代码,为数据循环匹配和对比做铺垫

Sub 循环对比()

    '加上选中工作表,可以减少一些不必要的错误,比如在数组赋值的时候如果不是选中工作表中就会报错
    Sheets("Sheet1").Select
    '用with可以减少引用,方便书写,也可以小幅度的提高速度
    With Sheets("Sheet1")
        Sheet1行数 = .UsedRange.Rows.Count
        Sheet1列数 = .UsedRange.Columns.Count
        '将sheet1中表头防盗一个数组中,此处可以结合初始化相关代码,完成一个动态展现表格的功能
        Sheet1表头数组 = .Range(Cells(1, 1), Cells(1, Sheet1表列数)).Value
        '将表头放入字典,表头每列的表头为key,第几列为值,这样配合循环使用就可以实现不管列顺序的情况下直接将值放入对应列
        Dim Sheet1表头字典 As Object '声明字典对象,亦可通过声明变体型变量完成声明 >>> Dim d
        Set Sheet1表头字典 = CreateObject("Scripting.Dictionary")    '声明字典
        For i = 1 To Sheet1表列数
            Sheet1表头字典(Sheets("Sheet1").Cells(1, i) & "") = i
        Next i
        '将表Sheet1的所有内容,放入数组总,用于同另外的数据进行匹配,这样比直接调用单元格对象要快的多的多
        Dim Sheet1表数组()
        Sheet1表数组 = .Range(Cells(1, 1), Cells(Sheet1表行数, Sheet1表列数)).Value
        Sheet1表数组行数 = UBound(Sheet1表数组) - LBound(Sheet1表数组) + 1
    
    End With
    
    Sheets("Sheet2").Select
    With Sheets("Sheet2")
        Sheet2表行数 = Sheets("Sheet2").UsedRange.Rows.Count
        Sheet2表列数 = Sheets("Sheet2").UsedRange.Columns.Count
    
        Sheet2表头数组 = Sheets("Sheet2").Range(Cells(1, 1), Cells(1, Sheet2表列数)).Value
        
        Dim Sheet2表头字典 As Object '声明字典对象,亦可通过声明变体型变量完成声明 >>> Dim d
        Set Sheet2表头字典 = CreateObject("Scripting.Dictionary")    '声明字典
        For i = 1 To Sheet2表列数
            Sheet2表头字典(Sheets("Sheet2").Cells(1, i) & "") = i
        Next i
        
        Dim Sheet2表数组()
        Sheet2表数组 = Sheets("Sheet1").Range(Cells(1, 1), Cells(Sheet2表行数, Sheet2表列数)).Value
        Sheet2表数组行数 = UBound(Sheet2表数组) - LBound(Sheet2表数组) + 1
    
    End With
      
    '将 Sheet1表头字典 中的所有key存入数组
    Sheet1表头字典keys = Sheet1表头字典.Keys
    
    '定义两个循环,用于数据比对
    For i = 2 To Sheet1表数组行数
        For j = 2 To Sheet2表数组行数
        	'判断两个表中"ID"字段的值是否相同
            If Sheet1表数组(i, Sheet1表头字典("ID")) = Sheet2表数组(j, Sheet2表头字典("ID")) Then
            	'字典的标记是从0开始的
            	'通过循环将对应的值付给每个单元格
                For m = 6 To UBound(Sheet1表头字典keys) - 1
                	'exists是用来判断字典中是否存在某个kye,加上判断,避免被匹配表中没有此字段报错
                    If Sheet2表头字典.exists(Sheet1表头字典keys(m)) Then 
                    	'此处暂时用循环给每个单元格进行赋值,这样效率不高,但是还没学会用动态添加数组然后给一个区域赋值
                        Sheets("Sheet1").Cells(i, Sheet1表头字典(Sheet1表头字典keys(m))) = Sheet2表数组(j, Sheet2表头字典(Sheet1表头字典keys(m)))
                    End If
                Next m
            End If
        Next j
    Next i

End Sub