Files
AutoBOM/VBA_BOMConverter/Modules/M04_Config.bas
Misaka_Company 867b1979af
All checks were successful
NTFY Notification / notify (push) Successful in 3s
refactor: improve BOM library matching logic with column-name-based lookup
- Add BOM library column name constants (名称, 编码, 数量, etc.)
- Add GetBOMConditionFields() and IsConditionField() utility functions
- Refactor ExtractMaterialInfo to use column names instead of hardcoded positions
- Refactor ExtractSingleSubComponent to use column names for 接头/弹性元件
- Refactor ExtractComponentInfo to use column names
- Improve MatchAllMaterialTypes to iterate all worksheets dynamically
- Add debug logging for troubleshooting

This fix resolves issues where worksheets with non-standard column counts
(like 表壳, 罩壳) could not extract material information properly.

Co-Authored-By: Claude Sonnet 4.5 <noreply@anthropic.com>
2026-02-12 13:59:48 +08:00

118 lines
4.4 KiB
QBasic
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
' ==============================================================================
' 模块: M04_Config
' 职责: 系统配置、常量定义
' ==============================================================================
Option Explicit
' 源数据列号定义 (根据你的描述)
Public Const COL_IDX_CODE As Long = 3 ' 代号 (C列)
Public Const COL_IDX_NAME As Long = 4 ' 名称 (D列)
Public Const COL_IDX_QTY As Long = 5 ' 数量 (E列)
Public Const COL_IDX_COND As Long = 6 ' 选择条件 (F列)
Public Const COL_IDX_CAT As Long = 8 ' 类别 (H列)
Public Const SRC_START_ROW As Long = 4 ' 数据起始行
' ------------------------------------------------------------------------------
' BOM自动提取系统配置常量
' ------------------------------------------------------------------------------
' BOM库配置
Public Const BOMLIB_FILENAME As String = "BOM库.xlsx"
Public Const BOMLIB_START_ROW As Long = 2 ' BOM库数据起始行第1行是表头
Public Const OUTPUT_SHEET_NAME As String = "BOM提取结果"
' 输入列名称配置
Public Const INPUT_COL_MODEL As String = "型号"
Public Const INPUT_COL_PRODUCT_MODEL As String = "产品型号"
' 输出列枚举
Public Enum OutputColumns
oc_OriginalModel = 1 ' 原始产品型号
oc_Azxs = 2 ' 安装形式
oc_Bkxs = 3 ' 表壳形式
oc_Gclj = 4 ' 过程连接
oc_Jycz = 5 ' 接液材质
oc_Lcfw = 6 ' 量程范围
oc_Fjgn = 7 ' 附加功能
oc_MaterialType = 8 ' 物料类型
oc_MaterialName = 9 ' 物料名称
oc_MaterialCode = 10 ' 物料编码
oc_MaterialQty = 11 ' 物料数量
oc_Remarks = 12 ' 提取备注
End Enum
' 型号解析常量
Public Const MODEL_SEPARATOR_PIPELINE As String = "|" ' 管道符分隔符
Public Const MODEL_SEPARATOR_DOT As String = "." ' 点号分隔符
Public Const MODEL_SEPARATOR_CARET As String = "^" ' 插入符分隔符(法兰隔膜)
Public Const MODEL_HEADER_MIN_SEGMENTS As Long = 6 ' 表头最小段数
' BOM库工作表列表需要遍历的工作表
Public Const BOMLIB_SHEET_JOINT As String = "接头"
Public Const BOMLIB_SHEET_ELEMENT As String = "弹性元件"
Public Const BOMLIB_SHEET_MOVEMENT As String = "机芯"
Public Const BOMLIB_SHEET_COMPONENT As String = "部件"
Public Const BOMLIB_SHEET_EDGE As String = "边"
' BOM库物料列名常量
Public Const BOMLIB_COL_NAME As String = "名称"
Public Const BOMLIB_COL_CODE As String = "编码"
Public Const BOMLIB_COL_QTY As String = "数量"
Public Const BOMLIB_COL_JOINT_NAME As String = "接头名称"
Public Const BOMLIB_COL_JOINT_CODE As String = "接头编码"
Public Const BOMLIB_COL_JOINT_QTY As String = "接头数量"
Public Const BOMLIB_COL_ELEMENT_NAME As String = "弹性元件名称"
Public Const BOMLIB_COL_ELEMENT_CODE As String = "弹性元件编码"
Public Const BOMLIB_COL_ELEMENT_QTY As String = "弹性元件数量"
' BOM库条件字段列表所有可能的条件字段
Public Function GetBOMConditionFields() As Variant
GetBOMConditionFields = Array( _
"azxs", "bkxs", "gclj", "jycz", "lcdw", "lcfw", _
"fjgn", "btcy", "bp", "dskd", "nqlc", "bptx", _
"jddj", "cpdm", "tsjz", "tsyq", "bpts", "kdxh" _
)
End Function
' 检查列名是否为条件列
Public Function IsConditionField(ByVal colName As String) As Boolean
Dim fields As Variant
fields = GetBOMConditionFields()
Dim i As Long
Dim lowerColName As String
lowerColName = LCase(Trim(colName))
For i = LBound(fields) To UBound(fields)
If lowerColName = LCase(fields(i)) Then
IsConditionField = True
Exit Function
End If
Next i
IsConditionField = False
End Function
' 获取表头排序索引 (越小越靠前)
Public Function GetHeaderPriority(key As String) As Long
Dim vList As Variant
Dim i As Long
' 定义标准排序顺序
vList = Array("azxs", "bkxs", "gclj", "jycz", "lcdw", "lcfw", _
"fjgn", "btcy", "bp", "dskd", "nqlc", "bptx", _
"jddj", "cpdm", "tsjz", "tsyq", "bpts", "kdxh")
Dim sKey As String
sKey = LCase(Trim(key))
For i = LBound(vList) To UBound(vList)
If sKey = LCase(vList(i)) Then
GetHeaderPriority = i
Exit Function
End If
Next i
' 未知变量排在最后
GetHeaderPriority = 999
End Function