Excel录入VBScript偶发跳行问题,请求排查触发场景
先把你提供的代码贴出来方便分析:
Dim objExcelApp,a,RCP,ID,objOffice Dim COUNT,CR,i,HR,MNT,SCND,Dt,Tm Dim fso,DY,MNTH,YR Dim a1,a2,a3,a4,a5,a6,a7,a8,a9,a10,a11,a12,a13,a15 HR=Hour(Time()) MNT=Minute(Time()) SCND=Second(Time()) DY = Day(Date()) MNTH = Month(Date()) YR = Year(Date()) Dt = DY & "_" & MNTH & "_" & YR Tm = HR & "_" & MNT a = HMIRuntime.Tags("FLOW_ROW").Read On Error Resume Next Set objOffice = GetObject(,"Excel.Application") objExcelApp.DisplayAlerts = False objOffice.ActiveWorkbook.Save objExcelApp.DisplayAlerts = False objOffice.Workbooks.Close objExcelApp.DisplayAlerts = False objOffice.quit Set objOffice = Nothing Set objExcelApp = CreateObject("Excel.Application") objExcelApp.Visible = False objExcelApp.Workbooks.Open "D:\REPORT\DAILY_FLOW.xlsx" objExcelApp.DisplayAlerts = False objExcelApp.Cells(a,1).Value =Date() objExcelApp.Cells(a,2).Value =Time() objExcelApp.Cells(a,6).Value = 0.5*a objExcelApp.Cells(a,7).Value = 1*a objExcelApp.Cells(a,8).Value = 2*a objExcelApp.Cells(a,9).Value = 3*a objExcelApp.Cells(a,10).Value = 4*a objExcelApp.Cells(a,11).Value = 5*a objExcelApp.Cells(a,12).Value = 6*a objExcelApp.Cells(a,13).Value = 7*a objExcelApp.Cells(a,14).Value = 8*a objExcelApp.Cells(a,15).Value = 9*a objExcelApp.Cells(a,16).Value = 10*a objExcelApp.Cells(a,17).Value = 11*a objExcelApp.ActiveWorkbook.Save objExcelApp.DisplayAlerts = False objExcelApp.Workbooks.Close objExcelApp.Quit Set objExcelApp = Nothing If a=0 Or a=1 Then a=4 HMIRuntime.Tags("FLOW_ROW").Write a Else a=a+1 HMIRuntime.Tags("FLOW_ROW").Write a End If
结合代码逻辑,我梳理出几个可能触发跳行的场景:
On Error Resume Next掩盖操作错误,导致行号无效递增
你全程开启了错误屏蔽,这意味着如果Excel文件被锁定(比如手动打开了它)、保存失败或者单元格写入出错,代码不会给任何提示,反而会继续执行到最后,把FLOW_ROW的值递增。结果就是这次录入根本没成功写到Excel里,但下一次录入会直接跳到下一行,看起来就像是跳行了。多实例并发执行脚本引发行号冲突
如果这个脚本可能被多个HMI客户端、定时任务或者线程同时触发,就会出现并发问题:比如两个实例同时读取到FLOW_ROW=5,各自写完Excel后都把行号改成6。下一次执行时读取到6,直接写到7,跳过了本该由第二个实例写入的行6,造成跳行。脚本异常终止导致行号未更新
你的逻辑是先写完Excel再更新行号,如果在保存完Excel之后、写入FLOW_ROW之前,脚本被强制中断(比如HMI崩溃、系统重启),行号会保留原来的值。下次执行时会重复写入同一行,要是之后再正常执行,就会出现看似跳行的情况(比如连续两次写同一行,之后跳到下一行,中间的重复行被误以为是跳行)。FLOW_ROW标签被意外篡改FLOW_ROW的值存在HMI标签里,如果其他脚本、手动操作或者存储介质(比如PLC寄存器)出问题,导致标签值被改成了一个较大的数(比如突然变成10),下一次录入就会直接跳到行11,出现跳行。Excel进程清理逻辑的漏洞
开头清理Excel进程的代码有问题:如果没有运行的Excel进程,GetObject会报错,但被On Error Resume Next屏蔽了,后续的objOffice.ActiveWorkbook.Save等操作会因为objOffice是空值而失败,但错误被掩盖。要是残留的Excel进程拿着文件锁,新创建的Excel对象无法正常写入,这次录入失败但行号还是被递增了,也会引发跳行。
内容的提问来源于stack exchange,提问作者Kushant Vyas

