VBA学习笔记12:单元格的格式
学习资源:《Excel VBA从入门到进阶》第14集 by兰色幻想
- Excel中的颜色
Excel中的颜色可以用两种方式获取,一种是EXCEL内置颜色,另一种是利用QBCOLOR函数返回。
1.1 ColorIndex函数
返回或设置一个Variant值,代表指定工作表选项卡或图表选项卡的颜色。
Sub y1()
'获取Excel色卡
Dim x As Integer
For x = 0 To 56
Range("a" & x+1) = x
Range("b" & x+1).Interior.ColorIndex = x
Next x
End Sub
1.2 QBCOLOR函数
返回一个 Long,用来表示所对应颜色值的 RGB 颜色码。
语法:QBColor(color) 必要的 color 参数是一个界于 0 到 15 的整型。
Sub y2()
Dim x As Integer
For x = 0 To 15
Range("d" & x + 1) = x
Range("e" & x + 1).Interior.Color = QBColor(x)
Next x
End Sub
1.3 RGB函数
返回RGB颜色值得Long整数。
语法:RGB(红色, 绿色, 蓝色)
PS: 数值限制0~255。
Sub y3()
Dim 红 As Integer, 绿 As Integer, 蓝 As Integer
红 = 255
绿 = 123
蓝 = 100
Range("g1").Interior.Color = RGB(红, 绿, 蓝)
End Sub
或者建一个窗体,用滚动条可能更好看出这种变化。
Option Explicit
Dim a, b, c
Private Sub ScrollBar1_Change()
a = ScrollBar1.Value
Me.BackColor = RGB(a, b, c)
End Sub
Private Sub ScrollBar2_Change()
c = ScrollBar2.Value
Me.BackColor = RGB(a, b, c)
End Sub
Private Sub ScrollBar3_Change()
b = ScrollBar3.Value
Me.BackColor = RGB(a, b, c)
End Sub
Private Sub UserForm_Click()
End Sub
或者把滚动条做到工作表里也可以。
2. 判断数值的格式
2.1 判断是否为空单元格
例子:判断A1单元格是否为空,如为空,在B1写“空值”,否则写“不为空”。
①A1是否等于“”:
Sub d1()
If Range("a1") = "" Then
[b1] = "空值"
[b1] = "不为空"
End If
End Sub
②判断A1值的长度:
Sub d1()
If Len([a1]) = 0 Then
[b1] = "空值"
[b1] = "不为空"
End If
End Sub
③IsEmpty函数:
Sub d1()
If VBA.IsEmpty([a1]) Then
[b1] = "空值"
[b1] = "不为空"
End If
End Sub
2.2 判断是否为数字
例子:判断A2单元格是否为数字,如是,在B2写“数字”,否则写“没有数字”。
①IsNumeric函数(要多加一个条件判断是否为空,空值是0也会被认为是数字):
Sub d2()
If VBA.IsNumeric([a2]) And [a2] <> "" Then
[b2] = "数字"
[b2] = "没有数字"
End If
End Sub
②IsNumber工作表函数:
Sub d2()
If Application.WorksheetFunction.IsNumber([a2]) Then
[b2] = "数字"
[b2] = "没有数字"
End If
End Sub
两者区别:IsNumber工作表函数认为文本型数字不是数字,而IsNumeric函数则确认为数字,后者包容性更强;而且工作表函数有时候会与VBA函数冲突,导致无法使用。
2.3 判断是否为文本
例子:判断A3单元格是否为文本,如是,在B3写“文本”,否则写“不是文本”。
① IsText工作表函数:
Sub d3()
If Application.WorksheetFunction.IsText([A3]) Then
[b3] = "文本"
[b3] = "不是文本"
End If
End Sub
② 利用TypeName函数判断A3是否为String字符串类型(注意区分大小写)
Sub d3()
If VBA.TypeName([a3].Value) = "String" Then
[b3] = "文本"
[b3] = "不是文本"
End If
End Sub
2.4 判断是否为汉字
例子:判断A4单元格是否为汉字,如是,在B4写“汉字”,否则写“没有汉字”。
①判断单元格值是否大于z(小写),这是老师的方法,想不到为什么大于z就能判断为汉字,有网友好像实验过这不能覆盖到所有汉字,似乎不够准确emmm
Sub d4()
If [a4] > "z" Then
[b4] = "汉字"
[b4] = "没有汉字"
End If
End Sub
②Excelhome上有同学提出的另一种方法:如果Len()<>Lenb()说明有汉字
Sub d4()
If Len([a4]) <> Lenb([a4]) Then
[b4] = "汉字"
[b4] = "没有汉字"
End If
End Sub
2.5 判断错误值
例子:判断A5单元格是否为错误值,如是,在B5写“错误值”,否则写”没有错误值”。
① IsError函数(VBA函数):
Sub d10()
If VBA.IsError([a5]) Then
[b5] = "错误值"
[b5] = "没有错误值"
End If
End Sub
② IsError函数(工作表函数):
Sub d10()
If Application.WorksheetFunction.IsError([a5]) Then
[b5] = "错误值"
[b5] = "没有错误值"
End If
End Sub
2.6 判断日期
例子:判断A6单元格是否为日期,如是,在B6写“日期”,否则写“不是日期”。
Sub d6()
If VBA.IsDate([a6]) Then
[b6] = "日期"
[b6] = "不是日期"
End If
End Sub
3 设置单元格自定义格式
录制宏来查看格式代码
例子:把D1到D8单元格区域的数字格式设置为保留两位小数的数字。
Sub d30()
Range("d1:d8").NumberFormatLocal = "0.00"
End Sub
4. 单元格合并
4.1 单元格合并
例子:合并A1:D3单元格区域。
Sub h1()
Range("A1:D3").Merge
End Sub
4.2 合并区域的返回信息
例子:在E1返回B3单元格所在的合并单元格区域。
Sub h2()
Range("e1") = Range("b3").MergeArea.Address
End Sub
4.3 判断是否含合并单元格
例子:判断B3单元格是否在合并单元格区域,和判断A1:D7单元格区域是否有合并单元格。
用MsgBox返回,或IsNull函数。
Sub h3()
MsgBox Range("B3").MergeCells
'合并后会返回True,否则False
Range("e2") = IsNull(Range("A1:D7").MergeCells)
'A1:D7并不是所有单元格都合并了,所以Range("A1:D7").MergeCells是无效表达式
'IsNull函数,若有表达式无效为null返回True,否则返回False
End Sub
IsNull 函数
Null 值指示 Variant 未包含任何有效数据。 Null 与 Empty 不同,其指示尚未初始化变量。它与有时称为空字符串的零长度字符串 ("") 也不同。
4.4 综合示例
例子:合并H列相同单元格(如J列)。
Sub h4()
Dim x%, rg As Range
Set rg = Range("h1")
Application.DisplayAlerts = False
'关闭屏幕更新,加快运行速度
For x = 1 To 13
If Range("h" & x + 1) = Range("h" & x) Then
Set rg = Union(rg, Range("h" & x + 1))
'用union收集相同的单元格
rg.Merge
Set rg = Range("h" & x + 1)
'合并现已收集到相同的单元格rg,并在rg中放入下一个单元格
End If