Vbscript VBS定时器不为';t通过HTA更新/刷新

Vbscript VBS定时器不为';t通过HTA更新/刷新,vbscript,hta,Vbscript,Hta,一旦用户提交表单,我就会运行一些sub。但是,一旦vbs启动在后面启动excel并运行宏的代码部分,计时器就会挂起。想知道如何改进代码以修复此问题/如果可能的话。提前谢谢 <html> <title>Report Generation</title> <head> <HTA:APPLICATION APPLICATIONNAME="Report Generation" SCROLL="No" CAPTIO

一旦用户提交表单,我就会运行一些sub。但是,一旦vbs启动在后面启动excel并运行宏的代码部分,计时器就会挂起。想知道如何改进代码以修复此问题/如果可能的话。提前谢谢

 <html>
 <title>Report Generation</title>
 <head>
 <HTA:APPLICATION 
    APPLICATIONNAME="Report Generation"  
    SCROLL="No"
    CAPTION="yes"
    MAXIMIZEBUTTON="no"
    MINIMIZEBUTTON="no"
    SINGLEINSTANCE="yes"
    WINDOWSTATE="normal"
    SYSMENU="no"
    BORDER="thin"
    BORDERSTYLE="Normal"
    CONTEXTMENU="no"
    SELECTION="no">
 </head>

 <style>
 BODY
 {
 background-color: buttonface;
 Font: arial,sans-serif
 margin-top: 10px;
 margin-left: 20px;
 margin-right: 20px;
 margin-bottom: 5px;
 }
 .button
 {
 width: 91px;
 height: 25px;
 font-family: arial,sans-serif;
 font-size: 8pt;
 }
 td
 {
 font-family: arial,sans-serif;
 font-size: 10pt;
 }                     
 #scroll
 {
 height:100%;
 overflow:auto;
 }
 SELECT.FixedWidth 
 {
 width: 17em;  /* maybe use px for pixels or pt for points here */
 }
 </style>

 <script language="vbscript">
 'Option Explicit

    Dim pbTimerID
    Dim pbHTML 
    Dim pbWaitTime
    Dim pbHeight
    Dim pbWidth
    Dim pbBorder
    Dim pbUnloadedColor
    Dim pbLoadedColor
    Dim pbStartTime 
    Dim sitecode
    Dim objExcel  
    Dim objWorkbook
    Dim objSheet  

    'window size
    Dim WinWidth : WinWidth = 350
    Dim WinHeight : WinHeight = 330
    Window.ResizeTo WinWidth, WinHeight

 Sub Sleep(lngDelay)
    CreateObject("WScript.Shell").Run "Timeout /T " & lngDelay & " /nobreak", 0, True
 End Sub

 Sub sleepy
    Set objShell = CreateObject("WScript.Shell")
    strCmd = "%COMSPEC% /c"
    objShell.Run strCmd,0,1
End Sub 

 Sub CheckBoxChange
    If CheckBox(0).Checked Then
    ExecuteScoreCard
    Else
    MsgBox "CheckBox is not checked"
    End If
 End Sub

 Sub ExecuteScoreCard() 
    sleepy
    disablebtns
    sleepy  
    ProgressBarViz
    sleepy
    dim fso: set fso = CreateObject("Scripting.FileSystemObject")
    dim path: path = fso.GetAbsolutePathName(".")

    Set objExcel = CreateObject("Excel.Application")
    objExcel.Automationsecurity = 1
    Set objWorkbook = objExcel.Workbooks.Open(path & "\Scorecard.xlsm")
    Set objSheet = objWorkbook.Worksheets("Cover Tab") 

    sitecode = document.getElementById("sitecode").value

    objSheet.Cells(4, 2) = sitecode
    objExcel.Run "Scorecard.xlsm!Module2.RefreshConns"
    Sleep 60 

    objExcel.ActiveWorkbook.SaveAs path & "\Scorecards\" & "Scorecard_" & sitecode & "_" & Year(Now()) & Month(Now()) & Day(Now()) & "_" & Hour(Now()) & Minute(Now()) &".xlsm", 52
    objExcel.ActiveWorkbook.Close
    objExcel.Quit   

    DoAction1

    enablebtns

 End Sub

 Sub ProgressBarViz
    ' Progress Bar Settings
    pbWaitTime = 180        ' How many seconds the progress bar lasts
    pbHeight = 20       ' Progress bar height
    pbWidth= 285        ' Progress bar width
    pbUnloadedColor="white"     ' Color of unloaded area
    pbLoadedColor="black"       ' Color of loaded area
    pbBorder="grey"     ' Color of Progress bar border
    ' Don't edit these things
    sleepy
    pbStartTime = now()
    sleepy
    rProgressbar
    sleepy
    pbTimerID = window.setInterval("rProgressbar", 200)
    sleepy
 end sub

 Sub rProgressbar

    pbHTML = ""
    pbSecsPassed = DateDiff("s",pbStartTime,Now)
    pbMinsToGo =  Int((pbWaitTime - pbSecsPassed) / 60)
    pbSecsToGo = Int((pbWaitTime - pbSecsPassed) - (pbMinsToGo * 60))

    if pbSecsToGo < 10 then
        pbSecsToGo = "0" & pbSecsToGo 
    end if

    pbLoadedWidth = (pbSecsPassed / pbWaittime) * pbWidth
    pbUnloadedWidth = pbWidth - pbLoadedWidth
    pbHTML = pbHTML & "<table border=1 bordercolor=" & pbBorder & " cellpadding=0 cellspacing=0 width=" & pbWidth & "><tr>"
    pbHTML = pbHTML & "<th width=" & pbLoadedWidth & " height=" & pbHeight & "align=left bgcolor="  & pbLoadedColor & "></th>"
    pbHTML = pbHTML & "<th width=" & pbUnloadedWidth & " height=" & pbHeight & "align=left bgcolor="  & pbUnLoadedColor & "></th>"
    pbHTML = pbHTML & "</tr></table><br>"
    pbHTML = pbHTML & "<table border=0 cellpadding=0 cellspacing=0 width=" & pbWidth & "><tr>"
    pbHTML = pbHTML & "<td align=center width=" & pbWidth & "% height=" & pbHeight & ">" & pbMinsToGo & ":" & pbSecsToGo & " remaining</td>"
    pbHTML = pbHTML & "</tr></table>"
    progressbar.InnerHTML = pbHTML

    sleepy

    if DateDiff("s",pbStartTime,Now) >= pbWaitTime then
        StopTimer
    end if

 End Sub

 Sub disablebtns
 btnSubmit.disabled = True
 btnExit.disabled = True
 end Sub

 Sub enablebtns
 btnSubmit.disabled = False
 btnExit.disabled = False
 end Sub

 Sub StopTimer
    window.clearInterval(PBTimerID)
 End Sub

 Sub DoAction1
    MsgBox ("Successfully generated scorecard.")
 End Sub

 Sub DoAction2
    MsgBox ("Successfully generated report2.")
 End Sub

 Sub DoAction3
    MsgBox ("Successfully generated report3.")
 End Sub

 Sub ExitProgram
    window.close()
 End Sub

 </script>

 <body>
 Site Code: <input type="inputbox" name="sitecode" id="sitecode">
 <br><br>
 <input type="checkbox" name="CheckBox"> Scorecard
 <br>
  <input type="checkbox" name="CheckBox"> Report2
 <br>
  <input type="checkbox" name="CheckBox"> Report3
 <br>
 <br>
 <span id = "progressbar"></span>
 <br>
 <div align="center">
  <input type="button" name="accept" id="btnSubmit" value="Submit" onclick="CheckBoxChange" style="height:30px; width:100px">
  <input type="button" name="abort" id="btnExit" value="Exit" onClick="ExitProgram" style="height:30px; width:100px">
  <br>
 </body>
 </html> 

报告生成
身体
{
背景色:按钮面;
字体:arial,无衬线
边缘顶部:10px;
左边距:20px;
右边距:20px;
边缘底部:5px;
}
按钮
{
宽度:91px;
高度:25px;
字体系列:arial,无衬线;
字号:8pt;
}
运输署
{
字体系列:arial,无衬线;
字号:10pt;
}                     
#卷轴
{
身高:100%;
溢出:自动;
}
选择FixedWidth
{
宽度:17em;/*这里可能使用像素px或点pt*/
}
'选项显式
暗pbTimerID
Dim pbHTML
暗淡的等待时间
暗高度
暗边宽度
模糊边界
暗色
暗淡的pbLoadedColor
暗淡的开始时间
Dim站点代码
暗盒
Dim OBJJ工作簿
暗表
“窗口大小
尺寸WinWidth:WinWidth=350
尺寸WinHeight:WinHeight=330
Window.ResizeTo WinWidth、WinHeight
子睡眠(lngDelay)
CreateObject(“WScript.Shell”)。运行“Timeout/T”&lngDelay&“/nobreak”,0,True
端接头
亚困倦
设置objShell=CreateObject(“WScript.Shell”)
strCmd=“%COMSPEC%/c”
运行strCmd,0,1
端接头
子复选框更改
如果选中复选框(0)。则选中
执行卡
其他的
MsgBox“未选中复选框”
如果结束
端接头
副执行官信用卡()
困乏的
禁用的
困乏的
进步巴维兹
困乏的
dim fso:set fso=CreateObject(“Scripting.FileSystemObject”)
dim path:path=fso.GetAbsolutePathName(“.”)
设置objExcel=CreateObject(“Excel.Application”)
objExcel.Automationsecurity=1
设置objWorkbook=objExcel.Workbooks.Open(路径&“\Scorecard.xlsm”)
设置objSheet=objWorkbook.worksheet(“封面选项卡”)
sitecode=document.getElementById(“sitecode”).value
对象表单元格(4,2)=站点代码
运行“Scorecard.xlsm!Module2.RefreshConns”
睡60
objExcel.ActiveWorkbook.SaveAs路径&“\Scorecards\”和“Scorecard”&“Scorecard”&“年(现在())&Month(现在())&Day(现在())&Hour(现在())&Minute(现在())&xlsm”,52
objExcel.ActiveWorkbook.Close
退出
行动1
使能基站
端接头
巴维兹亚区
'进度条设置
pbWaitTime=180'进度条持续多少秒
pbHeight=20'进度条高度
pbWidth=285'进度条宽度
pbUnloadedColor=“白色”卸载区域的颜色
pbLoadedColor=“黑色”加载区域的颜色
pbBorder=“灰色”进度条边框的颜色
“不要编辑这些内容
困乏的
pbStartTime=now()
困乏的
rProgressbar
困乏的
pbTimerID=window.setInterval(“rProgressbar”,200)
困乏的
端接头
子rProgressbar
pbHTML=“”
pbSecsPassed=DateDiff(“s”,pbStartTime,Now)
pbMinsToGo=Int((pbWaitTime-pbSecsPassed)/60)
pbSecsToGo=Int((pbWaitTime-pbSecsPassed)-(pbMinsToGo*60))
如果pbSecsToGo小于10,则
pbSecsToGo=“0”&pbSecsToGo
如果结束
pbLoadedWidth=(pbSecsPassed/pbWaittime)*pbWidth
pbUnloadedWidth=pbWidth-pbLoadedWidth
pbHTML=pbHTML&“”
pbHTML=pbHTML&“”
pbHTML=pbHTML&“”
pbHTML=pbHTML&“
” pbHTML=pbHTML&“” pbHTML=pbHTML&&pbMinsToGo&&pbSecsToGo&“剩余” pbHTML=pbHTML&“” progressbar.InnerHTML=pbHTML 困乏的 如果DateDiff(“s”,pbStartTime,Now)>=pbWaitTime则 计时器 如果结束 端接头 次禁用基站 btnSubmit.disabled=True btnExit.disabled=True 端接头 子使能BTN btnSubmit.disabled=False btnExit.disabled=False 端接头 副计时器 窗口清除间隔(PBTimerID) 端接头 副作用1 MsgBox(“成功生成记分卡”) 端接头 副作用2 MsgBox(“已成功生成报告2”) 端接头 次级方案3 MsgBox(“已成功生成报告3”) 端接头 子出口程序 window.close() 端接头 站点代码:

记分卡
报告2
报告3




因此,如果有人遇到此问题,解决此问题的方法是将实际调用excel工作表并触发宏的子系统分开,只调用vbs而不是excel工作簿

刷新.vbs

If WScript.Arguments.Count > 0 Then
    sitecode = Wscript.Arguments(0)
Else
    WScript.Quit
End If

set fso = CreateObject("Scripting.FileSystemObject")
path = fso.GetAbsolutePathName(".")

Set objExcel = CreateObject("Excel.Application")
objExcel.Automationsecurity = 1
Set objWorkbook = objExcel.Workbooks.Open(path & "\Scorecard.xlsm")
Set objSheet = objWorkbook.Worksheets("Cover Tab") 

objSheet.Cells(4, 2) = sitecode

objExcel.Run "Scorecard.xlsm!Module2.RefreshConns"

objExcel.ActiveWorkbook.SaveAs path & "\Scorecards\" & "Scorecard_" & sitecode & "_" & Year(Now()) & Month(Now()) & Day(Now()) & "_" & Hour(Now()) & Minute(Now()) &".xlsm", 52
objExcel.ActiveWorkbook.Close
objExcel.Quit

这不是我的答案,而是专家交换上的另一个用户。尽管如此,它仍然可以完美地工作。

因此,如果有人遇到此问题,解决此问题的方法是将实际调用excel工作表并触发宏的子系统分开,只需调用vbs而不是excel工作簿

刷新.vbs

If WScript.Arguments.Count > 0 Then
    sitecode = Wscript.Arguments(0)
Else
    WScript.Quit
End If

set fso = CreateObject("Scripting.FileSystemObject")
path = fso.GetAbsolutePathName(".")

Set objExcel = CreateObject("Excel.Application")
objExcel.Automationsecurity = 1
Set objWorkbook = objExcel.Workbooks.Open(path & "\Scorecard.xlsm")
Set objSheet = objWorkbook.Worksheets("Cover Tab") 

objSheet.Cells(4, 2) = sitecode

objExcel.Run "Scorecard.xlsm!Module2.RefreshConns"

objExcel.ActiveWorkbook.SaveAs path & "\Scorecards\" & "Scorecard_" & sitecode & "_" & Year(Now()) & Month(Now()) & Day(Now()) & "_" & Hour(Now()) & Minute(Now()) &".xlsm", 52
objExcel.ActiveWorkbook.Close
objExcel.Quit

这不是我的答案,而是专家交换上的另一个用户。不过,它工作得很好。

如果您询问宏运行后计时器为何挂起,请共享宏。如果您询问宏运行后计时器为何挂起,请共享宏。