# VBA Module Knowledge Base **Scope:** `VBA/` directory - Core automation logic ## OVERVIEW VBA modules for BOM extraction: ClassModules (domain logic), Modules (workflows), DocumentModules (sheet events). ## STRUCTURE ``` VBA/ ├── ClassModules/ # 4 classes: BomExtractor, BomItem, ProductModelParser, ConditionEvaluator ├── Modules/ # 4 modules: MainModule, BIPUploadModule, ComponentInventoryCheckModule, TestModule ├── DocumentModules/ # Sheet9.cls (event handlers) └── vba_metadata.json # Module metadata ``` ## WHERE TO LOOK | Task | Location | Notes | |------|----------|-------| | Main entry point | `Modules/MainModule.bas` | `ProcessProductModels()` | | BOM extraction | `ClassModules/BomExtractor.cls` | `ExtractBom()` with assembly logic | | Model parsing | `ClassModules/ProductModelParser.cls` | `Parse()` extracts 6 conditions | | Condition logic | `ClassModules/ConditionEvaluator.cls` | Expression evaluation | | BIP upload | `Modules/BIPUploadModule.bas` | Upload to BIP system | | Inventory check | `Modules/ComponentInventoryCheckModule.bas` | Component verification | ## CODE MAP | Symbol | Type | Location | Role | |--------|------|----------|------| | `ProcessProductModels()` | Sub | `MainModule.bas` | Main entry point | | `ExtractBom()` | Function | `BomExtractor.cls` | Core matching logic | | `Parse()` | Function | `ProductModelParser.cls` | Model string parser | | `Evaluate()` | Function | `ConditionEvaluator.cls` | Condition evaluator | | `LoadFromRow()` | Sub | `BomItem.cls` | Row data loader | ## CONVENTIONS ### Module Organization - **ClassModules**: `*.cls` files with `Option Explicit`, public methods, private state - **Modules**: `*.bas` files with public subs, helper functions - **DocumentModules**: Sheet-specific event handlers (e.g., `Sheet9.cls`) ### Error Handling Pattern ```vba On Error GoTo ErrorHandler ' ... logic ... Exit Sub ErrorHandler: ' Handle error ``` ### Data Loading - `BomExtractor.LoadBomData()` starts at row 4 (row 3 is header) - `BomItem.LoadFromRow()` uses `On Error Resume Next` for type conversions ## ANTI-PATTERNS (THIS PROJECT) - **NEVER** change row indexing in `LoadBomData()` — hardcoded to start at row 4 - **NEVER** reorder `BomItem` fields — column mapping is hardcoded (11 fields) - **NEVER** remove `On Error Resume Next` in `LoadFromRow()` — handles type conversion - **NEVER** bypass `ApplyAssemblyLogic()` — parent/child override is critical - **NEVER** hardcode workbook names — always use `ThisWorkbook` ## UNIQUE STYLES ### Assembly Logic (总成逻辑) Parent category overrides children if: 1. Parent matches exactly 1 item 2. All children match at least 1 item 3. Result: parent output, children hidden ### Batch Output Pattern ```vba ' Collect in Collection ' Convert to 2D array ' Single Range.Value write ``` ### Condition Syntax - Format: `"field=value|field2=value2"` (pipe = OR) - Example: `"azxs=M|azxs=L"` (vertical OR horizontal installation) ## NOTES ### Scripting.Dictionary Dependency All classes use `CreateObject("Scripting.Dictionary")` - Windows only, not Mac-compatible. ### Workbook Sheets Required - `产品订单` - Input orders - `平台配置清单` - BOM configuration (starts at row 4) - `BOM 提取结果` - Auto-created output