ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
300集Office 2010微视频教程 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 78139|回复: 168

[分享]彻底解决EXCEL文件封装成EXE后无法保存的问题

  [复制链接]

TA的精华主题

TA的得分主题

发表于 2006-8-26 12:44 | 显示全部楼层 |阅读模式
本帖已被收录到知识树中,索引项:封装

再次声明,这不是俺的原创,是站在别人的肩膀上,稍加改进!

一直以来,EXCEL文件封装成EXE文件是大家(特别是初学者)关心的话题.坛子里也有许多相关的帖子。但容易出现封装成功,却无法保存EXCEL文件封装之后更新的内容。
本人经过试验通过,代码正常。
[除非你的EXCEL不支持API,否则一定行。若EXCEL暂时不支持API,偶暂时想到的方法是重新安装EXCEL。重新安装EXCEL后就可能支持API了]
原因是封装后的EXE文件在驻留内存时是无法对它进行更新的。所以要对它进行更新只有将它请出内存。方法是调用windows的Taskkill命令。
在进程中增加:shell "TaskKill /im " &   &" /f ",注意中间的几个空格不能少。
总结,对要封装的EXCEL文件,首先得在原有的代码基础上增加以下代码到对应的过程中

一、公共部分(就是ThisWorkBook的代码区最顶端)加入以下代码,用于声明和引用:

Private Declare Function FindWindow Lib "user32" Alias "FindWindowA" (ByVal lpClassName As String, ByVal lpWindowName As String) As Long
Private Declare Function PostMessage Lib "user32" Alias "PostMessageA" (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As Long
Private Const EXE_SIZE = 163840 '
此处数字为EXE文件字节数,一定要和EXE文件头的字节数对应。切记
Private Type FileSection
  Bytes() As Byte
End Type

二、在Workbook_BeforeClose过程中必须有如下代码。自己原有的代码请参照加入。

Private Sub Workbook_BeforeClose(Cancel As Boolean)
    Application.ScreenUpdating = True
    Application.DisplayAlerts = False
    ThisWorkbook.Save  '文件存盘
    Dim myfile As FileSection    '定义变量
    Dim exec, xlsc, exen As String    '定义变量 增加了一个进程名定义exen
    Application.Visible = False    '隐藏EXCEL主窗口
    exec = Worksheets("Temp").Cells(1, 1).Value
    xlsc = Worksheets("Temp").Cells(2, 1).Value
    exen = Split(exec, "\")(UBound(Split(exec, "\")))
    Open exec For Binary As #1    '打开EXE文件
    ReDim myfile.Bytes(1 To EXE_SIZE)
    Get #1, 1, myfile.Bytes    '取得固有文件头
    Close #1         '关闭打开的EXE文件
    Shell "taskkill /im " & exen & " /f" '强制结束EXE文件
    Open exec For Binary As #1    '重新生成新的EXE文件
    Put #1, 1, myfile.Bytes    ''把原EXE文件文件头写进新的文件头
    Open xlsc For Binary As #2  '打开xls临时文件
    ReDim myfile.Bytes(1 To FileLen(xlsc))
    Get #2, 1, myfile.Bytes
    Put #1, EXE_SIZE + 1, myfile.Bytes    '将xls部分追加进EXE
    Close #1
    Close #2
    ActiveWorkbook.ChangeFileAccess xlReadOnly  ' 将活动工作簿设为只读,便于执行下面的语句,如不进行此操作,将没法完成
    Kill ActiveWorkbook.FullName '删除当前文件,其实是一个临时文件
    Application.Quit
End Sub

 提示在对EXCEL文件进行完编辑之后,先保存,然后一定要非正常退出,避免因为触发Workbook_BeforeClose事件,而执行Kill ActiveWorkbook.FullName这一句而删除EXCEL文件。这就是为什么出现EXCEL文件“蒸发”在原因。

非正常退出的方法:(两种办法均可,前提是先确保已经存盘)

1、 一种方法是调用WINDOWS的任务管理器,强制结束EXCEL进程。

2、 另一种方法是,在VBE的立即窗口下,执行以下语句:

 Application.EnableEvents =False ,然后再关闭EXCEL文件即可!

[此贴子已经被作者于2008-4-14 3:04:13编辑过]

评分

1

查看全部评分

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-8-26 14:32 | 显示全部楼层

上传一个简单实例。

希望对初学者有所帮助!  (高手勿进!!)

  cDHZXjOi.rar (169.92 KB, 下载次数: 3388)


[此贴子已经被作者于2008-4-14 3:23:45编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-8-26 16:31 | 显示全部楼层
[em06]偶自个顶一下,人气不旺呀!

TA的精华主题

TA的得分主题

发表于 2006-8-26 16:52 | 显示全部楼层

我下一步要用,正在学习中!

解决了保存的问题,EXCEL封装成EXE才有实用价值!

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-8-26 17:19 | 显示全部楼层

哈,偶是站在前辈们的肩膀上,拿前辈当梯子,才弄出来的。

就偶个人的水平,根本谈不上“水平”二字了。

只要对大家有用,这才是偶最快乐的事!

TA的精华主题

TA的得分主题

发表于 2006-8-26 17:21 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2006-8-26 19:21 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-8-26 20:42 | 显示全部楼层
QUOTE:
以下是引用来生缘在2006-8-26 18:15:11的发言:
未研究过封装,顶一记

好久不见你了。

谢谢你的光临!

TA的精华主题

TA的得分主题

发表于 2006-8-26 21:08 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2006-8-26 21:13 | 显示全部楼层
QUOTE:
以下是引用angelqdd在2006-8-26 21:08:29的发言:
最好做个软件出来,让我们直接用行了,看不懂代码.

这儿讲的封装纯粹是DIY,既然是DIY,就得自己量身打造了。

不想DIY的,可以下载专门的转换软件:XLS2EXE,洋人制作好象比较好些。

当然了,DIY主要是突显启动封面。使EXCEL不再是那样呆板。

您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-4-18 09:43 , Processed in 0.052367 second(s), 12 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表