VBA学习笔记901_代码留存

只是为了记录一些跑过的代码,尽量加上注释,但有些非常简单,只是为了以后快速熟悉代码结构
条件选择:https://zhuanlan.zhihu.com/p/28056849
循环控制:https://zhuanlan.zhihu.com/p/28224626
Excel对象操作:https://zhuanlan.zhihu.com/p/28493992

1. 条件选择

IF...THEN

`-----最基本-----------
If 逻辑表达式 Then
    ' 如果逻辑表达式为真,则执行这里的语句
End if

`-----加强版
If 逻辑表达式 Then
    ' 如果逻辑表达式为真,则执行这里的语句
Else
    ' 否则(即逻辑表达式为假),则执行这里的语句
End If

`-----完整态
If 逻辑表达式1 Then
    ' 逻辑表达式1为真,则执行这里的语句
ElseIf 逻辑表达式2 Then
    ' 逻辑表达式2为真,则执行这里的语句
Else
    ' 逻辑表达式1和2都返回了假,则执行这里的语句
End If

Select Case

`基本格式
Select Case 测试表达式
    Case 表达式1
        ' 如果测试表达式等于表达式1,则执行这里的语句
    Case 表达式2
        ' 如果测试表达式等于表达式2,则执行这里的语句
    Case 表达式3
        ' 如果测试表达式等于表达式3,则执行这里的语句
    ' 后面可以有更多的Case
End Select

`举例
Sub test()
    Dim score As Integer
    score = 94
    Select Case score
        Case Is >= 90
            Debug.Print "优"
        Case Is >= 80
            Debug.Print "良"
        Case Is >= 60
            Debug.Print "中"
        Case Is < 60
            Debug.Print "差"
    End Select
End Sub

`最后的Case可以用 Case Else 表示其余所有的情况
`Case中可以用To表示范围,如Case 60 To 80
`Case中可以防止多个条件,及只要有一个条件满足就执行该Case,如Case Is=9, Is=7, Is=2
`注意,比较和赋值一样,都是一个等号!

Sub test()
    Dim i As Integer

    i = 3
    Select Case i
        Case Is >= 9
            Debug.Print "Nine+"
        Case Is = 8
            Debug.Print "Eight"
        Case 4 To 8
            Debug.Print "4~8"
        Case Else
            Debug.Print "4-"
    End Select
End Sub

2. 循环

固定次数的循环For

`最基本的循环体
Sub test()
    Dim i As Integer

    For i = 1 To 10
        Debug.Print i
    Next
End Sub

`可以加上步长
For i = 1 To 20 Step 3
    Debug.Print i
Next

循环次数不明确的For

For Each 循环变量 In 循环对象
    ' 循环执行的语句
Next 循环变量

`举例如下
    Dim k As Variant    '作为循环变量,k必须是variant或者object
    Dim arr As Variant  'arr本身是个Variant,而其元素可以是其它类型
    
    arr = Array("a", "b", "c", "d")
    
    For Each k In arr
        Debug.Print k
    Next k

Do...Loop

Do [While | Until] 循环条件
    ' 用于循环执行的语句
Loop

·还有一种形式是先执行一遍循环体再判断的
Do
    ' 用于循环执行的语句
Loop [While | Until] 循环条件

3. 操作Excel对象

四种对象:Workbook、Worksheet、Range、Cell

'通过表名找到Worksheet   (在VBE左侧窗口SheetX(...)中的...即为表名)
Dim wsSlea As Worksheet
Set wsSlea = Worksheets("SLEA")   '给对象赋值要用Set varName = ... 的形式
'注意上面右边Worksheets最后有个s

Dim rng As Range
'选取单个单元格
Set rng = sht_slea.Range("D2") 
'选取连续单元格并标底色
Set rng = sht_slea.Range("A1:D4")
rng.Interior.ColorIndex = 16

4. 实际例子

Rem 统计非空单元格数量统计非空单元格数量
    Dim arr() As String '此时无法判定这个arr的大小,但由于dim声明变量时,arr(n)中的n必须是确定值,而此时并不能确定,所以只能先这样处理,以后再ReDim
    Dim n As Long
    '统计非空单元格,实际是用了Excel已有的公式,这种方法要记住
    n = Application.WorksheetFunction.CountA(Range("D:D"))
    ReDim arr(1 To n) As String


'统计Range区域中,底纹和c相同的单元格的数量
Function CountColor(arr As Range, c As Range)
    Dim rng As Range
    Dim cnt As Integer
    cnt = 0
    For Each rng In arr
        If rng.Interior.Color = c.Interior.Color Then
            cnt = cnt + 1
        End If
    Next rng
    CountColor = cnt
End Function

’在Function的第一句加上如下语句,可以将该函数设置为易失性函数
Application.Volatile True
posted @ 2023-04-22 22:39  里欧老师  阅读(83)  评论(0)    收藏  举报