VBA自学日志


前言

VBA自学成柴第四周

一、Find

用于在区域内查找特定信息,如果找到了返回一个range对象,它代表在其中找到该信息的第一个单元格,如果没找到,返回nothing。

  • 格式
Range.Find(What,After,LookIn,LookAt,SearchOrder,SearchDirection, _
MatchCase,MatchBytem,SearchFormat)
  • 部分参数说明
Find 参数
What需要查找的值
After在什么之后开始查询
LookIn(xlformulas)查询公式
LookIn(xlvalues)查询值
LookIn(xlcomments)查询批注
LookAt(xlWhole)精确查询 简写1
LookAt(xlPart)模糊查询 简写2
SearchOrder(xlByRows)按行查找 简写1
SearchOrder(xlByColumns)按列查找 简写2
SearchDirection(xlnext)向下查找 简写1
SearchDirection(xlprevious)向上查找 简写2
MatchCase是否区分大小写,True区分,False为默认值不区分

查找李一所在的地址

Msgbox Range("A:A").Find("李一").Address(0,0)
'Address(0,0)代表消除锁定

在a6单元格后查找李一所在的位置

Msgbox Range("A:A").Find("李一",Range("A6")).Address(0,0)

查找公式中有20的单元格

MsgBox Range("A:A").Find(20,,xlformulas).Address(0,0)

查找值为20的单元格

MsgBox Range("A:A").Find(20,,xlvalues).Address(0,0)

查找批注是20的单元格

MsgBox Range("A:A").Find(20,,xlcomments).Address(0,0)

查找姓李的同学,精确查询

MsgBox Range("A:A").Find("*李*",,xlvalues,1).Address(0,0)

查找姓李的同学,模糊查询

MsgBox Range("A:A").Find("李",,xlvalues,2).Address(0,0)

查找李一,向下查询

MsgBox Range("A:A").Find("李一",,xlvalues,,,1).Address(0,0)

查找李一,向上查询

MsgBox Range("A:A").Find("李一",,xlvalues,,,2).Address(0,0)
  • 案例,将所有同学随机分配成3个人 一个小组
    在这里插入图片描述
Sub 随机抽取()
Dim a%, b%, c%, d%
'找到所需要抽取的人数
a = Cells(Rows.Count, "b").End(xlUp).Row
'对于结果列计数
d = Application.WorksheetFunction.CountA([i:i])
'如果总人数减去生成的人数小于3,就表示人数不够了,无法
'再进行循环,如果继续循环会进入死循环,所以提前结束。
If a - d < 3 Then MsgBox "人数不够了": Exit Sub
Do
'随机生成2到a的序列
b = Int((a - 2 + 1) * Rnd + 2)
'定位到结果列的行数
c = Cells(Rows.Count, "i").End(xlUp).Offset(1, 0).Row
'如果结果列中没有找到,就复制到结果列中,并且如果c不等2,x=0的话,
'空一个格生成
If Range("i:i").Find(Cells(b, "b")) Is Nothing Then
    If c <> 2 And x = 0 Then c = c + 1
    Cells(b, "b").Copy Cells(c, "i")
    x = x + 1
End If
Loop Until x = 3
End Sub

二、FindNext

首先查找了李一,然后现在查找下一个李一,就用FindNext

  • 格式
set b = range(“区域”).Find(“xxx”)
Set a = range(“区域”).FindNext(b)

例子:查找所有一年级的学生
在这里插入图片描述

Sub 查找下一行()
Dim a%, b, d As String, c As Range
'定位查询表的函数
a = Cells(Rows.Count, "a").End(xlUp).Row
'定位第一个一年级的地址
Set c = Range(Cells(2, "a"), Cells(a, "a")).Find("一年级")
b = c.Address
'每次点击运行都会清除上次的运行结果
[e2:g50].Clear
'开始循环,直到最后一个地址等于第一个地址
'代表循环结束,查找到所有一年级的学生
Do
'不断叠加,寻找下一个,利用resize重组数据,得到全部数据
'复制到结果表中
Set c = Range(Cells(2, "a"), Cells(a, "a")).FindNext(c)
c.Resize(1, 3).Copy Cells(Rows.Count, "e").End(xlUp).Offset(1, 0)
d = c.Address
Loop Until d = b
End Sub

三、筛选

顾名思义筛选你想要的值

  • 格式
AutoFilter(Field,Criteria1,Operator,Criteria2,SubField,VisibleDropDown)
  • 部分参数说明
参数名作用
Field筛选哪列,最左列为第一列
Criteria1条件1
Operator指定筛选的类型
Operator(xland)criteria1和criteria2并且关系
Operator(xlor)criteria1和criteria2或者关系
Operator(xlTop10Items)显示最大值的项,在criteria1中指定
Operator(xlBottom10Items)显示最小的项,在criteria1中指定项目
Operator(xlTopPercent)显示最大值的项,在criteria1中指定百分比(前10%,填10)
Operator(xlBottom10Percent)显示最小值的项,在criteria1中指定百分比
Operator(xlFilterValues)筛选值
Operator(xlFilterCellColor)单元格颜色
Operator(xlFilterFontColor)字体颜色
Operator(xlFilterIcon)筛选图标
xlFilterDynamic动态筛选

在这里插入图片描述
筛选一年级的同学

Set a = Range("a1").CurrentRegion
a.AutoFilter 1, "一年级"

筛选一年级并且成绩大于80分以上的同学

a.AutoFilter 1, "一年级": a.AutoFilter 3, ">=80"

显示成绩排名前5的同学

a.AutoFilter 3 , 5 , xlTop10Items

显示一年级,二年级的同学

a.AutoFilter 1,Array("一年级","二年级")
  • RGB的计算方法
Sub 计算颜色()
A=range(“a1”).Interior.Color
Red = a mod 256
Green = y \ 256 Mod 256
Blue = y \ 256 ^ 2 Mod 256 
MsgBox  “red” & ”,” & “green” & “,” & “blue”
End Sub
  • 案例 拆分工作簿,按照年级拆分到新的工作簿中,新工作簿以各年级命名
    在这里插入图片描述
Sub 拆分工作簿()
Dim a%, c%, d%, b As Workbook, e As Range
'首先构建辅助列
c = Cells(Rows.Count, "a").End(xlUp).Row
Range(Cells(2, "a"), Cells(c, "a")).Copy [e:e]
'利用辅助列计算到底需要新增多少个表
Range("e:e").RemoveDuplicates 1, xlNo
'计算需要循环的次数
d = Application.WorksheetFunction.CountA([e:e])
Do
x = x + 1
'在数据里面查找满足辅助列条件的值
Range("a1").AutoFilter 1, Cells(x, "e")
'将所有筛选值保存在e中
Set e = Range("a1").CurrentRegion
'新增工作表b
Set b = Workbooks.Add
'将筛选值复制到新工作表的a1单元格
e.Copy b.Sheets(1).[a1]
'将结果保存到当前文件路径,并以新工作表的a2单元格命名
b.SaveAs ThisWorkbook.Path & "\" & b.Sheets(1).[a2]
'关闭保存的单元格
b.Close
Loop Until x = d
'删除辅助列
[e:e].Delete
'恢复到数据表原先的样子
Sheets(1).AutoFilterMode = False
End Sub

四、Union并集

就是Excel同时选择多个单元格

  • 格式
union (单元格)
  • 案例
    在这里插入图片描述

将成绩大于80分的同学粘贴到e1单元格

Sub 并集()
Dim a%, b, result As Range
a = Cells(Rows.Count, "a").End(xlUp).Row
For Each b In Range(Cells(2, "c"), Cells(a, "c"))
    If b.Value > 80 Then
        '由于union第一个必须有初始值,所以如果没有值的话,就将大于80的第一个值
        '赋予给result,然后不断合并。
        If result Is Nothing Then Set result = b.Offset(0, -2).Resize(1, 3)
            Set result = Union(result, b.Offset(0, -2).Resize(1, 3))
    End If
Next b
'这里写在循环外面,是因为如果写在里面它会输出并集的结果
'每次并集都有结果,写在外面才是总结果
result.Copy Cells(Rows.Count, "e").End(xlUp)
End Sub

五、intersect交集

顾名思义,两个地方所交汇的地方

  • 格式
intersect(range1,range2)
  • 成绩大于80分同学的平均值
    在这里插入图片描述
Sub 交集()
Dim a%, b, result As Range
a = Cells(Rows.Count, "a").End(xlUp).Row
For Each b In Range(Cells(2, "c"), Cells(a, "c"))
    If b.Value > 80 Then
        '由于union第一个必须有初始值,所以如果没有值的话,就将大于80的第一个值
        '赋予给result,然后不断合并。
        If result Is Nothing Then Set result = b.Offset(0, -2).Resize(1, 3)
            Set result = Union(result, b.Offset(0, -2).Resize(1, 3))
    End If
Next b
'通过intersect计算result和c列的交集,
'得到大于80的同学的成绩
'然后利用excel里面的函数计算平均值
MsgBox Application.WorksheetFunction.Average(Intersect(result, [c:c]))
End Sub

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值