我的第一个 EXCEL VBA 程式: 捞产线资料分析变压器出力概念
工厂内的产线有不少变压器来控制加热器, 虽然有 DCS 系统可以使用温度感应器控制出力, 但仍不容易判断加热器跟变压器是否不稳定, 除非整个坏掉, 但紧急处理需要备料, 整线等, 造成产线中止的时间也是公司损耗.
而加热器或变压器故障前, 其实是有一段时间的不稳定, 公司用的 DCS 系统也有提供 OPC 介面可以捞取资料, 所以这次就用捞取到的资料, 再透过 EXCEL VBA 进行分析.
主要架构不难....
产线加热器 - 变压器 - DCS - 收资料的电脑 - 个人电脑
DCS 负责控制与收集资料, 本身也有纪录跟趋势图(Trend)功能, 不过不直接对外, 而趋势图要逐一去看有没有不稳太麻烦, 之前也没有写程式算平均数.
收资料的电脑比较单纯, 透过 DCS 的 OPC 介面, 由 VB 呼叫读取特定资料, 再每日存成 CSV 格式的档案.
因为许多同事习惯用 EXCEL , 所以....我的第一个 VBA 程式产生了.
概念也不难, 先查询收资料的电脑有哪些资料档, 以及对应的读取权限, 因为有三条产线, 每条产线有六段, 每段有数个加热器, 所以我用三个 工作表 来对应 产线 , 6 * 8 列(row)来对应不同段, 第一列是 DCS 内的加热器代号, 第二列是 单位 , 第三列是 注解 , 第四列是 平均 , 第五列是 标準差 , 第六列是 变异係数(CV) , 第七列与加热器无关, 是该段的资料档日期, 第八列空着方便与其他段区隔.
这边的排列主要是与 CSV 资料档相对应, 而且只保留有使用加热器的资料.
VBA 内的架构, 则是包括几项:
输入资料日期, 预设是执行 EXCEL 的前一天, 可以改, 并会检查日期格式, 而且不能输入未来日, 也不能输入数字以外的文字.检查资料主机是否有连线, 若未连线, 则使用特定帐号连线, 以便读取资料档.第一层(产线别), 没有使用迴圈, 执行三次呼叫副程式, 参数就是产线代号.第二层(段别), 使用 for ... step 迴圈, 确认产线每段的 CSV 格式资料档案是否存在, 如果在才捞资料.第三层-1(加热器代号-分析档), 这边是用 do ... loop 迴圈, 因为要统计的加热器数量(栏数), 比资料档的栏数少, 所以用了一点点指标的概念, 存分析资料的迴圈, 会每次加一, 然后到加热器名称空白就停止.第三层-2(加热器代号-资料档), 这边也是用 do ... loop 迴圈, 因为资料档还有很多不是加热器的资料, 所以前一项加一后, 这边可能会跳好几栏, 才会再找到一样的加热器代号, 才需要捞资料.前两项的案例, 大约是:(分析档)(第二栏) A (第三栏) D (第四栏) H
(资料档)(第二栏) A (第三栏) B (第四栏) C (第五栏) D (第六栏) E
所以分析档跟资料档中的加热器代号顺序一样, 而需要透过迴圈来剔除非加热器部份.
虽然也可以在分析档保留一个隐藏列标示是资料档的第几栏, 但我还是决定用迴圈.比对加热器代号一致后, 就会使用迴圈的"指标", 开始计算"指标"对到的那栏的平均数, 标準差, 再计算出变异係数.如果平均数大于 0 (避免有些停工的加热器, 量测的平均值小于 0 ), 以及变异係数大于 0.05 的那个加热器, 再从原始资料档複製一份到分析档备查, 以及画出折线图, 方便确认是真的不稳定还是配合产品调整出力.
基本架构就是这样, 实际撰写时则遇到一些判断上需要很注意的地方:
如何判断主机连线, 虽然 dir() 可以判断档案是否存在, 但对网路芳邻的档案, 需要用 \pc\dir*.csv 来判断, 而且虽然文件都写"找不到档案会回传空字串", 但我这边都是出现错误讯息, 而判断式就失败, 所以我先加个变数, 直接先设定为空字串, 再用 on error resume next , 然后再 变数=dir() , 这样如果 变数 还是空字串, 就是没有找到该档.因为複製资料会一直切换分析档跟资料档, 绘製图表也是要指定放在哪个工作表(Sheet)要小心使用 .Activate 切换.这样就完成个人第一个 VBA 程式了.... XD