如何使用VBA实现PI压缩数据函数的自动调整大小?
解决PI Datalink压缩数据函数批量重计算调整大小的问题
问题分析
你Excel工作簿里的多个Compressed Data函数共用同一起止时间单元格,扩大时间范围后函数不会自动扩容,只能手动右键选“Recalculate (Resize) Function”,但Application.CalculateFull触发不了插件管理的函数重计算,预建大区域又会出现填充空格的空白单元格。
可行解决方案
1. 调用PI Datalink API批量处理
PI Datalink自带VBA接口,能直接触发函数重计算和调整,用下面的代码遍历所有PI函数批量处理:
Sub BatchResizePICompressedData() Dim piFunc As PIFunction ' 遍历工作簿里所有PI Datalink函数 For Each piFunc In Application.COMAddIns("PISDKExcelAddIn").Object.PIFunctions ' 只处理Compressed Data类型的函数 If piFunc.FunctionType = "Compressed Data" Then ' 执行重计算并自动调整区域大小 piFunc.Recalculate True End If Next piFunc End Sub
- 注意:运行前要确保PI Datalink加载项已启用,且在VBA编辑器的「工具→引用」里勾选
PI SDK和PI DataLink相关库。
2. 通过起止单元格触发关联函数更新
既然所有Compressed Data函数都引用同一两个起止单元格,可通过修改单元格属性触发依赖更新,再配合PI的批量重计算:
Sub TriggerResizeByTimeCells() Dim timeStartCell As Range, timeEndCell As Range ' 替换成你的起止时间单元格地址,比如Sheet1!A1和Sheet1!A2 Set timeStartCell = ThisWorkbook.Sheets("Sheet1").Range("A1") Set timeEndCell = ThisWorkbook.Sheets("Sheet1").Range("A2") ' 临时修改再还原单元格值,触发依赖更新 Dim tempStart As Variant, tempEnd As Variant tempStart = timeStartCell.Value tempEnd = timeEndCell.Value timeStartCell.Value = tempStart timeEndCell.Value = tempEnd ' 调用PI Datalink的批量重计算,自动调整所有函数大小 Application.COMAddIns("PISDKExcelAddIn").Object.RecalculateAllFunctions True End Sub
3. 清除预建区域的空格
如果必须用预建大区域的函数,可批量清理空格:
Sub CleanPIBlankSpaces() Dim rng As Range ' 遍历所有PI函数的输出区域,替换空格为空 For Each piFunc In Application.COMAddIns("PISDKExcelAddIn").Object.PIFunctions Set rng = piFunc.OutputRange rng.Replace What:=" ", Replacement:="", LookAt:=xlWhole Next piFunc End Sub
内容的提问来源于stack exchange,提问作者phil98k
相关产品推荐
相关产品推荐

