VBA学习笔记14:单元格的查找
学习资源:《Excel VBA从入门到进阶》第16集 by兰色幻想
本课所使用的例子:入库单信息填写及收集
一、单元格的查询
例:根据在入库单.sheet G3单元格中输入的单据号码在库存明细表里查找是否有记录,如有记录,返回所在的行数。
1. 使用循环查找 (在单元格中查找效率太低,详见前面关于循环的笔记)
2. 调用工作表函数
使用Countif函数
countif(range,criteria)
参数:range 要计算其中非空单元格数目的区域
参数:criteria 以数字、表达式或文本形式定义的条件
Sub c1()
Dim hao As Integer
Dim icount As Integer
icount = Application.WorksheetFunction.CountIf(Sheets("库存明细表").[b:b], [g3])
If icount > 0 Then
MsgBox "该入库单号码已经存在,请不要重复录入"
MsgBox Application.WorksheetFunction.Match([g3], Sheets("库存明细表").[b:b], 0)
End If
End Sub
3. 使用Find方法
语法:
表达式.Find(What, After, LookIn, LookAt, SearchOrder, SearchDirection, MatchCase, MatchByte, SearchFormat)
返回值:range。
Sub c2()
Dim r As Integer, r1 As Integer
Dim icount As Integer
icount = Application.WorksheetFunction.CountIf(Sheets("库存明细表").[b:b], [g3])
If icount > 0 Then
r = Sheets("库存明细表").[b:b].Find(Range("G3"), Lookat:=xlWhole).Row
'查找号码第一次出现的位置,xlWhole精确查找,xlPart模糊查找
r1 = Sheets("库存明细表").[b:b].Find([g3], , , , , xlPrevious).Row
'这里没写参数名,所以前面的项目不设置也要写逗号以示空值,xlPrevious查找方向从下往上查找
'不想写这么多逗号的话,可以写成XlSearchDirection:=xlPrevious
MsgBox "该单据号码出现在入库明细表中的第" & r & "-" & r1 & "行"
End If
End Sub
3.1 返回最下一行非空行的行数
Sub c3()
MsgBox Sheets("库存明细表").Cells.Find("*", , , , , xlPrevious).Row
'"*"分配值,表示有内容的单元格
End Sub
二、实例
制作入库单的四个功能:输入、查找、删除、修改
- 输入
Sub 输入()
Dim c As Integer '号码在库存表中的个数
Dim r As Integer '入库单的数据行数
Dim cr As Integer '库存明细表中第一个空行的行数
With Sheets("库存明细表")
c = Application.CountIf(.[b:b], Range("g3"))
If c > 0 Then
MsgBox "该单据号码已经存在!,请不要重复录入"
Exit Sub
r = Application.CountIf(Range("b6:b10"), "<>")
cr = .[b65536].End(xlUp).Row + 1
.Cells(cr, 1).Resize(r, 1) = Range("e3") '日期
.Cells(cr, 2).Resize(r, 1) = Range("g3") '单据号码
.Cells(cr, 3).Resize(r, 1) = Range("c3") '单位
.Cells(cr, 4).Resize(r, 6) = Cells(6, 2).Resize(r, 6).Value '入库物料明细
MsgBox "输入已完成"
End If
End With
End Sub
2. 查找(在单据号码处填入单据即可查找)
Sub 查找()
Dim c As Integer '号码在库存表中的个数
Dim r As Integer '入库单的数据行数
With Sheets("库存明细表")
c = Application.CountIf(.[b:b], Range("g3"))
If c = 0 Then
MsgBox "该单据号码不存在!"
Exit Sub
r = .[b:b].Find(Range("g3"), , , , , xlNext).Row
'xlNext从下往上查找
Range("c3") = .Cells(r, 3) '返回单位
Range("e3") = .Cells(r, 1) '返回日期
Cells(6, 2).Resize(c, 5) = .Cells(r, 4).Resize(c, 5).Value '返回入库物料明细
MsgBox "查询已完成"
End If
End With
End Sub
3. 删除(在单据号码处填入单据即可删除)
Sub 删除()
Dim c As Integer '号码在库存表中的个数
Dim r As Integer '入库单的数据行数
With Sheets("库存明细表")
c = Application.CountIf(.[b:b], Range("g3"))
If c = 0 Then
MsgBox "该单据号码不存在!"
Exit Sub
r = .[b:b].Find(Range("g3"), , , , , xlNext).Row
.Range(r & ":" & c + r - 1).Delete
MsgBox "删除已完成"
End If