You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Excel录入VBScript偶发跳行问题,请求排查触发场景

排查你的VBScript Excel录入跳行问题的触发场景

先把你提供的代码贴出来方便分析:

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.28 09:34:33