Vbscript 如果文件处于打开状态,则使用VBS

Vbscript 如果文件处于打开状态,则使用VBS,vbscript,inputbox,Vbscript,Inputbox,我有一个简单的程序,可以将数据扫描到带有时间戳的电子表格中,然后您可以通过保存来更新数据,也可以退出并退出并保存 我被困了一天左右的唯一问题是解决电子表格已经打开的情况下的错误处理问题。我想要这样的东西 如果文件已打开,则msgbox(“文件已打开,请关闭文件并重新启动”) WScript.Quit Option Explicit DIM oFs: Set oFs = CreateObject("Scripting.FileSystemObject") DIM objExcel, strExce

我有一个简单的程序,可以将数据扫描到带有时间戳的电子表格中,然后您可以通过保存来更新数据,也可以退出并退出并保存

我被困了一天左右的唯一问题是解决电子表格已经打开的情况下的错误处理问题。我想要这样的东西

如果文件已打开,则msgbox(“文件已打开,请关闭文件并重新启动”) WScript.Quit

Option Explicit
DIM oFs: Set oFs = CreateObject("Scripting.FileSystemObject")
DIM objExcel, strExcelPath, objSheet
DIM ib
DIM msg1
DIM msg2
strExcelPath = "c:\temp\Example.xls"
Set objExcel = CreateObject("Excel.Application")
objExcel.WorkBooks.Open strExcelPath
Set objSheet = objExcel.ActiveWorkbook.Worksheets(1)

DO 
ib=inputbox("SCAN NAME, SCAN LOTS"&vbCrLf&"TO UPDATE,SCAN ""UPDATE."""&vbCrLf&"TO EXIT, SCAN ""QUIT.""","Picklot Passout Database")
    IF ib="" THEN
    msg1=MsgBox("You must scan either a NAME or LOT NUMBER."&vbCrLf&"If you want to exit, scan QUIT."&vbCrLf&"Click OK to continue.",vbokonly,"Cannot Insert Blank Data")

    ELSEIF ib= "QUIT" OR ib= "quit" THEN
            objExcel.ActiveWorkbook.Save
            objExcel.ActiveWorkbook.Close
            objExcel.Application.Quit
            set objExcel = Nothing
            Set oFs = Nothing

        ELSEIF ib="update" OR ib="UPDATE" THEN
            objExcel.ActiveWorkbook.Save
            msg2=MsgBox("Update Complete.",vbokonly,"Database Updated")
        ELSE
            objSheet.Range("A2").EntireRow.Insert
            objSheet.Cells(2, 1).Value = ib
            objSheet.Cells(2, 2).Value=(now)

            END IF


    LOOP WHILE NOT ib="quit" AND NOT ib="QUIT"

这可能会帮助你找到正确的方向。抱歉,我在记事本中写下了仓促的、小写的语法和非常规的缩进(不要遵循我的坏习惯-保留你的!:D),但是它已经被成功地测试过了

无论如何,关于你的代码,我已经用一种我熟悉的糟糕的方式重新构造了它,添加了你指定的功能。本质上,任务管理器应用程序列表会检查“示例”Excel文件的运行实例(取决于您使用的Excel版本,语法会有所不同)

如果找到,它将使其成为活动窗口(从而防止启动只读重复实例)。如果找不到实例,它将打开“example.xlsx”,在本例中使用脚本本身的相对路径。然后调用一个子例程来处理单元格

我用这样一种方式写它,试图保持你的规格,以及维护“确定”和“取消”按钮明确的功能。请随意修改,您可能需要以不同的方式处理
路径
指令
行。我希望有帮助!祝你一切顺利

path=createobject("scripting.filesystemobject").getparentfoldername(wscript.scriptfullname)
excelpath=path&"\example.xlsx"

set objword=createobject("word.application")
set coltasks=objword.tasks
i=0

for each objtask in coltasks
    name=lcase(objtask.name)
    if instr(name, "microsoft excel - example") then
    i=1
    end if
next

    if i=1 then
    wscript.echo "An active instance of ""example.xlsx"" has been found"
    set objexcel=getobject(excelpath)
    call UPDATER

    else
    set objexcel=createobject("excel.application")
    objexcel.workbooks.open(excelpath)
    set objsheet=objexcel.activeworkbook.worksheets(1)
    objexcel.visible=true   
    call UPDATER
    end if


sub UPDATER
do 
data=inputbox("Please enter data" &vbcrlf&vbcrlf& "To save data & continue, type ""update""" &vbcrlf& "To save data & exit, type ""quit""","Excel DB Updater")
    if isempty(data) then
    objexcel.activeworkbook.close
    objexcel.application.quit   
    wscript.quit()

    elseif lcase(data)="quit" then
    objexcel.activeworkbook.save
    objexcel.activeworkbook.close
    objexcel.application.quit
    quit=msgbox("DB Updating complete",vbokonly,"Excel DB  Updater")
    wscript.quit

    elseif lcase(data)="update" then
    objexcel.activeworkbook.save
    update=msgbox("Data save complete, press OK to continue",vbokonly,"Excel DB Updater")

    elseif len(data)<>0 then
    objsheet.range("A1").entirerow.insert
    objsheet.cells(1, 1).value=data
    objsheet.cells(1, 2).value=(now)
    add=msgbox("Data added, press OK to continue",vbokonly,"Excel DB Updater")
    end if
loop while len(data)>=0 and not lcase(data)="quit"
end sub
path=createobject(“scripting.filesystemobject”).getparentfoldername(wscript.scriptfullname)
excelpath=path&“\example.xlsx”
设置objword=createobject(“word.application”)
设置coltasks=objword.tasks
i=0
对于coltasks中的每个objtask
name=lcase(objtask.name)
如果instr(名称,“microsoft excel-示例”),则
i=1
如果结束
下一个
如果i=1,那么
wscript.echo“已找到”“example.xlsx”“的活动实例”
设置objexcel=getobject(excelpath)
呼叫更新程序
其他的
设置objexcel=createobject(“excel.application”)
objexcel.workbooks.open(excelpath)
设置objsheet=objexcel.activeworkbook.worksheets(1)
objexcel.visible=true
呼叫更新程序
如果结束
子更新程序
做
数据=输入框(“请输入数据”&vbcrlf&vbcrlf&“保存数据并继续,键入“更新”&vbcrlf&“保存数据并退出,键入“退出”、“Excel DB更新程序”)
如果是空的(数据),那么
objexcel.activeworkbook.close
objexcel.application.quit
wscript.quit()
elseif lcase(数据)=“退出”然后
objexcel.activeworkbook.save
objexcel.activeworkbook.close
objexcel.application.quit
quit=msgbox(“数据库更新完成”,vbokonly,“Excel数据库更新程序”)
wscript.quit
elseif lcase(数据)=“更新”然后
objexcel.activeworkbook.save
update=msgbox(“数据保存完成,按OK继续”,vbokonly,“Excel DB更新程序”)
elseif len(数据)0然后
对象表范围(“A1”).entirerow.insert
objsheet.cells(1,1).value=数据
单元格(1,2).value=(现在)
add=msgbox(“添加数据,按OK继续”,vbokonly,“Excel DB更新程序”)
如果结束
在len(数据)>=0而不是lcase(数据)=“退出”时循环
端接头

您是否收到错误消息?在
objExcel.WorkBooks.Open strExcelPath
行上?另一条线?请回答您的问题并粘贴该信息。否,但如果excel文件由其他用户或在同一台电脑上打开,它会要求保存或覆盖数据,无论单击什么,它仍然不会保存。该脚本仅在excel文件未被查看时有效,因此我试图找到一种方法让我知道它是否打开并关闭。谢谢,这是一个非常好的解决方案。我最终不得不将visible=false设置为隐藏它。事实证明,自从我们将everyone升级到office 2013之后,所有PC机现在都有access数据库,所以我编写了一个脚本,直接输入我创建报告函数的access表。。更轻松地处理access和\或sql server中的数据输入。。这就是我现在要走的路。我喜欢你在这里做的错误处理和子创建,这是一个伟大的模板-我很感激!没问题,很乐意帮忙!:)