You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于VBA创建非重复Part Number生成器?有无替代方案?

零件编号(Part Number)生成器实现方案

VBA实现步骤与代码

核心逻辑拆解

要实现XXXyyy-WWW格式的非重复编号,VBA需要完成以下核心动作:

  • 从预定义字典中匹配产品描述,获取三位缩写XXX
  • 根据产品系列,查询现有列表中该系列的最大三位数编号yyy,生成下一个可用编号(自动补零到三位)
  • 拼接部门参考编号WWW,并验证编号唯一性

具体代码实现

假设产品列表存放在Sheet1,列A为零件编号,列B为产品描述,列C为产品系列,列D为部门参考编号;同时创建了带输入框的用户窗体UserForm1(含txtDescription、txtSeries、txtDept输入框和btnGenerate按钮):

' 定义全局缩写字典
Dim partAbbrDict As Object

Private Sub UserForm_Initialize()
    ' 初始化缩写字典,可按需扩展
    Set partAbbrDict = CreateObject("Scripting.Dictionary")
    partAbbrDict.Add "Cable", "CAB"
    partAbbrDict.Add "Connector", "CON"
    partAbbrDict.Add "Housing", "HOU"
    ' 更多缩写映射...
End Sub

Private Sub btnGenerate_Click()
    Dim desc As String, series As String, dept As String
    Dim abbr As String, nextNum As String, newPartNum As String
    Dim maxNum As Integer, lastRow As Long, i As Long
    Dim isDuplicate As Boolean
    
    ' 获取表单输入
    desc = Trim(txtDescription.Value)
    series = Trim(txtSeries.Value)
    dept = Trim(txtDept.Value)
    
    ' 匹配描述获取缩写
    If partAbbrDict.Exists(desc) Then
        abbr = partAbbrDict(desc)
    Else
        MsgBox "未找到该产品描述对应的缩写,请检查输入!", vbExclamation
        Exit Sub
    End If
    
    ' 查找对应系列的最大编号
    lastRow = Sheet1.Cells(Sheet1.Rows.Count, "A").End(xlUp).Row
    maxNum = 0
    For i = 2 To lastRow ' 假设第一行是表头
        Dim existingNum As String
        ' 拆分现有编号,提取yyy部分
        If Left(Sheet1.Cells(i, "A").Value, 3) = abbr And Right(Sheet1.Cells(i, "A").Value, 3) = dept Then
            existingNum = Mid(Sheet1.Cells(i, "A").Value, 4, 3)
            If CInt(existingNum) > maxNum Then
                maxNum = CInt(existingNum)
            End If
        End If
    Next i
    
    ' 生成下一个三位数编号(补零)
    nextNum = Format(maxNum + 1, "000")
    
    ' 拼接新编号
    newPartNum = abbr & nextNum & "-" & dept
    
    ' 双重验证唯一性
    isDuplicate = False
    For i = 2 To lastRow
        If Sheet1.Cells(i, "A").Value = newPartNum Then
            isDuplicate = True
            Exit For
        End If
    Next i
    
    If isDuplicate Then
        MsgBox "生成的编号已存在,请重新生成!", vbCritical
    Else
        ' 将新编号写入产品列表
        Sheet1.Cells(lastRow + 1, "A").Value = newPartNum
        Sheet1.Cells(lastRow + 1, "B").Value = desc
        Sheet1.Cells(lastRow + 1, "C").Value = series
        Sheet1.Cells(lastRow + 1, "D").Value = dept
        MsgBox "新零件编号已生成:" & newPartNum, vbInformation
        ' 清空表单
        txtDescription.Value = ""
        txtSeries.Value = ""
        txtDept.Value = ""
    End If
End Sub

代码说明

  • 用Scripting.Dictionary存储缩写映射,匹配效率更高
  • 通过Format函数确保yyy始终为三位数(如1转为001)
  • 双重唯一性验证,避免数据异常导致重复
  • 自动写入产品列表,减少手动操作

替代实现方法

如果不想用VBA,可根据场景选择以下方案:

1. Excel公式组合

适合简单无交互场景:

  • 用XLOOKUP匹配产品描述获取缩写XXX
  • 用MAX+LEFT/MID/RIGHT组合查找对应系列的最大编号,加1后用TEXT补零
  • 用&拼接完整编号
    示例公式(假设缩写表在Sheet2的A-B列,产品列表在Sheet1):
=XLOOKUP(B2,Sheet2!A:A,Sheet2!B:B,"未找到")&TEXT(MAX(IF((LEFT(Sheet1!$A$2:$A$100,3)=XLOOKUP(B2,Sheet2!A:A,Sheet2!B:B,"未找到"))*(RIGHT(Sheet1!$A$2:$A$100,3)=D2),MID(Sheet1!$A$2:$A$100,4,3),0))+1,"000")&"-"&D2

注意:Excel 365可直接回车,旧版本需按Ctrl+Shift+Enter触发数组计算

2. Power Query自动化

适合批量处理或定期更新场景:

  • 将产品列表和缩写表导入Power Query
  • 添加自定义列,通过合并查询匹配缩写
  • 分组计算每个系列的最大编号,生成下一个编号
  • 拼接完整编号后加载回Excel

3. 低代码工具(如Power Apps)

适合可视化表单与多人协作场景:

  • 用Power Apps创建输入表单,连接Excel或SharePoint列表作为数据源
  • 内置公式匹配缩写,通过数据源查询最大编号
  • 自动生成并保存编号,无需复杂代码

4. Python脚本

适合复杂数据处理或跨系统集成场景:

  • 用pandas读取产品列表和缩写字典
  • 字符串匹配获取缩写,分组计算最大编号
  • 生成新编号后写入文件或数据库
    示例片段:
import pandas as pd

# 加载数据
df = pd.read_excel("产品列表.xlsx")
abbr_dict = {"Cable": "CAB", "Connector": "CON", "Housing": "HOU"}

# 获取输入
desc = input("输入产品描述:")
series = input("输入产品系列:")
dept = input("输入部门参考编号:")

# 匹配缩写
if desc not in abbr_dict:
    print("未找到对应缩写")
else:
    abbr = abbr_dict[desc]
    # 筛选对应系列和部门的编号,提取yyy部分
    filtered = df[df["零件编号"].str.startswith(abbr) & df["零件编号"].str.endswith(dept)]
    if filtered.empty:
        next_num = "001"
    else:
        max_num = filtered["零件编号"].str[3:6].astype(int).max()
        next_num = f"{max_num + 1:03d}"
    new_part_num = f"{abbr}{next_num}-{dept}"
    # 添加到数据框
    new_row = pd.DataFrame({"零件编号": [new_part_num], "产品描述": [desc], "产品系列": [series], "部门参考编号": [dept]})
    df = pd.concat([df, new_row], ignore_index=True)
    # 保存
    df.to_excel("产品列表.xlsx", index=False)
    print(f"生成新编号:{new_part_num}")

内容的提问来源于stack exchange,提问作者user25695094

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.21 22:32:05