2015-04-05 88 views
2

我已经有一个简单的程序,而不是将数据扫描到电子表格中以及时间戳,然后您可以通过保存更新数据,或者退出并退出并保存。VBS如果文件打开

我一直在坚持一天左右的唯一问题是解决电子表格已经打开的情况下的错误处理。我喜欢有这样的事情;

如果文件被打开,然后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" 
+0

您是否收到错误信息?在'objExcel.WorkBooks.Open strExcelPath'行?另一条线?请[编辑]您的问题并粘贴该信息。 – JosefZ 2015-04-05 17:03:54

+0

不,但如果excel文件是由另一个用户或在同一台PC上打开,它会要求保存或覆盖数据,不管点击什么,它仍然不会保存。该脚本仅适用于未查看excel文件的情况,因此我试图找出一种方法让我知道它是否已打开并关闭它。 – 2015-04-05 17:53:15

回答

0

这可能会帮助你指明正确的方向。对不起,冲突的,小写的语法和非传统的缩进(不要遵循我的坏习惯 - 保持你的!:D),我把它写在你看到的记事本中 - 但它已经测试成功。

无论如何,参照你的代码,我已经以一种不好的方式对它进行了重构,这对我很熟悉,增加了你指定的功能。本质上,检查任务管理器应用程序列表以查找“示例”Excel文件的运行实例(取决于您使用的语法的版本不同)。

如果发现它将使其成为活动窗口(从而防止只读重复实例启动)。如果没有找到实例,它将打开“example.xlsx”,在这种情况下使用脚本本身的相对路径。一个子程序然后被称为与细胞做生意...

我已经写了这样的方式来尝试保持您的规格,以及维护“确定”和“取消”按钮明确功能。请随意修改此,您可能需要不同地址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 
+0

谢谢,这是一个很好的解决方案。我只是为了隐藏它而不得不制作visible = false。自从我们将所有人升级到office 2013以来,所有PC都有访问数据库,所以我编写了一个脚本直接输入到我创建的报告功能的访问表中。..更方便地处理数据输入到访问和\或sql服务器..所以这就是我现在采取的道路。 我喜欢你在这做的错误处理和子创建,这使得一个伟大的模板 - 我很感激它! – 2015-04-13 01:58:21

+0

没问题,乐于帮忙! :) – 2015-04-13 04:06:37