一、问题提出
在VBA中我要把B列中所有的非空单元格的值都判断一遍,如果大于60就在其旁边的单元格写入"及格",反之就写入不及格。如下图所示:
由于B列的非空单元格数量无法确定,所以我们就要定义一个自定义的函数来获取B列中最后一个非空单元格的值,然后再进行遍历循环。为了使程序更加清晰,我决定事先定义一个函数,然后在主程序中进行调用自定义函数的返回值。
二、问题解决
1. 设置自定义函数
在VBA中我们插入一个模块,编写一下自定义的函数
Function lastRow(col As Range) As Long
lastRow = col.Cells(col.Cells.Count).End(xlUp).Row
End Function
这里面,lastRow是函数名,括号中的col as Range是指参数名和类型。
调用这个函数时,我们可以用函数名(参数),如lastRow(Range(B:B))
在VBA中,End(xlUp)是一个用于定位单元格的方法,它可以用于查找某一列或行最后一个非空单元格的位置。
End(xlUp)的作用是,从当前单元格向上搜索,直到遇到第一个非空单元格。它返回的是一个Range对象,该对象代表了搜索到的单元格的位置。
在使用End(xlUp)方法时,通常需要先指定起始单元格,然后使用End(xlUp)方法来查找最后一个非空单元格的位置。例如,以下代码可以查找A列中最后一个非空单元格的位置:
lastRow = Range("A1").End(xlDown).Row
2. 编写主程序
Sub 逻辑判断()
Dim last As Long
last = lastRow(Range("B:B")) '直接获取函数的返回值。
For i = 1 To last
If Range("b" & i) < 60 Then
Range("c" & i).Value = "不及格"
Else
Range("c" & i).Value = "及格"
End If
Next i
End Sub
三、学后反思
- 上面问题解决是用自定义函数的方法,也可以采用判断当前单元格是否为空,然后再执行主程序的方法。
- 这个案例中用到了for循环,if判断,自定义函数调用等重要的知识点,如果能够深入理解,可以进一步加深对于VBA编程的认识。
- 需要注意的是自定义的函数和主程序都放置在同一模块下才可以顺序执行。