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

菊子曰 今天你 菊子曰了么?

转载于:https://www.cnblogs.com/xiehui/archive/2010/03/07/2004331.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值