【问题标题】:VBS If file is openVBS 如果文件打开
【发布时间】:2015-04-05 15:49:06
【问题描述】:

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

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

if file is open THEn msgbox("File is open, close file and start again") WScript.退出

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"

【问题讨论】:

  • 您是否收到错误消息?在objExcel.WorkBooks.Open strExcelPath 线上?另一条线?请edit您的问题并粘贴该信息。
  • 否,但是如果excel文件被其他用户或同一台PC打开,它会要求保存或覆盖数据,无论点击什么,它仍然不保存。该脚本仅在未查看 excel 文件时有效,因此我试图找出一种方法让我知道它是否已打开并关闭它。

标签: vbscript inputbox


【解决方案1】:

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

无论如何,参考您的代码,我以一种我熟悉的糟糕方式对其进行了重组,添加了您指定的功能。本质上,任务管理器应用程序列表会检查“示例”Excel 文件的运行实例(取决于您使用的 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

【讨论】:

  • 谢谢,这是一个很好的解决方案。我最终不得不让 visible=false 只是为了隐藏它。事实证明,自从我们将每个人都升级到 Office 2013 后,所有 PC 现在都具有访问数据库,所以我编写了一个脚本,直接输入到我创建报告功能的访问表中……更容易处理数据输入到访问和\或 sql server 中。所以这就是我现在要走的路。我喜欢您在其中所做的错误处理和子创建,这是一个很棒的模板 - 我很感激!
  • 没问题,很高兴为您提供帮助! :)
猜你喜欢
  • 1970-01-01
  • 2016-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多