## 一、如和使用
{: id="20251007101950-1gugbp5"}
- {: id="20251007103613-sqd2oun"}启用宏功能
{: id="20251007103613-75wsxtt"}
{: id="20251007103538-0h6e40i"}
- {: id="20251007103538-z0q3aph"}将库存数据全选覆盖粘贴到料件库存报表工作表
{: id="20251007103538-dh9t5wa"}
- {: id="20251007103538-f74vlns"}将BOM数据粘贴到BOM工作表
{: id="20251007103538-3ue35ls"}
- {: id="20251007103538-l98kcxb"}将预测数据粘贴到Focest工作表
{: id="20251007103538-2crsvgh"}
{: id="20251007103538-bdebbsq"}
- {: id="20251007103623-69q9u7n"}按Alt+F8打开宏对话框
{: id="20251007103623-ik5ukjv"}
{: id="20251007103538-wptkjh0"}
- {: id="20251007103627-u1ocd3t"}选择宏A
{: id="20251007103627-rryv6m0"}
{: id="20251007103538-l28z8vd"}
- {: id="20251007103631-s4oome2"}点击运行按钮
{: id="20251007103631-qhayol7"}
- {: id="20251007103747-229bjft"} 在0000工作表查看所有汇总数据
{: id="20251007103749-o3w3b7f"}
{: id="20251007103538-6q6mpo3"}
> 重要注意事项:
> {: id="20251007103538-joq3kr7"}
>
> - {: id="20251007103538-m1bekwm"}保持原始列位置不变,避免修改列顺序
> {: id="20251007103538-yhzozlu"}
> {: id="20251007103538-smjcynk"}
{: id="20251007103538-z5d2rho"}
# 二、文件结构
{: id="20251007103209-33jahkh"}
{: id="20251007103237-06coebk"}

{: id="20251007102118-doi1b72"}
|工作表名称|功能描述|数据来源|更新频率|
| --| ------------------------------| --------------| ------------|
|料件库存报表|存放SAP导出的库存数据|SAP系统导出|每日/每周|
|BOM|BOM表数据|SAP系统导出|物料变更时|
|Focest|存放预测需求数据|预测系统导出|每周|
|Output|宏运行后生成的需求计算结果|系统自动生成|每次运行宏|
|Cutput|宏运行后生成的需求透视表|系统自动生成|每次运行宏|
|Unmatched|宏运行后生成的未匹配料号清单|系统自动生成|每次运行宏|
|0000|主分析报表(最终查看页面)|综合所有数据|实时更新|
{: colgroup="|||" id="20251007101950-3xgqm1t"}
#### 步骤1:准备源数据
{: id="20251007101950-4wo5r07"}
库存报表数据要求:
{: id="20251007101950-znq4l0w"}
- {: id="20251007101950-6pqjxdb"}必须包含的字段:料号、库存量、待验量、需求量、采购订单量、采购申请量、提前期天数、最小订单量、结余量
{: id="20251007101950-5e97muw"}
- {: id="20251007101950-n6nqtj0"}数据格式:从SAP系统标准导出格式
{: id="20251007101950-2r71rup"}
- {: id="20251007102208-qmdycmg"}直接整体覆盖粘贴
{: id="20251007102208-d0y7lkq"}
- {: id="20251007102222-55xa6og"}
{: id="20251007102222-mup6fx7"}
{: id="20251007101950-0d46td2"}
BOM表数据要求:
{: id="20251007101950-mx6n0z8"}
- {: id="20251007101950-wvilwt7"}父料号、子料号、用量比例
{: id="20251007101950-6x7egcc"}
- {: id="20251007101950-dh700zj"}完整的物料层级关系
{: id="20251007101950-3s3cuty"}
- {: id="20251007102256-7lf98jt"}
{: id="20251007102256-tgfu4hi"}
{: id="20251007101950-r20cvwd"}
Focest预测数据要求:
{: id="20251007101950-7wfj835"}
- {: id="20251007101950-cjynlq3"}料号、LIC系数
{: id="20251007101950-48gvvew"}
- {: id="20251007101950-tmr8lst"}56周的需求预测数据
{: id="20251007101950-igk84lq"}
- {: id="20251007101950-raxyodd"}基准日期信息
{: id="20251007101950-lg129e0"}
{: id="20251007101950-v31blto"}
### 参数配置详解
{: id="20251007101950-12z0rkw"}
|单元格|对应数据|默认值|数据源列|说明|
| --| --------| ---| -----| ----------------------------|
|B1|库存量|2|D列|库存报表中库存所在列|
|C1|待验量|3|E列|库存报表中待验量所在列|
|D1|需求量|4|F列|库存报表中需求量所在列|
|E1|PO量|5|G列|库存报表中采购订单量所在列|
|F1|PR量|6|H列|库存报表中采购申请量所在列|
|G1|LT天数|7|I列|库存报表中提前期天数所在列|
|H1|MOQ|8|J列|库存报表中最小订单量所在列|
|I1|结余量|9|K列|库存报表中结余量所在列|
{: colgroup="||||" id="20251007101950-i1k872g"}
如需更改数据提取列,直接修改B1:I1中的数字(如B1=3表示提取库存报表E列数据)
{: id="20251007101950-3rapueu"}
### 4. 0000工作表(主分析仪表板)
{: id="20251007101950-3vhh8c9"}

{: id="20251007103256-08bskql"}
#### 核心分析列说明
{: id="20251007101950-89pe4g7"}
|列|标题|公式|业务含义|
| --| -----------| ----------| ------------------------|
|A|P/N|手工输入|需要分析的料号|
|B|庫存|=VLOOKUP($A3,料件库存报表!$D:$BG,B$1,0)|当前库存数量|
|C|待驗|=VLOOKUP($A3,料件库存报表!$D:$BG,C$1,0)|在检验中的数量|
|D|需求|=VLOOKUP($A3,料件库存报表!$D:$BG,D$1,0)|当前需求量|
|E|PO|=VLOOKUP($A3,料件库存报表!$D:$BG,E$1,0)|采购在途订单量|
|F|PR|=VLOOKUP($A3,料件库存报表!$D:$BG,F$1,0)|采购申请量|
|G|天数|=VLOOKUP($A3,料件库存报表!$D:$BG,G$1,0)|物料提前期(天)|
|H|MOQ|=VLOOKUP($A3,料件库存报表!$D:$BG,H$1,0)|最小订购批量|
|I|结余量|=VLOOKUP($A3,料件库存报表!$D:$BG,I$1,0)|可用库存结余|
|J|L/T+两周|=ROUND(G3/7,0)+2|提前期周数+安全缓冲|
|K|工单欠料|=I3-SUM(...)|结余量减去提前期内需求|
|L|L/T内需求|=SUM(INDIRECT('P'&ROW()&':'&NT($J3+COLUMN($P$1)-1)&ROW()))|提前期内的总需求|
|M|差异|=I3-L3|库存与需求的差异|
|N-BH|周需求|=VLOOKUP($A5,Cutput!$A:$BH,Q$1,0)|各周预测需求数量|
{: colgroup="|||" id="20251007101950-5snse30"}
### 动态需求预测调整
{: id="20251007104428-or2eom7"}
通过修改0000工作表的P2日期,系统实现动态重算:
{: id="20251007104428-t440rq0"}
动态生成时间轴。 它通过计算一个基准周数,并利用列位置自动向右递增,从而快速创建出一系列连续的周序号。当基准日期变化时,整个周序列会自动更新。
{: id="20251007104803-l1ak6we"}
{: id="20251007104435-p1a57hu"}
```mermaid
graph LR
P2[修改开始日期] --> A[重算周偏移量]
A --> B[更新所有日期相关公式]
B --> C[刷新需求时间序列]
C --> D[重新计算L/T内需求]
```
{: id="20251007104428-b0lymn0"}
# VBA代码中文注释
{: id="20251007104110-2uh5k3t"}
## 子程序 A
{: id="20251007104110-jpr1zki"}
```vba
Sub A()
' 调用B子程序处理数据
Call B
' 调用Q子程序生成数据透视表
Call Q
End Sub
```
{: id="20251007104110-mbzdcls"}
## 子程序 B - 主要数据处理程序
{: id="20251007104110-pa95spg"}
```vba
Sub B()
' 关闭屏幕更新、自动计算和事件处理以提高性能
Application.ScreenUpdating = False
Application.Calculation = xlCalculationManual
Application.EnableEvents = False
' 定义工作表变量
Dim wsFocest As Worksheet, wsBOM As Worksheet, wsOutput As Worksheet, wsUnmatched As Worksheet
' 定义行号变量
Dim lastRowF As Long, lastRowB As Long, lastRowO As Long, lastRowU As Long
' 定义循环计数器
Dim i As Long, j As Long, k As Long, col As Long
' 定义数据变量
Dim keyPart As String, material As String, usage As Double
Dim lic As Double, focestCol1 As String, focestCol2 As String
' 定义56周数据数组
Dim weekValues(1 To 56) As Double
' 定义字典对象用于存储BOM数据和未匹配数据
Dim dictBOM As Object, dictUnmatched As Object
Dim materialData As Variant
Dim key As Variant
' 创建字典对象
Set dictBOM = CreateObject("Scripting.Dictionary")
Set dictUnmatched = CreateObject("Scripting.Dictionary")
' 设置工作表引用
Set wsFocest = ThisWorkbook.Sheets("Focest")
Set wsBOM = ThisWorkbook.Sheets("BOM")
' 删除并重新创建输出工作表
On Error Resume Next
Application.DisplayAlerts = False
ThisWorkbook.Sheets("Output").Delete
ThisWorkbook.Sheets("Unmatched").Delete
Application.DisplayAlerts = True
On Error GoTo 0
' 创建新的输出工作表
Set wsOutput = ThisWorkbook.Sheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsOutput.Name = "Output"
Set wsUnmatched = ThisWorkbook.Sheets.Add(After:=wsOutput)
wsUnmatched.Name = "Unmatched"
' 阶段1: 读取BOM数据到字典中
lastRowB = wsBOM.Cells(wsBOM.Rows.Count, "A").End(xlUp).Row
Dim bomData As Variant
bomData = wsBOM.Range("A2:C" & lastRowB).Value
' 遍历BOM数据并填充字典
For i = 1 To UBound(bomData, 1)
keyPart = Trim(bomData(i, 1) & "")
material = Trim(bomData(i, 2) & "")
' 安全处理使用量数值
If IsNumeric(bomData(i, 3)) Then
usage = CDbl(bomData(i, 3))
Else
usage = 0
End If
' 如果关键部件和物料号都不为空,添加到字典
If keyPart <> "" And material <> "" Then
If Not dictBOM.Exists(keyPart) Then
dictBOM.Add keyPart, New Collection
End If
dictBOM(keyPart).Add Array(material, usage)
End If
Next i
' 阶段2: 处理Focest数据 - 只处理有BOM匹配的行
lastRowF = wsFocest.Cells(wsFocest.Rows.Count, "A").End(xlUp).Row
Dim focestData As Variant
focestData = wsFocest.Range("A2:BJ" & lastRowF).Value ' 列A到BJ (A, B + 56周)
' 预计算输出数据大小
Dim outputRowCount As Long
outputRowCount = 0
For i = 1 To UBound(focestData, 1)
keyPart = Trim(focestData(i, 1) & "")
If keyPart <> "" And dictBOM.Exists(keyPart) Then
outputRowCount = outputRowCount + dictBOM(keyPart).Count
End If
Next i
' 准备输出数组
Dim outputData() As Variant
ReDim outputData(1 To outputRowCount, 1 To 60) ' 4个固定列 + 56个周列
lastRowO = 0
' 处理Focest数据
For i = 1 To UBound(focestData, 1)
keyPart = Trim(focestData(i, 1) & "")
If keyPart = "" Then GoTo NextFocestRow
' 只处理有BOM匹配的行
If dictBOM.Exists(keyPart) Then
focestCol1 = focestData(i, 1) & ""
focestCol2 = focestData(i, 2) & ""
' 安全处理LIC值
If IsNumeric(focestData(i, 2)) Then
lic = CDbl(focestData(i, 2))
Else
lic = 0
End If
' 提取周数据并进行错误处理
For j = 1 To 56
If IsNumeric(focestData(i, j + 2)) Then
weekValues(j) = CDbl(focestData(i, j + 2))
Else
weekValues(j) = 0
End If
Next j
' 处理匹配的BOM项目
For k = 1 To dictBOM(keyPart).Count
materialData = dictBOM(keyPart)(k)
material = materialData(0)
usage = materialData(1)
lastRowO = lastRowO + 1
' 填充输出数据
outputData(lastRowO, 1) = focestCol1
outputData(lastRowO, 2) = focestCol2
outputData(lastRowO, 3) = material
outputData(lastRowO, 4) = usage
' 计算每周数据:周值 × LIC × 使用量
For col = 1 To 56
outputData(lastRowO, col + 4) = weekValues(col) * lic * usage
Next col
Next k
End If
NextFocestRow:
Next i
' 阶段3: 单独处理没有BOM匹配的Focest行
For i = 1 To UBound(focestData, 1)
keyPart = Trim(focestData(i, 1) & "")
If keyPart <> "" And Not dictBOM.Exists(keyPart) Then
If Not dictUnmatched.Exists(keyPart) Then
dictUnmatched.Add keyPart, True
End If
End If
Next i
' 批量写入输出数据
If outputRowCount > 0 Then
wsOutput.Range("A2").Resize(outputRowCount, 60).Value = outputData
End If
' 生成未匹配数据工作表
wsUnmatched.Cells(1, 1).Value = "Unmatched Key Part Numbers"
' 写入未匹配的数据
If dictUnmatched.Count > 0 Then
Dim unmatchedData() As Variant
ReDim unmatchedData(1 To dictUnmatched.Count, 1 To 1)
i = 0
For Each key In dictUnmatched.Keys
i = i + 1
unmatchedData(i, 1) = key
Next key
wsUnmatched.Range("A2").Resize(dictUnmatched.Count, 1).Value = unmatchedData
End If
' 设置输出表的标题行
wsOutput.Cells(1, 1).Value = "Focest Col1"
wsOutput.Cells(1, 2).Value = "Focest Col2"
wsOutput.Cells(1, 3).Value = "Material Number"
wsOutput.Cells(1, 4).Value = "BOM Usage"
For col = 1 To 56
wsOutput.Cells(1, col + 4).Value = "Week" & col
Next col
' 自动调整列宽
wsOutput.Columns.AutoFit
wsUnmatched.Columns.AutoFit
' 恢复Excel设置
Application.ScreenUpdating = True
Application.Calculation = xlCalculationAutomatic
Application.EnableEvents = True
' 显示处理完成消息
MsgBox "Processing completed! " & outputRowCount & " rows generated in Output sheet. " & _
dictUnmatched.Count & " unmatched items found."
End Sub
```
{: id="20251007104110-kny6p89"}
## 子程序 Q - 数据透视表生成程序
{: id="20251007104110-v8p7fvg"}
```vba
Sub Q()
' 定义变量
Dim wsSource As Worksheet, wsDest As Worksheet
Dim pvtCache As PivotCache
Dim pvtTable As PivotTable
Dim lastRow As Long
Dim SourceDataRange As Range
Dim i As Long
Dim fieldName As String
Dim startTime As Double
Dim dataField As PivotField
' 开始计时
startTime = Timer
' 禁用Excel功能以提高性能
OptimizeVBA True
On Error GoTo ErrorHandler
' 检查源工作表是否存在
If Not WorksheetExists("Output") Then
MsgBox "Source worksheet 'Output' not found!", vbCritical
GoTo CleanUp
End If
' 设置源工作表引用
Set wsSource = ThisWorkbook.Worksheets("Output")
' 如果目标工作表已存在则删除
If WorksheetExists("Cutput") Then
Application.DisplayAlerts = False
ThisWorkbook.Worksheets("Cutput").Delete
Application.DisplayAlerts = True
End If
' 移除同名的现有数据透视表
RemovePivotTable "WeeklySummaryPivot"
' 创建新的数据透视表工作表
Set wsDest = ThisWorkbook.Worksheets.Add(After:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count))
wsDest.Name = "Cutput"
' 查找源工作表的最后一行数据
lastRow = FindLastRow(wsSource)
' 验证是否有足够的数据
If lastRow < 2 Then
MsgBox "Insufficient data in source worksheet!", vbExclamation
GoTo CleanUp
End If
' 定义源数据范围
Set SourceDataRange = wsSource.Range("A1:BH" & lastRow)
' 从源数据创建数据透视缓存
Set pvtCache = ThisWorkbook.PivotCaches.Create( _
SourceType:=xlDatabase, _
sourceData:=SourceDataRange)
' 创建数据透视表
Set pvtTable = pvtCache.CreatePivotTable( _
TableDestination:=wsDest.Range("A3"), _
tableName:="WeeklySummaryPivot")
' 配置数据透视表
With pvtTable
.ManualUpdate = True
.RowAxisLayout xlTabularRow
' 添加行字段 - 物料号(C列)
.AddFields RowFields:=wsSource.Cells(1, 3).Value
' 添加数据字段(E列到BH列)
For i = 5 To 60
fieldName = wsSource.Cells(1, i).Value
If fieldName <> "" Then
On Error Resume Next
Set dataField = .PivotFields(fieldName)
If Err.Number = 0 Then
With dataField
.Orientation = xlDataField
.Function = xlSum
.NumberFormat = "#,##0"
If InStr(.Caption, "Sum of") = 0 Then
.Caption = "Sum of " & fieldName
End If
End With
Else
Err.Clear
End If
On Error GoTo ErrorHandler
End If
Next i
' 应用格式设置
.ShowTableStyleRowStripes = True
.TableStyle2 = "PivotStyleMedium9"
.ManualUpdate = False
End With
' 添加标题和时间戳
With wsDest
.Range("A1").Value = "Weekly Summary Report"
.Range("A1").Font.Bold = True
.Range("A1").Font.Size = 14
.Range("A2").Value = "Generated: " & Now()
.Range("A2").Font.Italic = True
End With
' 自动调整列宽
If wsDest.UsedRange.Count > 1 Then
wsDest.UsedRange.Columns.AutoFit
End If
' 成功消息
MsgBox "Pivot table created successfully in " & Format(Timer - startTime, "0.00") & _
" seconds! Location: Worksheet " & wsDest.Name, vbInformation
CleanUp:
' 清理和恢复设置
OptimizeVBA False
Set pvtTable = Nothing
Set pvtCache = Nothing
Set SourceDataRange = Nothing
Set wsSource = Nothing
Set wsDest = Nothing
Exit Sub
ErrorHandler:
' 错误处理
MsgBox "Error " & Err.Number & ": " & Err.Description & vbCrLf & _
"Error occurred at line: " & Erl, vbCritical
Resume CleanUp
End Sub
' 辅助函数:优化VBA性能
Sub OptimizeVBA(Optimize As Boolean)
With Application
If Optimize Then
.ScreenUpdating = False
.Calculation = xlCalculationManual
.DisplayAlerts = False
.EnableEvents = False
.StatusBar = "Processing... Please wait"
Else
.ScreenUpdating = True
.Calculation = xlCalculationAutomatic
.DisplayAlerts = True
.EnableEvents = True
.StatusBar = False
End If
End With
End Sub
' 辅助函数:检查工作表是否存在
Function WorksheetExists(sheetName As String) As Boolean
On Error Resume Next
WorksheetExists = Not ThisWorkbook.Sheets(sheetName) Is Nothing
On Error GoTo 0
End Function
' 辅助函数:按名称移除数据透视表
Sub RemovePivotTable(tableName As String)
Dim ws As Worksheet
Dim pt As PivotTable
On Error Resume Next
For Each ws In ThisWorkbook.Worksheets
Set pt = ws.PivotTables(tableName)
If Not pt Is Nothing Then
pt.TableRange2.Clear
Exit For
End If
Next ws
On Error GoTo 0
End Sub
' 辅助函数:查找有数据的最后一行
Function FindLastRow(ws As Worksheet) As Long
On Error Resume Next
FindLastRow = ws.Cells(ws.Rows.Count, "A").End(xlUp).Row
If FindLastRow = 1 And ws.Cells(1, 1).Value = "" Then FindLastRow = 0
If Err.Number <> 0 Then FindLastRow = 0
On Error GoTo 0
End Function
```
{: id="20251007104110-5m3p17h"}
## 代码功能总结
{: id="20251007104110-9k50axy"}
子程序A:主程序入口,依次调用B和Q子程序
{: id="20251007104110-2p9o3tb"}
子程序B:
{: id="20251007104110-x04g2t3"}
1. {: id="20251007104110-78alrwz"}读取BOM(物料清单)数据并建立字典索引
{: id="20251007104110-y2w6cka"}
2. {: id="20251007104110-jewpl19"}处理Focest数据,与BOM数据进行匹配计算
{: id="20251007104110-pl0ocv2"}
3. {: id="20251007104110-n8npioj"}生成包含物料用量和周数据的输出表
{: id="20251007104110-n4kbxkg"}
4. {: id="20251007104110-buwct96"}记录未匹配的关键部件号到单独工作表
{: id="20251007104110-u57rtfv"}
{: id="20251007104110-mdk4nrh"}
子程序Q:
{: id="20251007104110-epkbb6q"}
1. {: id="20251007104110-ssaf42k"}基于B子程序生成的输出表创建数据透视表
{: id="20251007104110-3zpxiwb"}
2. {: id="20251007104110-can3jf8"}按物料号汇总各周数据
{: id="20251007104110-09i643v"}
3. {: id="20251007104110-l3a8e41"}生成格式化的周汇总报告
{: id="20251007104110-zkavtaf"}
{: id="20251007104110-1k3ztzp"}
辅助函数:提供性能优化、工作表检查、数据透视表管理等实用功能
{: id="20251007104110-p70n2ap"}
### 1. Output工作表(详细计算结果)
{: id="20251007104234-4cu6rrj"}
数据结构:
{: id="20251007104234-e7qb5rr"}
- {: id="20251007104234-0bxv2y0"}A列:父料号
{: id="20251007104234-5oy2qrt"}
- {: id="20251007104234-qbbgzn5"}B列:LIC系数(需求放大系数)
{: id="20251007104234-s5l6uui"}
- {: id="20251007104234-953gcfx"}C列:子料号
{: id="20251007104234-ah37p39"}
- {: id="20251007104234-7u0kb66"}D列:BOM用量比例
{: id="20251007104234-3aqvd95"}
- {: id="20251007104234-rvvnzjk"}E-BH列:56周的需求量计算(周1到周56)
{: id="20251007104234-b69x0xh"}
{: id="20251007104234-txu57xv"}
使用场景:需要查看具体料号层级需求计算明细时使用
{: id="20251007104234-hfslodc"}
### 2. Cutput工作表(需求汇总透视表)
{: id="20251007104234-vwfajdj"}
数据结构:
{: id="20251007104234-6wjn3sj"}
- {: id="20251007104234-l8jf64k"}A列:料号
{: id="20251007104234-xeygha8"}
- {: id="20251007104234-37ijdow"}B列开始:各周需求总和
{: id="20251007104234-9oiu7wj"}
- {: id="20251007104234-95gtdk4"}顶部标题:生成日期和时间戳
{: id="20251007104234-jg6348e"}
{: id="20251007104234-a6cpl7g"}
特点:
{: id="20251007104234-3s8pph1"}
- {: id="20251007104234-2sgzz55"}按料号汇总所有层级的需求
{: id="20251007104234-aecu5sx"}
- {: id="20251007104234-ckeyepe"}便于查看每个料件的总需求趋势
{: id="20251007104234-ddgak02"}
- {: id="20251007104234-l1w1dk0"}支持数据透视表分析
{: id="20251007104234-vrhonpy"}
{: id="20251007104234-v7fuqbi"}
### 3. Unmatched工作表(异常检测)
{: id="20251007104234-5obwvx7"}
内容:在Focest预测中出现但未在BOM中找到的料号清单
{: id="20251007104234-4vrosku"}
处理建议:
{: id="20251007104234-7yxg0wn"}
1. {: id="20251007104234-m5cmb4a"}检查BOM完整性
{: id="20251007104234-3gw0d1b"}
2. {: id="20251007104234-d75r9gt"}确认料号编码是否正确
{: id="20251007104234-nnh20ro"}
3. {: id="20251007104234-cfkg1bl"}更新BOM表数据
{: id="20251007104234-4i4zp0z"}
{: id="20251007104234-7tnqloh"}
## 六、常见错误处理
{: id="20251007103854-k7hdkk4"}
|错误类型|症状|根本原因|解决方案|
| --| ----------| -----------------------| -----------------------------|
|#REF!|引用错误|列索引超出数据范围|检查B1:I1值是否在1-55范围内|
|#VALUE!|值错误|数值列中包含文本数据|清理库存报表中的非数值字符|
|#N/A|查找失败|VLOOKUP未找到匹配料号|验证料号在库存报表中存在|
|透视表不更新|数据陈旧|数据源范围未更新|重新运行宏更新数据源|
|NT函数失效|公式错误|宏功能未启用|保存为.xlsm格式并启用宏|
{: id="20251007103854-tvzkohd" colgroup="|||"}
{: id="20251007103858-2h0t16a"}
{: id="20251007101943-jrwn98j" title="Excel物料需求与库存分析系统" type="doc"}