Office · 6 2 月, 2021

VBA半天速成(Excel向)

2021/02/09 又一个半天过去了……

取值

Range("A1")
Range("A1:A5")
Range("A:A")
Range("A:C")
Range("1:1")
Range("1:5")
Range("1:1, 3:3, 8:8")
Range("A:A, C:C, F:F")
Range("A" & i)

循环

For Each c In Range("c1:c3").Cells
    'Todo here
Exit For    '条件满足时提前跳出循环
Next

For i = 1 To 10
    'Todo here
Next

条件

If <条件> Then
    'Todo here
ElseIf <条件> Then
    'Todo here
End If
'⚠VBA里没有“!=”这个符号。取而代之的是“<>”

分支(意外地有用)

Select Case <INT_VAR>
Case Is = <INT>
    'Todo here
End Select

使用EXCEL表格函数

Application.WorksheetFunction.<EXCEL里用到的函数>

定义变量

Dim <VAR_NAME> as <TYPE>
Dim <ARRAY_NAME>() as <TYPE>    '好像没有<TYPE>也可以。没试
<ARRAY_NAME>(N) '数组取值

弹出提示

MsgBox "<提示信息>"

数据类型转换

更多参见 https://blog.csdn.net/salerzhang/article/details/36431851

Val(<STR>)  'String to integer
Str(<INT>)  'Integer to string
CStr(host)  'Anything to string
'👆关于这个稍微说下。你可能以为一个String数组里的每个元素都是String,然而将元素传递给参数为String类型的函数之前需要将元素CStr一下,否则会被认为类型不一致。太弱智了

函数

Function  (<VAR> as <TYPE>)
'Todo here
 =  '表示返回值
Exit Function   '提前结束(VBA在设定返回值后会继续执行后面的代码,很反人类)
End Function

正则表达式

更多参见 https://zhuanlan.zhihu.com/p/134161652

(首先)依次点击VBE编辑器菜单:工具 – 引用,选取: Microsoft VBScript Regular Expressions 5.5

Dim regx As New RegExp
With regx
    .Global = True  ' True 表示搜索全部字符(贪婪匹配)
    .Pattern = "\d+"
End With
regx.Test(s)    '返回字符串s中是否含有对应模式(只要有就是True)
regx.Execute(s) '返回一个MatchCollection类型的对象,内含Count(反映匹配的数目)和Item(暂时还不知道干啥用的)属性
'👆为什么没人告诉我我却知道呢?请在VBA编辑界面的函数上右键,选择“定义”查看可用的方法

常见问题

控件绑定脚本时弹出以下提示:

「数式が複雑すぎます。オブジェクトに登録することはできません。」

请检查Excel文件名中有没有“[]”符号,如果有则需要替换为其他字符。