VBA多ELSEIF语句优化求助:千种门编码批量处理方案
VBA多条件判断优化方案(针对千种门型编码匹配)
针对你用大量ElseIf硬编码门型匹配的场景,最实用的优化方式是用查找表替代重复判断逻辑,既不用写上千行代码,后续维护也更方便。下面给你两种简单易上手的方案:
方案一:用工作表存储匹配规则(新手首选,维护简单)
把所有门型的条件与编码对应关系整理到专门的工作表里,通过VBA调用查找函数匹配结果,新增/修改门型直接改表格就行,不用碰代码。
步骤1:创建对照表
新建一个工作表,命名为「门型编码对照表」,按以下列格式填充所有1000种门型数据:
| 类型 | 材质 | 门类型 | 宽度 | 高度 | 编码 |
|---|---|---|---|---|---|
| STANDARD | ENOKRILNA | POŽARNA VRATA PROGET EI60 | 800 | 2000 | PR0211.001 |
| STANDARD | ENOKRILNA | POŽARNA VRATA PROGET EI60 | 900 | 2000 | PR0211.002 |
| ... | ... | ... | ... | ... | ... |
步骤2:编写VBA查找代码
Sub 获取门编码() Dim 对照表 As Worksheet Dim 匹配编码 As String Dim 类型 As String, 材质 As String, 门类型 As String Dim 宽度 As Integer, 高度 As Integer ' 指定对照表工作表 Set 对照表 = ThisWorkbook.Worksheets("门型编码对照表") ' 获取当前输入的条件值 类型 = ComboBox1.Value 材质 = Range("B11").Value 门类型 = Range("B10").Value 宽度 = ComboBox2.Value 高度 = ComboBox3.Value ' 多条件查找编码(用INDEX+MATCH实现数组匹配) On Error Resume Next ' 处理无匹配的情况 匹配编码 = Application.Index(对照表.Range("F:F"), _ Application.Match(1, _ (对照表.Range("A:A") = 类型) * _ (对照表.Range("B:B") = 材质) * _ (对照表.Range("C:C") = 门类型) * _ (对照表.Range("D:D") = 宽度) * _ (对照表.Range("E:E") = 高度), _ 0)) On Error GoTo 0 ' 写入结果 If 匹配编码 <> "" Then Range("B13").Value = 匹配编码 Else Range("B13").Value = "无匹配编码" End If End Sub
方案二:用VBA字典预加载规则(适合大数据量,查找更快)
如果门型数据量极大且追求运行速度,可以用Scripting.Dictionary存储匹配规则,字典的查找效率远高于逐条判断。
VBA代码示例
Sub 获取门编码_字典版() Dim 门型字典 As Object Dim 查询键 As String Dim 类型 As String, 材质 As String, 门类型 As String Dim 宽度 As Integer, 高度 As Integer ' 创建字典对象 Set 门型字典 = CreateObject("Scripting.Dictionary") ' 预加载规则(可批量从工作表导入,示例仅写几条) 类型 = "STANDARD" 材质 = "ENOKRILNA" 门类型 = "POŽARNA VRATA PROGET EI60" ' 用「条件拼接字符串」作为字典的唯一键 门型字典(类型 & "|" & 材质 & "|" & 门类型 & "|800|2000") = "PR0211.001" 门型字典(类型 & "|" & 材质 & "|" & 门类型 & "|900|2000") = "PR0211.002" 门型字典(类型 & "|" & 材质 & "|" & 门类型 & "|1000|2000") = "PR0211.003" ' 其他规则可通过循环从对照表导入,无需手动编写 ' 生成当前输入的查询键 宽度 = ComboBox2.Value 高度 = ComboBox3.Value 查询键 = 类型 & "|" & 材质 & "|" & 门类型 & "|" & 宽度 & "|" & 高度 ' 查找并赋值 If 门型字典.Exists(查询键) Then Range("B13").Value = 门型字典(查询键) Else Range("B13").Value = "无匹配编码" End If End Sub
额外技巧:如果编码有生成规律
从你的示例代码看,编码似乎有固定规则(比如PR0211.xxx中,前两位对应高度分组,后两位对应宽度序号),如果所有门型编码都符合类似规律,还可以直接通过逻辑计算生成编码,完全不用查找表。比如:
Sub 直接生成编码() Dim 高度前缀 As String, 宽度后缀 As String ' 根据高度映射前缀 Select Case ComboBox3.Value Case 2000: 高度前缀 = "00" Case 2050: 高度前缀 = "01" ' 其他高度规则... End Select ' 根据宽度映射后缀 Select Case ComboBox2.Value Case 800: 宽度后缀 = "01" Case 900: 宽度后缀 = "02" Case 1000: 宽度后缀 = "03" Case 1300: 宽度后缀 = "04" ' 其他宽度规则... End Select ' 生成编码(前提是前半段PR0211.固定) Range("B13").Value = "PR0211." & 高度前缀 & 宽度后缀 End Sub
内容的提问来源于stack exchange,提问作者ZADU
相关产品推荐
相关产品推荐

