高手来看看这段VBS操作EXCEL的代码,JAVA没搞定,来这里拜山了~

wsyqy 2009-07-29 09:46:24
例子是一个VBS操纵EXCEL的例子

想达到的效果是,用VBS打开EXCEL给用户看,当用户看完后自动删除这个EXCEL文件,由于操作都在HTA的VBA里进行,所以在用户未关闭EXCEL文件时,强制冻结HTA,使之无法关闭。
大意就是这样,期待高手来帮忙

在JAVA那边问了两个帖子合计150分,没有搞定,所以来这边,小弟是JAVA新人,VBS前天才开始看,不会的地方请不吝赐教,分少了点,不过真心求解,如果能有别的解决方法也可以

想要的效果就是当用户关闭EXCEL文件后,将此EXCEL文件删除。


Option Explicit

Sub Window_OnLoad
on error resume next

Dim m_Excel
Dim m_FSO
Const m_FILENAME = "要删除的文件.xls"

Set m_FSO = CreateObject("Scripting.FileSystemObject")
Set m_Excel = CreateObject("Excel.Application")
With m_Excel
.Workbooks.Open(m_FILENAME)
.Visible = True
.DisplayAlerts=False
.WindowState = -4137 'xlMaximized
.ActiveWindow.WindowState = -4137 'xlMaximized
.CommandBars("Worksheet Menu Bar").Enabled = True
End With

' 等待EXCEL结束
Dim m_WindowCount
m_WindowCount = m_Excel.Workbooks.count
Do Until m_WindowCount = 0
Sleep 2000 '此处未执行...
m_WindowCount = m_Excel.Workbooks.Count
Loop

' 结束进程
Set m_Excel = Nothing

' 删除文件
if m_FSO.FileExists(m_FILENAME) = True Then
m_FSO.DeleteFile m_FILENAME
End if

' 关闭HTA
Set m_FSO = Nothing
Self.Close

End Sub
...全文
461 12 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
hookee 2009-07-29
  • 打赏
  • 举报
回复
Set m_Excel = Nothing前加m_Excel.Quit试试看
我这里测试关掉excel,hta就关闭,可以xls文件可以删除。 是不是还有其他地方用到了xls?
wsyqy 2009-07-29
  • 打赏
  • 举报
回复
老大,冻结成功,但是我文件删除不了,看来是那个进程没关闭,我研究了半天也不知道是哪个占用,麻烦再指点指点啊

程序还是以前的那个,只是去掉了Sleep

hookee提供的我也用了,同样删不掉啊
hookee 2009-07-29
  • 打赏
  • 举报
回复

<!doctype html public "-//W3C//DTD HTML 4.0//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<script type="text/vbscript" language="vbscript">
Option Explicit
Dim m_Excel
Dim m_FSO
Dim tid
Const m_FILENAME = "d:\xx.xls"
tid = Null

Sub check
If Not IsNull(tid) Then
window.clearTimeout tid
tid = Null
End If
Dim m_WindowCount
m_WindowCount = m_Excel.Workbooks.count
If m_WindowCount = 0 Then
' 结束进程
Set m_Excel = Nothing

' 删除文件
if m_FSO.FileExists(m_FILENAME) = True Then
m_FSO.DeleteFile m_FILENAME
End if

' 关闭HTA
Set m_FSO = Nothing
Self.Close
Else
tid = window.setTimeout("check", 2000)
End If
End Sub


Sub Window_OnLoad
'on error resume next

Set m_FSO = CreateObject("Scripting.FileSystemObject")
Set m_Excel = CreateObject("Excel.Application")
With m_Excel
.Workbooks.Open(m_FILENAME)
.Visible = True
.DisplayAlerts=False
.WindowState = -4137 'xlMaximized
.ActiveWindow.WindowState = -4137 'xlMaximized
.CommandBars("Worksheet Menu Bar").Enabled = True
End With
tid = window.setTimeout("check", 2000)

End Sub
</script>
</head>
<body bgcolor="#eeeeee">
<center>
<br>
<a>请等待...</a>
</center>
</body>
</html>
wsyqy 2009-07-29
  • 打赏
  • 举报
回复
感谢二位,我也发现问题了,原来就是因为没声明 SHELL,所以SLEEP无法直接用,加上CreateObject("WScript.Shell") 就OK了,不过下边删除又出了点问题,我再看看,不懂再问哈~
cpp2017 2009-07-29
  • 打赏
  • 举报
回复
去掉sleep就可以了.
wsyqy 2009-07-29
  • 打赏
  • 举报
回复

<!doctype html public "-//W3C//DTD HTML 4.0//EN">
<html lang="ja">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS">
<script type="text/vbscript" language="vbscript">
Option Explicit

Sub Window_OnLoad
on error resume next

Dim m_Excel
Dim m_FSO
Const m_FILENAME = "要删除的文件.xls"

Set m_FSO = CreateObject("Scripting.FileSystemObject")
Set m_Excel = CreateObject("Excel.Application")
With m_Excel
.Workbooks.Open(m_FILENAME)
.Visible = True
.DisplayAlerts=False
.WindowState = -4137 'xlMaximized
.ActiveWindow.WindowState = -4137 'xlMaximized
.CommandBars("Worksheet Menu Bar").Enabled = True
End With

' 等待EXCEL结束
Dim m_WindowCount
m_WindowCount = m_Excel.Workbooks.count
Do Until m_WindowCount = 0
Sleep 2000 '此处未执行...
m_WindowCount = m_Excel.Workbooks.Count
Loop

' 结束进程
Set m_Excel = Nothing

' 删除文件
if m_FSO.FileExists(m_FILENAME) = True Then
m_FSO.DeleteFile m_FILENAME
End if

' 关闭HTA
Set m_FSO = Nothing
Self.Close

End Sub
</script>
</head>
<body bgcolor="#eeeeee">
<center>
<br>
<a>请等待...</a>
</center>
</body>
</html>



其实HTA里边什么都没有.....

整个程序是这样的用得到查询数据后,在后台用JAVA的JXL包将数据导出至EXCEL文件,然后在JAVA的servlet中指向这个HTA,交由VBS来操作该EXCEL文件的打开和关闭.......
hookee 2009-07-29
  • 打赏
  • 举报
回复
Sleep 2000 <---此处调用的是WSH的WScript.Sleep,要用的话必须在vbs文件中,HTA和vbs文件用的是不同的Host.
如果在HTA中,可以考虑用DOM的 window.setTimeoout来 不断检查m_Excel.Workbooks.count
复杂点的,用专门的组件跑个线程也是可以的。

cpp2017 2009-07-29
  • 打赏
  • 举报
回复
可否把整个hta贴出来?
wsyqy 2009-07-29
  • 打赏
  • 举报
回复
感谢回复,

由于是公司内网,脚本权限不用介意。

问题就是打开文件后,HTA未被冻结,关闭EXCEL文件后,该EXCEL文件也未被删除。

也就是代码中"等待EXCEL结束"处开始有问题
cpp2017 2009-07-29
  • 打赏
  • 举报
回复
这个需要客户端脚本权限,

另:哪里有问题
wsyqy 2009-07-29
  • 打赏
  • 举报
回复
搞定了,问题在于文件不能直接放在C盘下边,套个文件夹就好了,自己想的过程太痛苦了,唉

感谢两位大仙~结贴了,不会我还来问哈~
wsyqy 2009-07-29
  • 打赏
  • 举报
回复
m_Excel.Quit这个我也加上了,还是不好用,应该没有别的地方用到了啊,打开也是在脚本里边打开的,之前JAVA里曾经编辑过,但是应该也没影响吧。

关掉TOMCAT就好用,郁闷

4,009

社区成员

发帖
与我相关
我的任务
社区描述
它是一种微软环境下的轻量级的解释型语言,它使用COM组件、WMI、WSH、ADSI访问系统中的元素,对系统进行管理。
社区管理员
  • vbScript社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧