VBA如何通过数组根据变量自动匹配Excel列号以精简重复代码
VBA代码精简方案
完全可以通过映射匹配+批量循环的方式精简代码,消除所有重复分支和重复赋值逻辑,具体实现如下:
实现逻辑
- 建立
nn值与对应列标的映射关系,无需7个If分支判断 - 将所有待填充的命名区域和对应的目标行号整理为数组,批量循环赋值,无需重复写20行公式代码
完整实现代码(推荐字典映射版本)
Sub 批量插入公式() ' 初始化列映射字典 Dim colMap As Object Set colMap = CreateObject("Scripting.Dictionary") colMap.Add "19", "L" colMap.Add "24", "AP" colMap.Add "29", "BT" colMap.Add "34", "CX" colMap.Add "39", "EB" colMap.Add "44", "FF" colMap.Add "49", "GJ" ' 定义命名区域和对应行号的配置数组,补充完剩余18组即可 Dim rangeConfig As Variant rangeConfig = Array( _ Array("FS1.0_Count", 5), _ Array("FV1.04_Count", 6) _ ' 剩余待填充区域按照[命名区域名, 目标行号]的格式继续添加即可 ) ' 校验nn取值合法性 If Not colMap.Exists(nn) Then MsgBox "未匹配到对应列,请检查nn取值:" & nn, vbExclamation Exit Sub End If ' 匹配获取目标列标 Dim targetCol As String targetCol = colMap(nn) ' 循环批量写入公式 Dim i As Long Dim formulaStr As String For i = LBound(rangeConfig) To UBound(rangeConfig) formulaStr = "=INDIRECT(""[DoD_Options.xlsm]"" & LEFT(DrawingCode,FIND(""x"",DrawingCode)-1)&""!$" & targetCol & "$" & rangeConfig(i)(1) & """)*Dock_Count" Range(rangeConfig(i)(0)).Formula = formulaStr Next i End Sub
数组实现版本(无需引用字典)
如果不想使用字典,也可以用双数组匹配实现:
' 定义nn和列标对应数组 Dim nnArr As Variant, colArr As Variant nnArr = Array("19", "24", "29", "34", "39", "44", "49") colArr = Array("L", "AP", "BT", "CX", "EB", "FF", "GJ") ' 匹配索引 Dim matchIdx As Variant matchIdx = Application.Match(nn, nnArr, 0) If IsError(matchIdx) Then MsgBox "未匹配到对应列,请检查nn取值", vbExclamation Exit Sub End If targetCol = colArr(matchIdx - 1) ' 后续循环赋值逻辑和上面字典版本完全一致
后续如果需要调整映射关系、新增待填充区域,仅需要修改对应配置部分即可,无需调整核心逻辑,维护成本极低。
内容的提问来源于stack exchange,提问作者Jeff H
相关产品推荐
相关产品推荐

