excel用VBA做多重excel vba 判断空值的问题

您的网站因未备案或涉及违规被禁止访问,请及时联系实际接入商办理备案.Excel从多行多列区域中提取不重复值到一列
要将一个多行多列区域中不重复的数据提取到一列,即对于重复的数据只提取一次,最直接的做法是先将该区域的数据转到一列中,再利用Excel中的删除重复项功能去掉重复值。另外,还可使用数据透视表、数组公式和VBA的方法来提取,本文以Excel 2010为例分别介绍如下假如数据在A1:C11区域,其中还包含一些空单元格,如图所示。
方法一:利用数据透视表
利于数据透视表的多重合并计算功能,将上述数据区域作为数据透视表的多重合并计算数据区域,把&值&字段放到在数据透视表的行区域中,即可得到不重复值。步骤如下:
1.在区域左侧插入空白列。如果原数据区域不是从A列开始,则可跳过此步骤。在本例中,由于原数据区域包含工作表的第一列(A列),需先在该区域的左侧插入一个空白列,作为数据透视表的行字段。
2.选择数据区域中的某个单元格,按Alt+D,再按P键,打开&数据透视表和数据透视图向导&,选择&多重合并计算数据区域&项,单击&下一步&。
3.再次单击&下一步&,在弹出的对话框中选择并添加数据区域。在选择区域时注意要包含原数据区域的左侧列及标题列。本例为包含上述空白列的A1:D11。
单击&下一步&,在弹出的对话框中选择数据透视表存放的位置,单击&完成&按钮。本例将数据透视表放置在当前工作表F3单元格开始的区域中。
4.在数据透视表的字段列表中取消选择所有字段,然后再次勾选&值&字段,或将&值&字段拖入到&行&标签区域中,即可在F列得到原区域中的不重复值。
方法二:使用数组公式
假如数据在A1:C11区域,在E2单元格中输入数组公式:
=INDIRECT(TEXT(MIN(IF(($A$2:$C$11&&&&)*(COUNTIF($E$1:E1,$A$2:$C$11)=0),ROW($2:$11)*100+COLUMN($A:$C),7^8)),&R0C00&),)&&&
公式输入完毕,按Ctrl+Shift+Enter结束。然后拖动填充柄向下填充公式,直到出现空白为止。
如果区域中的数据全部为数字和空单元格,还可用下面的数组公式:
=LARGE(IF($A$2:$C$11=&&,&&,$A$2:$C$11),SUM(COUNTIF($A$2:$C$11,$E$1:E1))+1)
方法三:使用VBA
下面的VBA代码利用Dictionary对象中的关键字具有唯一性的特点得到不重复值。使用方法是按Alt+F11打开VBA编辑器,在代码窗口中粘贴下列代码并运行,即可在F列可得到A2:C11区域中的不重复值。
Sub Uniquedata()
Dim rCell As Range
'创建Dictionary对象
Set d = CreateObject(&Scripting.Dictionary&)
'遍历数据区域的单元格
For Each rCell In Range(&A2:C11&)
'判断单元格是否为空
If rCell && && Then
'如果Dictionary对象中不包含指定的关键字就添加该关键字和条目
If Not d.exists(rCell.Value) Then d.Add rCell.Value, rCell.Value
'清除指定列内容
Range(&F2:F& & Range(&F2&).End(xlDown).Row).ClearContents
'将Dictionary对象中的条目写入指定列
Range(&F2&).Resize(d.Count) = WorksheetFunction.Transpose(d.Items)
标签(Tag):
------分隔线----------------------------
------分隔线----------------------------面对多重判断,excel有四法
面对多重判断,excel有四法
&(今天十一节前,得空写了这个excel函数的用法,这个可以方便的提高我们的excel数据处理)
一般来说,我们经常会碰到这样的问题,即
需要按照这张mapping表进行数值判断,下面有四种方法:
1 经典法:if多重判断
这个就不用多说了,一般来说,我们这个函数一般写为:
当然这里面and与函数有点多余,所以我们也可以写为
当时这个也有缺点,因为经常很多人会把临界点搞错,比如A1=5000的情况是D,还是C,所以会经常弄混的。最重要的,多重只能到7重,而且重数多了,if会写的非常乱
2 vlookup函数妙用法
啊,vlookup函数呀,这好像和多重判断不搭界呀,其实,vlookup函数有精确匹配和近似匹配,我们一般用的是精确匹配,而这里用的是近似匹配(原理在于近似匹配采用的是返回小于
lookup_value 的最大数值,所以一定要升序排列哦)。
而这里函数写为
=VLOOKUP(E2,B2:D5,3,TRUE)
就能返回各个相应的值,这个比if函数简单,而且可以支持7重以上。
但是缺点是一旦不是&=,而是&的下限形式,会比较麻烦。
3 VBA进阶1:select
大家去查查外面的VBA书籍,这个说的比较多,举个例子吧
我要对所有的上市公司进行判断,要按照利润区间分为
这个大家就不要用if写了,9重的if第一不支持(号称excel 2007
if函数只支持7重),第二即使写出来,过了一段时间,自己写的自己也不认识了。所以这边用VBA写了一个例子
Function profitrank(income) As String
Select Case income
&&& Case Is
profitrank = "&=0"
&&& Case Is
profitrank = "0-5千万"
&&& Case Is
profitrank = "5千万-1亿"
&&& Case Is
profitrank = "1亿-2亿"
&&& Case Is
profitrank = "2亿-3亿"
&&& Case Is
profitrank = "3亿-4亿"
&&& Case Is
profitrank = "4亿-5亿"
&&& Case Is
profitrank = "5亿-10亿"
profitrank = "&10亿"
End Function
这个函数,我定义为profitrank函数,这个大家可以copy到自己的excel中使用
4 VBA进阶2:switch函数
用过access的人都知道,它里面的switch比较好用,语法就是
Switch(条件1,”结论1”,条件2,”结论2”,条件3,”结论3”,…..)
比if函数好多了,可惜的是excel工作表竟然不知道switch函数,但是老天有眼,excel的VBA函数却可以支持switch,所以有些高手就做了些为国为名的好事(这里得感谢外国高手们,这帮人呀,牛)
其函数可以直接写作
=Switch2(A1&1000,"D",A1&5000,"C",A1&10000,"B",TRUE,"A")
比较if函数,是不是即简洁又清晰
目前代码如下:
Function Switch2(Test1 As String, Result1 As
Optional Test2 As String, Optional Result2 As String, _
Optional Test3 As String, Optional Result3 As String, _
Optional Test4 As String, Optional Result4 As String, _
Optional Test5 As String, Optional Result5 As String, _
Optional Test6 As String, Optional Result6 As String, _
Optional Test7 As String, Optional Result7 As String, _
Optional Test8 As String, Optional Result8 As String, _
Optional Test9 As String, Optional Result9 As String, _
Optional Test10 As String, Optional Result10 As String, _
Optional Test11 As String, Optional Result11 As String, _
Optional Test12 As String, Optional Result12 As String, _
Optional Test13 As String, Optional Result13 As String, _
Optional Test14 As String, Optional Result14 As String)
Switch2 = Switch(Test1, Result1, _
Test2, Result2, _
Test3, Result3, _
Test4, Result4, _
Test5, Result5, _
Test6, Result6, _
Test7, Result7, _
Test8, Result8, _
Test9, Result9, _
Test10, Result10, _
Test11, Result11, _
Test12, Result12, _
Test13, Result13, _
Test14, Result14)
End Function
这个大家也可以copy到excel中,非常方便,目前代码里面是支持14个条件的,大家可以任意扩充)
结论:if如果做多重判断,是不方便了,如果考虑到简单实用,建议用vlookup,如果还想多做VBA的学习,那还是用后面的两个VBA方法。
已投稿到:
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。查看: 1477|回复: 7
文本框中的输入用逗号隔开后能否作为多重判断的标准?
阅读权限20
在线时间 小时
试问下VBA中的文本框输入的数据如果用“,”隔开,可否在VBA中把用“,”隔开的两个字符都做为判断的条件?
比如我想在文本框中输入了“张三,李四”(这个输入可能是不完整的。比如张三实际的全名是“张三那”)
然后我点击查询按钮,在EXCEL表格中就能自动的筛选姓名符合或者相似“张三”“李四”二者条件的学生的成绩?
09:19 上传
点击文件名下载附件
7.36 KB, 下载次数: 14
阅读权限95
在线时间 小时
使用split把数据分开
阅读权限95
在线时间 小时
Private Sub CommandButton1_Click()
& & Dim Str$, Arr, k%
& & Dim Ary, i%
& & Arr = Range(&A2&, [A1].End(4)(1, 2))
& & Ary = Split(TextBox1.Text & &,&, &,&)
& & Str = &&
& & For i = 0 To UBound(Ary) - 1
& && &&&For k = 1 To UBound(Arr)
& && && && &If Arr(k, 1) Like &*& & Ary(i) & &*& Then Str = Str & Arr(k, 1) & & & & Arr(k, 2) & vbCrLf
& && &&&Next
& & Next
& & MsgBox Str
End Sub
复制代码
阅读权限20
在线时间 小时
多谢大侠!
小弟叩首拜谢!
阅读权限70
在线时间 小时
原帖由 alzeng 于
10:55 发表
Private Sub CommandButton1_Click()
& & Dim Str$, Arr, k%
& & Dim Ary, i%
& & Arr = Range(&A2&, [A1].End(4)(1, 2))
& & Ary = Split(TextBox1.Text & &,&, &,&)
& & Str = &&
& & For i = 0 To UB ...
不错,学习了.
阅读权限20
在线时间 小时
再请教,可否把上述输出的结果 放到表格的其他位置显示出来呢?
或者是新建一个表格显示出筛选结果??
我是初学,多多麻烦。谢谢
阅读权限95
在线时间 小时
Private Sub CommandButton1_Click()
& & Dim Arr, k%
& & Dim Ary, i%
& & Arr = Range(&A2&, [A1].End(4)(1, 2))
& & Ary = Split(TextBox1.Text & &,&, &,&)
& & [C:D].Clear
& & For i = 0 To UBound(Ary) - 1
& && &&&For k = 1 To UBound(Arr)
& && && && &If Arr(k, 1) Like &*& & Ary(i) & &*& Then [C65536].End(3)(2).Resize(1, 2) = Array(Arr(k, 1), Arr(k, 2))
& && &&&Next
& & Next
End Sub
复制代码
阅读权限20
在线时间 小时
小弟五体投递的佩服
我也一定要好好学习,天天向上!
玩命加载中,请稍候
玩命加载中,请稍候
Powered by
本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任! & & 本站特聘法律顾问:徐怀玉律师 李志群律师}

我要回帖

更多关于 excel vba 多条件判断 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信