VBA学习笔记14:单元格的查找

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


二、实例

制作入库单的四个功能:输入、查找、删除、修改

  1. 输入
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