版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、一 用VB封裝XLS成為exe可完成對(duì)XLS文件的保護(hù) HYPERLINK /qzone/newblog/v5/%A1%B1http:/329554301/blog/1263607396%A1%B1 o 參考文件 t _blank 如何用VB6制作EXCEL作品之啟動(dòng)封面(即用VB啟動(dòng)XCEL) 費(fèi)了不少的精力做好了一個(gè)EXCEL的文件,為了避開“是否啟用宏”的攔截詢問,可將xls文件進(jìn)行封裝成為exe文件。 事先值得注意的是:1、將xls做成exe并不是指就能使您的VBA工程受到堅(jiān)強(qiáng)的保護(hù),如果有需要,也可在VB封裝XLS時(shí)設(shè)置登陸密碼。為了避免能將XLS文件另存為其他的XLS文件名而失去封
2、裝保護(hù),需用VBA代碼禁止用戶使用“另存為”來保存工作簿,注意先要保護(hù)好VBA和工作表。您可以通過數(shù)種方法來提高xls文檔VBA工程防止查看的保護(hù)幾率,如屏蔽一些系統(tǒng)熱鍵、監(jiān)控VBE窗口的開啟、給文檔加上口令保護(hù)、加VBA口令、使VBA“不可查看”、利用宏表4.0來禁止用戶取消宏來查看文檔等等。 2、EXCEL有兩個(gè)自動(dòng)宏:一個(gè)是啟動(dòng)宏(Sub Auto_Open()),另一個(gè)是關(guān)閉宏(Sub Auto_Close())。它們的特性是:當(dāng)用EXCEL打含有啟動(dòng)宏的工簿時(shí),就會(huì)自動(dòng)運(yùn)行啟動(dòng)宏,同理,當(dāng)關(guān)閉含有關(guān)閉宏的工作簿時(shí)就會(huì)自動(dòng)運(yùn)行關(guān)閉宏。但是通過VB來調(diào)用EXCEL工作表時(shí),啟動(dòng)宏和關(guān)閉宏
3、不會(huì)自動(dòng)運(yùn)行,需要在VB中通過命令來調(diào)用。因此,我們不要在模塊Sub Auto_Open()里編寫宏代碼,而應(yīng)該在ThisWorkbook的Private Sub Workbook_Open()里來寫入代碼。 您手頭如已做好了一個(gè)xls文檔等待封裝,而且您機(jī)子上已安裝有VB6系統(tǒng),那么請(qǐng)進(jìn)行以下的三大步操作:第一步:用VB制作EXE文件頭部分1、打開VB,“文件”-“新建工程”-“標(biāo)準(zhǔn)EXE”;2、此時(shí)會(huì)出現(xiàn)名為Form1的默認(rèn)窗體編輯窗口,F(xiàn)orm1將作為軟件啟動(dòng)封面窗體,打開該Form1的屬性窗口,對(duì)如下屬性進(jìn)行設(shè)置:BorderStyle=0,StartUpPosition=2,Icon
4、與Picture屬性設(shè)置成你需要的圖標(biāo)(這也將成為你EXE的圖標(biāo))和設(shè)計(jì)好準(zhǔn)備使用的圖片(即軟件封面)。3、往窗體中添加一個(gè)時(shí)鐘控件timer1,并將其InterVal屬性設(shè)為1000。4、確保VB里工程-引用里Microsoft Excel 9.0 Object Library前面的勾已打上.5、雙擊窗體打開代碼編輯窗口,錄入以下代碼:Private Declare Function FindWindow Lib user32 Alias FindWindowA (ByVal lpClassName As String, ByVal lpWindowName As String) As Lo
5、ngPrivate Declare Function PostMessage Lib user32 Alias PostMessageA (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Type FileSectionBytes() As ByteEnd TypePrivate Declare Function SetWindowPos Lib user32 (ByVal hwnd As Long, ByVal hWndInsertAfter As Long
6、, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPrivate Declare Function GetTempFileName Lib kernel32 Alias GetTempFileNameA (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As LongP
7、rivate Declare Function GetTempPath Lib kernel32 Alias GetTempPathA (ByVal nBufferLength As Long, ByVal lpBuffer As String) As LongPrivate Const MAX_PATH = 260Private Const EXE_SIZE = 49152 這個(gè)數(shù)是本EXE文件實(shí)際字節(jié)大?。ㄉ蒭xe后查看屬性-字節(jié)大小-回頭修正),記下49152到第二步還得用。Private Type SectionedFileFiles() As FileSectionEnd Type
8、Dim StopTime As IntegerPrivate Sub Form_Activate()On Error Resume NextIf Command() = Then Main1End SubPrivate Sub Form_Load()On Error Resume NextIf Command() = ThenForm1.Visible = True將封面置為最頂層窗體SetWindowPos Form1.hwnd, -1, 0, 0, 0, 0, &H2 Or &H1如果與VBA最頂層有沖突則去掉此句ElseForm1.Visible = FalseForm1.Timer1.
9、Enabled = TrueEnd IfEnd SubSub Main1()On Error Resume NextDim StartXLSByte, I, J As LongDim AppPath, XlsTmpPath As StringDim myfile As SectionedFileDim xlApp As Excel.Application 定義EXCEL類Dim xlBook As Excel.Workbook 定義工件簿類Dim xlsheet As Excel.Worksheet 定義工作表類AppPath = App.PathXlsTmpPath = GetTempFil
10、e() 取得XLS臨時(shí)文件名(帶路徑)If VBA.Right(App.Path, 1) = Then AppPath = VBA.Left(App.Path, VBA.Len(App.Path) - 1)Open AppPath & & App.EXEName & .exe For Binary As #1ReDim myfile.Files(1)ReDim myfile.Files(1).Bytes(1 To LOF(1) - EXE_SIZE)Open XlsTmpPath For Binary As #2Get #1, EXE_SIZE + 1, myfile.Files(1).Byt
11、es 此處數(shù)字要根據(jù)EXE實(shí)際頭文件大小更改設(shè)定Put #2, 1, myfile.Files(1).BytesClose #1Close #2Set xlApp = CreateObject(Excel.Application) 創(chuàng)建EXCEL應(yīng)用類Set xlBook = xlApp.Workbooks.Open(FileName:=XlsTmpPath, Password:=ldhyob) 打開EXCEL工作簿,已知該工作簿已加打開口令為ldhyob,若您的工作簿沒有口令,則將此參數(shù)去掉以下星號(hào)括起部分代碼是往xls里寫數(shù)據(jù)(也可不往工作簿里寫數(shù)據(jù)的方法,而生成txt的方法),作用是保存
12、本exe的絕對(duì)路徑與臨時(shí)xls絕對(duì)路徑,以便于EXE重寫更新與臨時(shí)文件刪除*Set xlsheet = xlBook.Worksheets(temp) 設(shè)置活動(dòng)工作表xlsheet.Cells(1, 1) = AppPath & & App.EXEName & .exe 將該EXE完全路徑存在工作表單元格內(nèi)xlsheet.Cells(2, 1) = XlsTmpPath 將該EXE本次運(yùn)行產(chǎn)生XLS臨時(shí)文件路徑存在工作表單元格內(nèi)*xlApp.Visible = True 設(shè)置EXCEL可見Set xlApp = Nothing 釋放xlApp對(duì)象StopTime = 0Me.Timer1.En
13、abled = True 啟動(dòng)時(shí)鐘End SubPrivate Function GetTempFile() As String 用來產(chǎn)生系統(tǒng)臨時(shí)文件名On Error Resume NextDim lngRet As LongDim strBuffer As String, strTempPath As StringstrBuffer = String$(MAX_PATH, 0)lngRet = GetTempPath(Len(strBuffer), strBuffer)If lngRet = 0 Then Exit FunctionstrTempPath = Left$(strBuffer
14、, lngRet)strBuffer = String$(MAX_PATH, 0)lngRet = GetTempFileName(strTempPath, tmp, 0&, strBuffer)If lngRet = 0 Then Exit FunctionlngRet = InStr(1, strBuffer, Chr(0)If lngRet 0 ThenGetTempFile = Left$(strBuffer, lngRet - 1)ElseGetTempFile = strBufferEnd IfEnd FunctionPrivate Sub Timer1_Timer()On Err
15、or Resume NextIf Command() ThenIf VBA.Dir(Command() ThenKill Command() 刪除本次運(yùn)行遺留的臨時(shí)XLS文件ElseEndEnd IfElseStopTime = StopTime + 1 計(jì)時(shí)累加If StopTime = 1 Then Unload Me: End 2秒后自動(dòng)關(guān)閉退出xlBook.RunAutoMacros (xlAutoOpen) 運(yùn)行EXCEL啟動(dòng)宏End IfEnd Sub6、生成EXE文件為abc.exe ?;仡^查看屬性-字節(jié)大小-之后修正本EXE文件中49152為實(shí)際字節(jié)大小。至此,文件頭部分已做完
16、。第二步:對(duì)xls文檔部分操作 1、給工作簿增加一個(gè)工作表temp,將其置為隱藏。2、在ThisWorkBook代碼區(qū)頭部加入以下代碼聲明以實(shí)現(xiàn)文檔關(guān)閉時(shí)EXE數(shù)據(jù)刷新:Private Declare Function FindWindow Lib user32 Alias FindWindowA (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function PostMessage Lib user32 Alias PostMessageA (ByVal hwnd As L
17、ong, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Const EXE_SIZE = 49152 此處數(shù)字為EXE文件字節(jié)數(shù),一定要和文件頭的字節(jié)數(shù)對(duì)應(yīng)。切記Private Type FileSection Bytes() As ByteEnd Type3、在Workbook_BeforeClose事件中加入如下代碼(對(duì)原有的代碼可保留):Dim myfile As FileSection 定義變量Dim comc, exec, xlsc As String 定義變量Application.V
18、isible = False 隱藏EXCEL主窗口exec = Worksheets(temp).Cells(1, 1).Valuexlsc = Worksheets(temp).Cells(2, 1).Valuecomc = exec & & xlscOpen exec For Binary As #1 打開EXE文件ReDim myfile.Bytes(1 To EXE_SIZE)Get #1, 1, myfile.Bytes 取得固有文件頭Close #1If VBA.Dir(exec) Then Kill execOpen exec For Binary As #1 生成新的EXE文件
19、Put #1, 1, myfile.Bytes 先寫入文件頭Open xlsc For Binary As #2 打開xls臨時(shí)文件ReDim myfile.Bytes(1 To FileLen(xlsc)Get #2, 1, myfile.BytesPut #1, EXE_SIZE + 1, myfile.Bytes 將xls部分追加進(jìn)EXEClose #1Close #2ActiveWorkbook.ChangeFileAccess xlReadOnly 將活動(dòng)工作簿設(shè)為只讀,便于執(zhí)行下面的語句,如不進(jìn)行此操作,將沒法完成 Kill ActiveWorkbook.FullName 刪除當(dāng)前
20、文件,其實(shí)是一個(gè)臨時(shí)文件 Application.QuitEnd Sub 4、禁止使用“另存為”來保存工作簿Private Sub workbook_BeforeSave(ByVal SaveAsUI As Boolean, _ Cancel As Boolean) Dim response As Long If SaveAsUI = True Then response = MsgBox(該系統(tǒng)不允許用“另存為” & _ 你要保存到原工作簿嗎? , vbQuestion + vbOKCancel) Cancel = (response = vbCancel) If Cancel = Fals
21、e Then Me.Save Cancel = True End If End Sub5、最后生成為xls文件備用。再保存,調(diào)用WINDOWS的任務(wù)管理器強(qiáng)制結(jié)束EXCEL進(jìn)程,一定要是非正常退出.第三步 合并 將第一步得到的abc.exe與第二步得到的test.xls放到同一目錄下,再建立個(gè)bat文件,方法是:鼠標(biāo)右鍵“新建”“文本文檔”,輸入以下內(nèi)容:echo offcopy /b abc.exe + test.xls VB2xls.exe保存為BAT文件,取文件名(包括擴(kuò)展名)為“合并bat“然后雙擊它,不一會(huì)就會(huì)發(fā)現(xiàn)在當(dāng)前目錄下會(huì)多出一個(gè)VB2xls.exe文件,這就是封裝成品了。完成
22、OK!二 XLS封裝成EXE制作全攻略 作者:佚名假如您手頭已有一xls文檔等待封裝,假如您機(jī)子上已安裝有VB6開發(fā)系統(tǒng),那么請(qǐng)跟著往下操作: 第一步、用VB制作EXE文件頭部分 1、打開VB,“文件”-“新建工程”-“標(biāo)準(zhǔn)EXE”; 2、此時(shí)會(huì)出現(xiàn)名為Form1的默認(rèn)窗體編輯窗口,F(xiàn)orm1將作為軟件啟動(dòng)封面窗體,打開該Form1的屬性窗口,對(duì)如下屬性進(jìn)行設(shè)置:BorderStyle=0,StartUpPosition=2,Icon與Picture屬性設(shè)置成你需要的圖標(biāo)(這也將成為你EXE的圖標(biāo))和設(shè)計(jì)好準(zhǔn)備使用的圖片(即軟件封面),窗體的大小設(shè)置成您需要的合適值即可。 3、往窗體中添加一個(gè)
23、時(shí)鐘控件timer1,并將其InterVal屬性設(shè)為1000。 4、雙擊窗體打開代碼編輯窗口,錄入以下代碼:Private Declare Function SetWindowPos Lib user32 (ByVal hwnd As Long, ByVal hWndInsertAfter As Long, ByVal x As Long, ByVal y As Long, ByVal cx As Long, ByVal cy As Long, ByVal wFlags As Long) As LongPrivate Declare Function GetTempFileName Lib k
24、ernel32 Alias GetTempFileNameA (ByVal lpszPath As String, ByVal lpPrefixString As String, ByVal wUnique As Long, ByVal lpTempFileName As String) As LongPrivate Declare Function GetTempPath Lib kernel32 Alias GetTempPathA (ByVal nBufferLength As Long, ByVal lpBuffer As String) As LongPrivate Const MA
25、X_PATH = 260Private Const EXE_SIZE = 81920 本EXE實(shí)際字節(jié)大小Private Type FileSection Bytes() As ByteEnd TypePrivate Type SectionedFile Files() As FileSectionEnd TypeDim StopTime As IntegerPrivate Sub Form_Activate()If Command() = Then Main1End SubPrivate Sub Form_Load()On Error Resume NextIf Command() = Th
26、en Form1.Visible = True SetWindowPos Form1.hwnd, -1, 0, 0, 0, 0, &H2 Or &H1 將封面置為最頂層窗體Else Form1.Visible = False Form1.Timer1.Enabled = TrueEnd IfEnd SubSub Main1()Dim StartXLSByte, I, J As LongDim AppPath, XlsTmpPath As StringDim myfile As SectionedFileDim xlApp As Excel.Application 定義EXCEL類Dim xlB
27、ook As Excel.Workbook 定義工件簿類Dim xlsheet As Excel.Worksheet 定義工作表類AppPath = App.PathXlsTmpPath = GetTempFile() 取得XLS臨時(shí)文件名(帶路徑)If VBA.Right(App.Path, 1) = Then AppPath = VBA.Left(App.Path, VBA.Len(App.Path) - 1)Open AppPath & & App.EXEName & .exe For Binary As #1ReDim myfile.Files(1)ReDim myfile.Files
28、(1).Bytes(1 To LOF(1) - EXE_SIZE)Open XlsTmpPath For Binary As #2 Get #1, EXE_SIZE + 1, myfile.Files(1).Bytes 此處數(shù)字要根據(jù)EXE實(shí)際頭文件大小更改設(shè)定 Put #2, 1, myfile.Files(1).BytesClose #1Close #2Set xlApp = CreateObject(Excel.Application) 創(chuàng)建EXCEL應(yīng)用類Set xlBook = xlApp.Workbooks.Open(FileName:=XlsTmpPath, password:=
29、ldhyob) 打開EXCEL工作簿,已知該工作簿已加打開口令為ldhyob以下星號(hào)括起部分代碼是往xls里寫數(shù)據(jù)(也可不往工作簿里寫數(shù)據(jù)的方法,而生成txt的方法),作用是保存本exe的絕對(duì)路徑與臨時(shí)xls絕對(duì)路徑,以便于EXE重寫更新與臨時(shí)文件刪除*Set xlsheet = xlBook.Worksheets(temp) 設(shè)置活動(dòng)工作表xlsheet.Cells(1, 1) = AppPath & & App.EXEName & .exe 將該EXE完全路徑存在工作表單元格內(nèi)xlsheet.Cells(2, 1) = XlsTmpPath 將該EXE本次運(yùn)行產(chǎn)生XLS臨時(shí)文件路徑存在工作
30、表單元格內(nèi)*xlApp.Visible = True 設(shè)置EXCEL可見Set xlApp = Nothing 釋放xlApp對(duì)象StopTime = 0Me.Timer1.Enabled = True 啟動(dòng)時(shí)鐘End SubPrivate Function GetTempFile() As String 用來產(chǎn)生系統(tǒng)臨時(shí)文件名Dim lngRet As LongDim strBuffer As String, strTempPath As StringstrBuffer = String$(MAX_PATH, 0)lngRet = GetTempPath(Len(strBuffer), st
31、rBuffer)If lngRet = 0 Then Exit FunctionstrTempPath = Left$(strBuffer, lngRet)strBuffer = String$(MAX_PATH, 0)lngRet = GetTempFileName(strTempPath, tmp, 0&, strBuffer)If lngRet = 0 Then Exit FunctionlngRet = InStr(1, strBuffer, Chr(0)If lngRet 0 ThenGetTempFile = Left$(strBuffer, lngRet - 1)ElseGetT
32、empFile = strBufferEnd IfEnd FunctionPrivate Sub Timer1_Timer()On Error Resume NextIf Command() Then If VBA.Dir(Command() Then Kill Command() 刪除本次運(yùn)行遺留的臨時(shí)XLS文件 Else End End IfElseStopTime = StopTime + 1 計(jì)時(shí)累加If StopTime = 1 Then Unload Me: End 2秒后自動(dòng)關(guān)閉退出End IfEnd Sub 5、可保存工程,如取名為“工程1”; 6、進(jìn)行編譯,“文件”-“生成工
33、程1.exe”,此時(shí)也可將生成的EXE另外取名,如取名叫abc.exe。 7、查看第6步生成的EXE文件字節(jié)大小,并將具體數(shù)字記下來,并將VB模塊中的“Private Const EXE_SIZE = 81920”保證一致(這里的81920是筆者例子的結(jié)果數(shù)字,每個(gè)人在實(shí)際時(shí)會(huì)有不同)。此例此步很重要,必須要做,該數(shù)字在xls文檔VBA中還要使用到。 至此,文件頭部分已做完,abc.exe文件也已生成于磁盤中。 特別提示:編譯前,確保VB里工程-引用里Microsoft Excel 9.0 Object Library前面的勾已打上. 第 二步、xls文檔部分操作 1、給工作簿增加一個(gè)工作表t
34、emp,將其置為隱藏。 2、增加xls文檔宏代碼以實(shí)現(xiàn)文檔關(guān)閉時(shí)EXE數(shù)據(jù)刷新。 打開xls文檔,打開VBE窗口,在ThisWorkBook代碼區(qū)頭部加入以下代碼:Private Const EXE_SIZE = 81920 此處數(shù)字為前面第7步得到的EXE文件字節(jié)數(shù)Private Type FileSection Bytes() As ByteEnd Type在Workbook_BeforeClose事件中加入如下代碼(對(duì)原有的代碼可保留): Dim myfile As FileSection 定義變量Dim comc, exec, xlsc As String 定義變量 Applicati
35、on.Visible = False 隱藏EXCEL主窗口 exec = WorkSheets(“temp”).cells(1,1).value xlsc = WorkSheets(“temp”).cells(2,1).value comc = exec & & xlsc Open exec For Binary As #1 打開EXE文件 ReDim myfile.Bytes(1 To EXE_SIZE) Get #1, 1, myfile.Bytes 取得固有文件頭 Close #1 If VBA.Dir(exec) Then Kill exec Open exec For Binary
36、As #1 生成新的EXE文件 Put #1, 1, myfile.Bytes 先寫入文件頭 Open xlsc For Binary As #2 打開xls臨時(shí)文件 ReDim myfile.Bytes(1 To FileLen(xlsc) Get #2, 1, myfile.Bytes Put #1, EXE_SIZE + 1, myfile.Bytes 將xls部分追加進(jìn)EXE Close #1 Close #2 Application.Quit Shell comc, vbMinimizedNoFocus 刪除臨時(shí)xls文件 3、保存文檔,退出,關(guān)閉EXCEL。 第三步、將EXE與XL
37、S結(jié)合生成新的EXE 將第一步得到的abc.exe與第二步得到的test.xls(文件名隨你愿意取)放到同一目錄下,切換到MS-DOS模式,或者在該目錄下建立一個(gè)批處理文件即bat文件,這樣就不用切換到MS-DOS模式下輸入DOS命令了。建立bat文件的步驟方法是:鼠標(biāo)右鍵“新建”“文本文檔”,輸入以下內(nèi)容:echo offcopy /b abc.exe + test.xls main.exe保存,更改文件名(包括擴(kuò)展名)為“合并.bat”,然后雙擊它,不一會(huì)就會(huì)發(fā)現(xiàn)在當(dāng)前目錄下會(huì)多出一個(gè)EXE文件main.exe,這就是封裝成品了,你可以將其重命名為所需要的名稱。 好了,大功告成!徹底解決E
38、XCEL文件封裝成EXE后無法保存的問題 三 保護(hù)Excel工作表用VB可編寫直接控制Excel操作的程序,方法是用VB的OLE自動(dòng)化技術(shù)獲取Excel的控制句柄,從而直接控制Excel的一系列操作。 1. 實(shí)現(xiàn)VB對(duì)Excel的直接控制后,可在用戶所編的程序中調(diào)用Excel,即從控制界面直接調(diào)入Excel,且退出Excel后又回到控制界面。 2. 用VB實(shí)現(xiàn)Excel的控制后,所有程序可編譯成完整的EXE執(zhí)行文件,直接在Win 平臺(tái)上執(zhí)行,運(yùn)行環(huán)境更為簡潔明了,程序更易加密。 3.VB的OLE自動(dòng)技術(shù)目前能實(shí)現(xiàn)對(duì)Excel多數(shù)功能的控制。 操作步驟 用VB控制Excel的操作步驟如下: 1.
39、 引用Microsoft Excel類型庫: *從工程菜單中選擇引用欄; *選擇Microsoft Excel X.0 Object Library(X.0為版本號(hào)); *選擇確定。 2. 聲明顯式數(shù)據(jù)類型: Dim xlApp as Excel.Application 3. 創(chuàng)建新實(shí)例,獲取Excel的控制句柄: Set xlApp=CreateObject(Excel.Application) 4. 由于Excel 啟動(dòng)為不可見,調(diào)用后如需使其顯示出來用: xlApp.Visible=True 5. 對(duì)Excel操作完畢后,應(yīng)交還控制句柄: Set xl=Nothing在得到在Excel對(duì)
40、象的控制句柄后,可對(duì)其下級(jí)對(duì)象逐級(jí)調(diào)用,就同使用VBA差不多:在VB編輯環(huán)境中,輸入“xlApp.”后一般會(huì)自動(dòng)給出其屬性、方法等。也可按想實(shí)現(xiàn)的功能,在Excel中記錄宏,然后查看、修改代碼,將其放在自己的程序中Option ExplicitDim Db As DatabaseDim Rs As RecordsetPrivate Sub Form_Load()Set Db = OpenDatabase(c:tempbook1.xls, False, False, Excel 8.0;)Set Rs = Db.OpenRecordset(sheet1$)End SubPrivate Sub F
41、orm_Unload(Cancel As Integer)Rs.CloseDb.CloseEnd Sub =一直以來,EXCEL文件封裝成文件是大家(特別是初學(xué)者)關(guān)心的話題論壇里也有許多相關(guān)的帖子。但容易出現(xiàn)封裝成功,卻無法保存文件封裝之后更新的內(nèi)容。本人經(jīng)過試驗(yàn)通過,代碼正常。除非你的EXCEL不支持API,否則一定行。若EXCEL暫時(shí)不支持API,偶暫時(shí)想到的方法是重新安裝EXCEL。重新安裝EXCEL后就可能支持API了原因是封裝后的文件在駐留內(nèi)存時(shí)是無法對(duì)它進(jìn)行更新的。所以要對(duì)它進(jìn)行更新只有將它請(qǐng)出內(nèi)存。方法是調(diào)用windows的Taskkill命令。在進(jìn)程中增加:shell Tas
42、kKill /im & & /f ,注意中間的幾個(gè)空格不能少??偨Y(jié),對(duì)要封裝的文件,首先得在原有的代碼基礎(chǔ)上增加以下代碼到對(duì)應(yīng)的過程中。一、公共部分(就是ThisWorkBook的代碼區(qū)最頂端)加入以下代碼,用于聲明和引用:Private Declare Function FindWindow Lib user32 Alias FindWindowA (ByVal lpClassName As String, ByVal lpWindowName As String) As LongPrivate Declare Function PostMessage Lib user32 Alias Po
43、stMessageA (ByVal hwnd As Long, ByVal wMsg As Long, ByVal wParam As Long, lParam As Any) As LongPrivate Const EXE_SIZE = 163840 此處數(shù)字為EXE文件字節(jié)數(shù),一定要和文件頭的字節(jié)數(shù)對(duì)應(yīng)。切記Private Type FileSectionBytes() As ByteEnd Type二、在Workbook_BeforeClose過程中必須有如下代碼。自己原有的代碼請(qǐng)參照加入。Private Sub Workbook_BeforeClose(Cancel As Boole
44、an) Application.ScreenUpdating = True Application.DisplayAlerts = False ThisWorkbook.Save 文件存盤 Dim myfile As FileSection 定義變量 Dim exec, xlsc, exen As String 定義變量增加了一個(gè)進(jìn)程名定義exen Application.Visible = False 隱藏EXCEL主窗口 exec = Worksheets(Temp).Cells(1, 1).Value xlsc = Worksheets(Temp).Cells(2, 1).Value e
45、xen = 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 關(guān)閉打開的EXE文件 Shell taskkill /im & exen & /f 強(qiáng)制結(jié)束EXE文件 Open exec For Binary As #1 重新生成新的EXE文件 Put #1, 1, myfile.Bytes 把原EXE文件文件頭寫進(jìn)新的文件頭 Open xlsc For Bi
46、nary As #2 打開xls臨時(shí)文件 ReDim myfile.Bytes(1 To FileLen(xlsc) Get #2, 1, myfile.Bytes Put #1, EXE_SIZE + 1, myfile.Bytes 將xls部分追加進(jìn)EXE Close #1 Close #2 ActiveWorkbook.ChangeFileAccess xlReadOnly 將活動(dòng)工作簿設(shè)為只讀,便于執(zhí)行下面的語句,如不進(jìn)行此操作,將沒法完成 Kill ActiveWorkbook.FullName 刪除當(dāng)前文件,其實(shí)是一個(gè)臨時(shí)文件 Application.QuitEnd Sub提示:在
47、對(duì)EXCEL文件進(jìn)行完編輯之后,先保存,然后一定要非正常退出,避免因?yàn)橛|發(fā)Workbook_BeforeClose事件,而執(zhí)行Kill ActiveWorkbook.FullName這一句而刪除EXCEL文件。這就是為什么出現(xiàn)EXCEL文件“蒸發(fā)”在原因。非正常退出的方法:(兩種辦法均可,前提是先確保已經(jīng)存盤)1、 一種方法是調(diào)用WINDOWS的任務(wù)管理器,強(qiáng)制結(jié)束EXCEL進(jìn)程。2、 另一種方法是,在VBE的立即窗口下,執(zhí)行以下語句:Application.EnableEvents =False ,然后再關(guān)閉EXCEL文件即可!=四 保護(hù)Excel工作表的另類方法通過選擇“格式”菜單下的“工
48、作表”|“隱藏”命令,可以把當(dāng)前的活動(dòng)工作表隱藏起來,在這里我們通過自定義數(shù)字格式來隱藏單元格中的數(shù)值,在菜單欄中選擇“格式”、“單元格”命令,在“單元格格式”對(duì)話框選擇“數(shù)字”選項(xiàng)卡,在“分類”列表框中選擇“自定義”選項(xiàng),然后在右邊的“類型”文本框中輸入“;”,單擊“確定”按鈕即可,隱藏后的數(shù)值只出現(xiàn)在編輯欄或正在編輯的單元格中,并且不會(huì)被打印出來。要將隱藏的數(shù)值重新顯示出來,可選定單元格,然后在“單元格格式”對(duì)話框的“數(shù)字”選項(xiàng)卡中,單擊“分類”列表中的“常規(guī)”選項(xiàng),這樣就可以應(yīng)用默認(rèn)的格式,隱藏的數(shù)值就會(huì)顯示出來。二、我們也可以通過簡單的VBA編制宏對(duì)工作表的Visible屬性來設(shè)置隱藏
49、工作表,下面的代碼是名為“Hidesh”和“Showsh”的兩個(gè)宏,前者將工作表的Visible的屬性設(shè)置為False,當(dāng)運(yùn)行該宏之后,工作表Sheet1將變?yōu)殡[藏工作表,此時(shí)工作表不能被直接訪問,從而起到保護(hù)作用。后者是用來取消工作表的隱藏屬性。Sub Hidesh()Worksheets(sheet1).Visible=FalseEnd SubSub Showsh()Worksheets(sheet1).Visible=TrueEnd Sub 添加宏的的操作步驟如下:首先,選擇“工具”菜單下“宏”,然后選擇“Visual Basic編輯器”命令,在“Visual Basic編輯器”中選擇“插入”菜單下的“模塊”命令,然后在模塊的代碼編輯器中輸入上述代碼,單擊“保存”按鈕。要執(zhí)行宏命令,選擇“工具”菜單下的“宏”命令,打開“宏”對(duì)話框,在對(duì)話框中可以看到已經(jīng)添加的宏,選擇要執(zhí)行的宏,然后單擊“執(zhí)行”按鈕,即可對(duì)工作表進(jìn)行隱藏或者顯示。一、編輯宏 1、啟動(dòng)Excel2003(其它版本請(qǐng)仿照操作),執(zhí)行“工具宏Visual Basic編輯器”命令,進(jìn)入“Visual Basic編輯器”窗口(如圖1)。 2、在右側(cè)“
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 工作服選購合同范本
- 長期醫(yī)藥配送合同
- 幼兒園物資選購協(xié)議范本
- 柴油購銷合同范本示例
- 焊錫絲采購合同簽訂后的履行
- 乳膠漆產(chǎn)品代理協(xié)議
- 地方特色月餅銷售合同
- 標(biāo)準(zhǔn)投資理財(cái)合同樣本
- 地址租賃協(xié)議
- 小學(xué)生科學(xué)繪本故事解讀
- 五年級(jí)上冊(cè)《勞動(dòng)與技術(shù)》期中期末復(fù)習(xí)測試卷(附答案)
- 了解世界各大宗教的信仰
- 《社會(huì)調(diào)查研究與方法》課程復(fù)習(xí)題-課程ID-01304試卷號(hào)-22196
- 一例縫線傷口延遲愈合患者的個(gè)案護(hù)理體會(huì)
- 商務(wù)寫作與外貿(mào)函電-第二版-習(xí)題答案
- 大面積腦梗死護(hù)理查房
- 房屋拆除工程投標(biāo)方案(技術(shù)標(biāo))
- 蘇教版數(shù)學(xué)六年級(jí)上冊(cè)全冊(cè)1-7單元教材分析及課時(shí)安排
- 現(xiàn)代人力資源管理(第三版) 習(xí)題及答案
- 加藥設(shè)備調(diào)試報(bào)告
- 保潔類常用物資明細(xì)(含報(bào)價(jià))
評(píng)論
0/150
提交評(píng)論