阔别了好久的VBA这两天又有人让我做东西,就又捡了起来,在使用的过程中,发现遗忘的厉害,于是就想记录一下这两天用到的一些东西,以后有机会再补充吧。
先贴一段简单的代码,先熟悉一下vba是怎么写代码的
'设置行背景色
Private Sub SetRowColor()
'
' SetRowColor Macro
'
Dim currentSheet As Worksheet
Set currentSheet = Sheets(1)
If (currentSheet.Name = "汇总") Then
'currentSheet.Activate
Else
MsgBox ("请确保存在“汇总”表格,并将“汇总”表格作为第一个表格")
Exit Sub
End If
Dim columnCount As Integer
Dim rowCount As Integer
rowCount = currentSheet.UsedRange.Rows.Count
columnCount = currentSheet.UsedRange.Columns.Count
For i = 2 To rowCount
If ((i - 2) Mod 6 = 3 Or (i - 2) Mod 6 = 4 Or (i - 2) Mod 6 = 5) Then
With Range(Cells(i, 1), Cells(i, columnCount)).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.349986266670736
.PatternTintAndShade = 0
End With
End If
Next i
End Sub
分析这里面需要注意的几点
if语句写法
If (condition) Then
'do something
End If
for循环
For i=1 To 3000
'do something
Next i
变量声明
Dim iIndex as Integer
Dim curSheet as Worksheet
变量赋值,根据索引取得Sheet
iIndex = 3
Set curSheet = ThisWorkbook.Sheets(1)
这里要注意的地方:
如果是普通的Integer、Long类型这些,赋值的时候不用Set,如果是Worksheet、Range这些对象要用Set关键字
弹出提示框的写法
MsgBox ("请确保存在“汇总”表格,并将“汇总”表格作为第一个表格")
弹出输入框并取得其输入值的写法
Dim dt As String
dt = InputBox("请输入要整理数据的日期,限定在1-31之间,如 25", "提示框", "1")
取得当前Sheet已使用的行数和列数
Dim columnCount As Integer
Dim rowCount As Integer
rowCount = currentSheet.UsedRange.Rows.Count
columnCount = currentSheet.UsedRange.Columns.Count
激活某一个sheet
currentSheet.Activate
设置背景色为灰色
With Range(Cells(i, 1), Cells(i, columnCount)).Interior
.Pattern = xlSolid
.PatternColorIndex = xlAutomatic
.ThemeColor = xlThemeColorDark1
.TintAndShade = -0.349986266670736
.PatternTintAndShade = 0
End With
这部分是根据录制宏得到的
四则运算符
运算符符号 |
运算符 |
表达式 |
+ |
相加运算符 |
i=j+k |
﹣ |
相减运算符 |
i=j﹣k |
* |
相乘运算符 |
i=j*k |
/ |
相除运算符 |
i=j/k |
\ |
整型除法运算符 |
i=j\k |
Mod |
取余数运算符 |
i=jMod k |
^ |
指数运算符 |
i=5^2 |
关系运算符与关系表达式
关系运算符 |
意义 |
数学式 |
关系表达式 |
= = |
相等 |
A=B |
A= =B |
<> |
不相等 |
A≠B |
A<>B |
> |
大于 |
A>B |
A>B |
< |
小于 |
A |
A |
>= |
大于或等于 |
A≧B |
A>=B |
<= |
小于或等于 |
A≤B |
A<=B |
Like |
按样式比较字符串 |
|
字符串Like样式 |
Is |
比较对象 |
|
对象A Is对象B |
TypeOf…Is |
测试对象数据类型 |
|
If(TypeOf对象Is)Then |
Like子句样式用法如下所示:
Dim chksign As Boolean
chksign = “A” Like “A” ‘True
chksign = “a” Like “A” ‘False
chkFlag = “A” Like “AAA” ‘False
逻辑运算符
运算符 |
描述 |
AND |
在采取某行动前,所有的条件都必须为真(TRUE) |
OR |
在采取某行动前,至少有一个条件为真(TRUE) |
NOT |
用来否定条件。如果该条件为真,NOT使它为假;如果条件为假,NOT使它变真 |
Xor |
同0异1。 |
数组使用方法,声明、赋值、取值
Dim qualityData(10000, 3)
qualityData(i, 1) = wsQuality.Cells(i + 1, 1) 'planName
wsQuality.Cells(i + 1, columIndex) = qualityData(i, 3)
调用函数的方式(Sub)
Call SetRowColor
SetRowColor为一个Sub函数
取得单元格的值
curData(i, 4) = currentSheet.Cells(i + 1, 7)
退出循环、函数、do循环
Exit Sub
Exit For
Exit Do
do循环写法
Do
'do something
Loop
判断一个String是否是数字,及Integer类型转换
'输入的值合法性检查
Dim dt As String
dt = InputBox("请输入要整理数据的日期,限定在1-31之间,如 25", "提示框", "1")
If (IsNumeric(dt)) Then
iDt = CInt(dt)
If (iDt < 1 Or iDt > 31) Then
MsgBox ("输入的值不合法,请确保输入的是1-31之间的整数")
Exit Sub
End If
Else
MsgBox ("输入的值不合法,请确保输入的是1-31之间的整数")
Exit Sub
End If
其他,在Excel如果需要判断遍历大量数据行来进行比较的时候,性能瓶颈在于从excel的cell读取值来比较,解决方案是先把数据读到内存中作为数组来进行比较是否相等,这样可以大大提高性能,还可以使用VLookup函数,这种方法暂时还没研究
合并单元格
Range("$A$" & iRow, "$A$" & (iRow + 2)).Merge
从这里可以看到一个字符串连接的方式,是使用&方式来进行连接,如果出现多个字符串部分连接,可以是用()把其中一部分括起来,来保证总是2个字符串部分进行连接,如下
index = ("Ab"&i)&"cd"
另外可以看到,Range里面取得Cell的用法,上面还提到一种,如下
Range(Cells(i, 1), Cells(i, columnCount))
取得单元格的值(日期),并取得其 天 的部分
rowDate = wsSource.Cells(i, 1)
If (Day(rowDate) = iDt) Then
arrSource(iDataSrc, 1) = wsSource.Cells(i, 2) '推广计划名
arrSource(iDataSrc, 2) = wsSource.Cells(i, 4) '关键词
arrSource(iDataSrc, 3) = wsSource.Cells(i, 6) '点击量
arrSource(iDataSrc, 4) = wsSource.Cells(i, 9) '平均点击价格
arrSource(iDataSrc, 5) = wsSource.Cells(i, 7) '消费
iDataSrc = iDataSrc + 1
End If
对应的取得年、月的函数为Year()和Month函数
调用系统函数的方法
Application.WorksheetFunction.Acos
PS:CSDN的博客编辑器太烂了,文章一长就超级难编辑!!!!鄙视!