《神奇的VBA》编程:批量设置指定列格式
------ 本篇前言------
日常办公中,经常需要使用VBA编程来批量为报表中某些列设置格式,比如水平/垂直对齐,设置字体颜色, 背景色, 字体名称,字号,显示或者隐藏。 这点需求在我本人开发基于WPS和Ms Office的商用ERP系统插件时也经常遇到的操作。偶尔遇到该操作,直接逐一设置列格式即可。但如果经常这样操作,那么就可以思考下去封装一个常用格式化代码, 便于快速复用。
本篇《神奇的VBA》编程将分享一些常见的VBA编码思路,纯属抛砖引玉。
------ 需求案例------
需求1:批量对下图示例报表中名称为"序号","项目名称","订单号","数量" 的列设置水平居中。
注意本示例报表纯属简单的报表,实际职场的工作报表中可能有十几个或者二三十列有效数据。
思路1: 根据需求遍历报表列逐一设置。
Sub demo()
Dim arr As Variant
arr = Array("序号", "项目名称", "订单号", "数量")
Dim c As Integer
For Each e In arr
For c = 1 To ActiveSheet.UsedRange.Columns.Count
If Cells(1, c) = e Then
Columns(c).HorizontalAlignment = xlCenter
End If
Next
Next
End Sub
上面代码是很常见的代码书写方式。 运用了常见的数组和遍历循环。如果对其不了解的,可以查阅《神奇的VBA》插件参考学习。
思路2:善用“《神奇的VBA》编程:快速定位报表列”文章中提供的自定义函数,批量设置。
自定义函数见下面
Function GetColumn(biao As Worksheet, fieldRowNumber As Byte, fieldname As String) As Integer
Dim c As Long
GetColumn = 0
For c = 1 To biao.UsedRange.Columns.Count
If Cells(fieldRowNumber, c) = fieldname Then
GetColumn = c: Exit For
End If
Next
End Function
根据上面代码, 重新实现上面需求。代码如下
Sub demo2()
Dim arr As Variant
arr = Array("序号", "项目名称", "订单号", "数量")
Dim c As Integer
For Each e In arr
c = GetColumn(ActiveSheet, 1, CStr(e))
If c > 0 Then Columns(c).HorizontalAlignment = xlCenter
Next
End Sub
通过运行,也很好地实现了案例需求。
在此需求的基础上,进行更多的设置,比如加粗或者设置字体为红色。
Sub demo3()
Dim arr As Variant
arr = Array("序号", "项目名称", "订单号", "数量")
Dim c As Integer
For Each e In arr
c = GetColumn(ActiveSheet, 1, CStr(e))
If c > 0 Then
Columns(c).Font.Color = vbRed
Columns(c).Font.Bold = True
End If
Next
End Sub
运用了上面的编码思路实现需求后, 您肯定会想,对报表列的选择是不确定的, 怎么样实现呢?其实可以设置ParamArray参数数组。 《神奇的VBA》插件中在Fuction过程中介绍了ParamArray参数数组的使用方法。 下面分享几个写好的设置列格式的函数。有需求的职场朋友们可以直接拿来复用。
函数示例1: 批量删除指定名称列
Sub 删除某些列(ParamArray arr())
For x = LBound(arr) To UBound(arr)
ColumnID = GetColumn(ActiveSheet, 1, CStr(arr(x)))
If ColumnID > 0 Then
ActiveSheet.Columns(ColumnID).Delete
End If
Next
End Sub
'此处务必注意:ParamArray是Variant类型,所以arr(x)也是Variant类型。
'不转换的话会产生类型不匹配错误
函数示例2: 批量隐藏指定名称列
Sub 隐藏某些列(ParamArray arr())
For x = LBound(arr) To UBound(arr)
ColumnID = GetColumn(ActiveSheet, 1, CStr(arr(x)))
If ColumnID > 0 Then
ActiveSheet.Columns(ColumnID).Hidden = True
End If
Next
End Sub
函数示例4: 批量居中指定名称列
Sub 显示某些列(ParamArray arr())
For x = LBound(arr) To UBound(arr)
ColumnID = GetColumn(ActiveSheet, 1, CStr(arr(x)))
If ColumnID > 0 Then
ActiveSheet.Columns(ColumnID).Hidden = False
End If
Next
End Sub
函数示例4: 批量居中指定名称列
Sub 居中某些列(ParamArray drr())
For x = LBound(drr) To UBound(drr)
ColumnID = GetColumn(ActiveSheet, 1, CStr(drr(x)))
If ColumnID > 0 Then
ActiveSheet.Columns(ColumnID).HorizontalAlignment = xlCenter
End If
Next
End Sub
根据上面分享的函数示例,实战下批量显示和隐藏报表中名称为"序号","项目名称","订单号","数量" 的列。
Sub demo4()
隐藏某些列 "序号", "项目名称", "订单号", "数量"
End Sub
Sub demo5()
显示某些列 "序号", "项目名称", "订单号", "数量"
End Sub
Sub 隐藏某些列(ParamArray arr())
For x = LBound(arr) To UBound(arr)
ColumnID = GetColumn(ActiveSheet, 1, CStr(arr(x)))
If ColumnID > 0 Then
ActiveSheet.Columns(ColumnID).Hidden = True
End If
Next
End Sub
Sub 显示某些列(ParamArray arr())
For x = LBound(arr) To UBound(arr)
ColumnID = GetColumn(ActiveSheet, 1, CStr(arr(x)))
If ColumnID > 0 Then
ActiveSheet.Columns(ColumnID).Hidden = False
End If
Next
End Sub
本篇分享的思路和代码抛砖引玉!