EXCELVBA文件封装成EXE的方法XLS封装成EXE制作全攻略■ldhyob2003.12写出此文以帮助关注那张帖的版友们能完全自已独立完成xls2exe的过程,实现简单的封装。首先申明,将xls做成exe并不是指就能使您的VBA工程受到坚强的保护,当然您可以通过数种方法来提高xls文档VBA工程防止查看的保护几率,如屏蔽一些系统热键、监控VBE窗口的开启、给文档加上口令保护、加VBA口令、使VBA“不可查看”、利用宏表4.0来禁止用户取消宏来查看文档等等,但“道高一尺,魔高一丈”,所以就没有必要去追求所谓的“完美”加密……关于这些保护方法不属本文叙述范围,请版友在论坛上查看相关帖。假如您手头已有一xls文档等待封装,假如您机子上已安装有VB6开发系统,那么请跟着往下操作:一、用VB制作EXE文件头部分1、打开VB,“文件”-“新建工程”-“标准EXE”;2、此时会出现名为Form1的默认窗体编辑窗口,Form1将作为软件启动封面窗体,打开该Form1的属性窗口,对如下属性进行设置:BorderStyle=0,StartUpPosition=2,Icon与Picture属性设置成你需要的图标(这也将成为你EXE的图标)和设计好准备使用的图片(即软件封面),窗体的大小设置成您需要的合适值即可。3、往窗体中添加一个时钟控件timer1,并将其InterVal属性设为1000。4、双击窗体打开代码编辑窗口,录入以下代码:PrivateDeclareFunctionSetWindowPosLibuser32(ByValhwndAsLong,ByValhWndInsertAfterAsLong,ByValxAsLong,ByValyAsLong,ByValcxAsLong,ByValcyAsLong,ByValwFlagsAsLong)AsLongPrivateDeclareFunctionGetTempFileNameLibkernel32AliasGetTempFileNameA(ByVallpszPathAsString,ByVallpPrefixStringAsString,ByValwUniqueAsLong,ByVallpTempFileNameAsString)AsLongPrivateDeclareFunctionGetTempPathLibkernel32AliasGetTempPathA(ByValnBufferLengthAsLong,ByVallpBufferAsString)AsLongPrivateConstMAX_PATH=260PrivateConstEXE_SIZE=81920'本EXE实际字节大小PrivateTypeFileSectionBytes()AsByteEndTypePrivateTypeSectionedFileFiles()AsFileSectionEndTypeDimStopTimeAsIntegerPrivateSubForm_Activate()IfCommand()=ThenMain1EndSubPrivateSubForm_Load()OnErrorResumeNextIfCommand()=ThenForm1.Visible=TrueSetWindowPosForm1.hwnd,-1,0,0,0,0,&H2Or&H1'将封面置为最顶层窗体ElseForm1.Visible=FalseForm1.Timer1.Enabled=TrueEndIfEndSubSubMain1()DimStartXLSByte,I,JAsLongDimAppPath,XlsTmpPathAsStringDimmyfileAsSectionedFileDimxlAppAsExcel.Application'定义EXCEL类DimxlBookAsExcel.Workbook'定义工件簿类DimxlsheetAsExcel.Worksheet'定义工作表类AppPath=App.PathXlsTmpPath=GetTempFile()'取得XLS临时文件名(带路径)IfVBA.Right(App.Path,1)=\ThenAppPath=VBA.Left(App.Path,VBA.Len(App.Path)-1)OpenAppPath&\&App.EXEName&.exeForBinaryAs#1ReDimmyfile.Files(1)ReDimmyfile.Files(1).Bytes(1ToLOF(1)-EXE_SIZE)OpenXlsTmpPathForBinaryAs#2Get#1,EXE_SIZE+1,myfile.Files(1).Bytes'此处数字要根据EXE实际头文件大小更改设定Put#2,1,myfile.Files(1).BytesClose#1Close#2SetxlApp=CreateObject(Excel.Application)'创建EXCEL应用类SetxlBook=xlApp.Workbooks.Open(FileName:=XlsTmpPath,password:=ldhyob)'打开EXCEL工作簿,已知该工作簿已加打开口令为ldhyob'以下星号括起部分代码是往xls里写数据(也可不往工作簿里写数据的方法,而生成txt的方法),作用是保存本exe的绝对路径与临时xls绝对路径,以便于EXE重写更新与临时文件删除'*****************************************Setxlsheet=xlBook.Worksheets(temp)'设置活动工作表xlsheet.Cells(1,1)=AppPath&\&App.EXEName&.exe'将该EXE完全路径存在工作表单元格内xlsheet.Cells(2,1)=XlsTmpPath'将该EXE本次运行产生XLS临时文件路径存在工作表单元格内'****************************************xlApp.Visible=True'设置EXCEL可见SetxlApp=Nothing'释放xlApp对象StopTime=0Me.Timer1.Enabled=True'启动时钟EndSubPrivateFunctionGetTempFile()AsString'用来产生系统临时文件名DimlngRetAsLongDimstrBufferAsString,strTempPathAsStringstrBuffer=String$(MAX_PATH,0)lngRet=GetTempPath(Len(strBuffer),strBuffer)IflngRet=0ThenExitFunctionstrTempPath=Left$(strBuffer,lngRet)strBuffer=String$(MAX_PATH,0)lngRet=GetTempFileName(strTempPath,tmp,0&,strBuffer)IflngRet=0ThenExitFunctionlngRet=InStr(1,strBuffer,Chr(0))IflngRet0ThenGetTempFile=Left$(strBuffer,lngRet-1)ElseGetTempFile=strBufferEndIfEndFunctionPrivateSubTimer1_Timer()OnErrorResumeNextIfCommand()ThenIfVBA.Dir(Command())ThenKillCommand()'删除本次运行遗留的临时XLS文件ElseEndEndIfElseStopTime=StopTime+1'计时累加IfStopTime=1ThenUnloadMe:End'2秒后自动关闭退出EndIfEndSub5、可保存工程,如取名为“工程1”;6、进行编译,“文件”-“生成工程1.exe”,此时也可将生成的EXE另外取名,如取名叫abc.exe。7、查看第6步生成的EXE文件字节大小,并将具体数字记下来,并将VB模块中的“PrivateConstEXE_SIZE=81920”保证一致(这里的81920是笔者例子的结果数字,每个人在实际时会有不同)。此例此步很重要,必须要做,该数字在xls文档VBA中还要使用到。至此,文件头部分已做完,abc.exe文件也已生成于磁盘中。特别提示:编译前,确保VB里工程---引用里MicrosoftExcel9.0ObjectLibrary前面的勾已打上.二、xls文档部分操作1、给工作簿增加一个工作表temp,将其置为隐藏。2、增加xls文档宏代码以实现文档关闭时EXE数据刷新。打开xls文档,打开VBE窗口,在ThisWorkBook代码区头部加入以下代码:PrivateConstEXE_SIZE=81920'此处数字为前面第7步得到的EXE文件字节数PrivateTypeFileSectionBytes()AsByteEndType在Workbook_BeforeClose事件中加入如下代码(对原有的代码可保留):DimmyfileAsFileSection'定义变量Dimcomc,exec,xlscAsString'定义变量Application.Visible=False'隐藏EXCEL主窗口exec=WorkSheets(“temp”).cells(1,1).valuexlsc=WorkSheets(“temp”).cells(2,1).valuecomc=exec&&xlscOpenexecForBinaryAs#1'打开EXE文件ReDimmyfile.Bytes(1ToEXE_SIZE)Get#1,1,myfile.Bytes'取得固有文件头Close#1IfVBA.Dir(exec)ThenKillexecOpenexecForBinaryAs#1'生成新的EXE文件Put#1,1,myfile.Bytes'先写入文件头OpenxlscForBinaryAs#2'打开xls临时文件ReDimmyfile.Bytes(1ToFileLen(xlsc))Get#2,1,myfile.BytesPut#1,EXE_SIZE+1,myfile.Bytes'将xls部分追加进EXEClose#1Close#2Application.QuitShellcomc,vbMinimizedNoFocus‘删除临时xls文件3、保存文档,退出,关闭EXCEL。三、将EXE与XLS结合生成新的EXE将第一步得到的abc.exe与第二步得到的test.xls(文件名随你愿意取)放到同一目录下,切换到MS-DOS模式,或者在该目录下建立一个批处理文件即bat文件,这样就不用切换到MS-DOS模式下输入DOS命令了。建立bat文件的步骤方法是:鼠标右键“新建”—“文本文档”,输入以下内容:@echooffcopy/babc.exe+test.xlsmain.exe保存,更改文件名(包括扩展名)为“合并.bat”,然后双击它,不一会就会发现在当前目录下会多出一个EXE文件main.exe,这就是封装成品了,你可以将其重命名为所需要的名称。好了,大功告成!