VBS如果文件已打开

时间:2015-04-05 15:49:06

标签: vbscript inputbox

我有一个简单的程序,而不是将数据扫描到电子表格以及时间戳,然后您可以通过保存更新数据,或退出并退出并保存。

我坚持了一天左右的唯一问题是解决电子表格已经打开的案例的错误处理问题。我喜欢这样的东西;

如果文件已打开THEn 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"

1 个答案:

答案 0 :(得分:0)

这可能有助于指明您正确的方向。对于匆忙的小写语法和非常规缩进感到抱歉(不要遵循我的不良做法 - 保留你的!:D),我在你看到的记事本中写了 - 但它已经成功测试过。

无论如何,参考你的代码,我已经以一种糟糕的方式对其进行了重组,我很熟悉,添加了你指定的功能。基本上,检查任务管理器应用程序列表以查找"示例"的运行实例。 Excel文件(取决于您使用语法的Excel版本会有所不同)。

如果找到它将使其成为活动窗口(从而防止只读重复实例启动)。如果没有找到实例,它将打开" example.xlsx",在这种情况下使用脚本本身的相对路径。然后调用子程序与单元格进行业务...

我已经用这样的方式写了它,试着保持你的规格并保持" OK"和"取消"按钮明确功能。请随意修补此问题,您可能需要以不同方式处理pathinstr行。我希望它有所帮助!一切顺利。

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