Excel学习笔记002-005:如何按列提取不重复值
问题来源:在编写002-004的过程中,突然想到现在学生已经开始分文理科了,导致班号并不是连着的,很多时候需要分别处理文、理科的数据,如果能事先把文科或理科的班号先提出来,然后根据班号来对应不同的程序,是不是效率会更高些?
所以本次只解决一个问题:如何按列提取不重复值.但是现在寻找了好几种方法,不是看不懂(^_^),就是感觉太麻烦,其实主要是看不懂啊.现在想了一个笨办法,就是先把数据复制到一个新表中,然后把所有重复的行删掉,这样就可以只剩下所有不重复值了.接着就可以把这些不重复值引入到数组或列表中,按数值有针对性对原表(复制源)进行操作,比如提取指定班级的学生信息,打印指定班级的学生信息等等.
先来一个确定行号的新方法
Sub 新的一种确定行号或列号的方法()
Worksheets("sheet1").Activate
R = Range("C65536").End(xlUp).Row '此种方法有巨大的意义:如果工作中间有空行,则若有原来的方法,则一定会出现不包括下面数值不为空的现象,而用这种方法是从底部往上寻找,直到第一个不为0为止.
Debug.Print R
End Sub
根据问题的类型,设计了以下几个方面的问题:①如何做个备份(其实就是复制一份);②如何提取不重复值(偷梁换柱,把文件复制后,直接把重复行删掉,就得到不重复值了);③在②的基础上,联想到如何删掉空白行.
①如何复制工作表(注意并不是筛选后复制,而是直接复制工作表,包含全部数据,相当于备份.);②如何提取不重复值
Sub 如何删除重复行()
'重复行意味着同一列中必有相同的数值,故可以通过Countif函数统计出现重复数值的个数,若个数超过1,则说明必有重复行,故把此时的行删掉即可.
Dim R As Integer
Dim i As Integer
'建立一个副本,便于验证,同时也说明了如何进行工作表复制.
Worksheets("sheet1").Copy Before:=Worksheets("sheet1")
ActiveSheet.Name = "验证"
'顺便解决如何进行工作表的移动
'Worksheets("sheet1").Move Before:=Worksheets("sheet1")
'ActiveSheet.Name = "验证"
R = Range("B65536").End(xlUp).Row
For i = R To 1 Step -1
If Application.WorksheetFunction.CountIf(Range(Cells(1, 2), Cells(R, 2)), Cells(i, 2)) > 1 Then '充分利用Countif函数的功能:统计在指定区域内符合条件的个数,据此:若符合cells(i,2)的单元格个数出现了2个以上,则该行一定有重复行,那么即可把该行删掉.
Range(Cells(i, 2), Cells(i, 2)).EntireRow.Delete
End If
Next i
End Sub
③如何删掉空行白
Sub 如何删除空白行()
Dim R As Integer
Dim i As Integer
Worksheets("验证").Activate
R = Range("A65536").End(xlUp).Row
Debug.Print R '可以显示到最后一个数值不为空的行所在行号.
'R = Range("A1").CurrentRegion.Rows.Count
'Debug.Print R '只显示到第一个数值为空的行所在行号-1
For i = R To 1 Step -1
If Application.WorksheetFunction.CountA(Range(Cells(i, 1), Cells(i, 1)).EntireRow) = 0 Then 'CountA功能为统计指定区域内非空白单元格个数,若为0则说明该为空白行,故需要删掉;若不为0,则说明该行是有数据的.那能不能用Countblank函数呢?不能,因为要删掉的是整行,而Countblank统计的是空白单元格的个数,那在整行内必有空白单元格,那么统计个数就不可能出现为0现象,若条件设为Application.WorksheetFunction.CountBlank(Range(Cells(i, 1), Cells(i, 1)).EntireRow) = 0 那么哪一行也删不掉;若把=0改为<>0,也不行,因为哪一行也不会=0的情况,所有行的空白单元格个数都是不等于0的.
Range(Cells(i, 1), Cells(i, 1)).EntireRow.Delete
End If
Next i
End Sub
刚才在写如何删除空白行的代码时,突然想到,现在已经可以确定最后一个数值不为空的行所在行号,那如何确定最后一数值(肯定也是在指定区域内(这个地方要验证:到底是一个区域还是一个单元格))不为空的列所在列号呢?
Sub 如何确定最后一列不为空的列号()
Dim totalR, totalC As Integer
totalR = Range("A65536").End(xlUp).Row'这是确定行号;
totalC = Range("IV1").End(xlToLeft).Column'这是确定列号;即电子表格一共最支持256列,65536行,这是常识,最好记住.
Debug.Print totalR, totalC '这就可以确定有效数据的区域.
End Sub