ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
楼主: 七叶一枝梅

[原创]关于在Office中“夹带”其它文件或程序的研究:

[复制链接]

TA的精华主题

TA的得分主题

发表于 2005-7-10 06:11 | 显示全部楼层

一个思路,能不能用Word中“插入”“对象”功能,夹带文件,然后想办法读出这个插入对象,运行!

关键在于如何读出,大家想想!!!

TA的精华主题

TA的得分主题

发表于 2005-7-10 06:28 | 显示全部楼层

TO 七兄,时间关系,我早上的研究只能到这里,如何保存数组变量到文档变量中,需要进一步研究。

以下代码供参考:(不经过WINHEX处理,直接将源文件以二进制方式读出并可以输出)

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-7-10 6:35:25 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Sub Test() Dim MyExeName As String Dim OtherExeName As String Dim N As Long Dim arrBytes() As Byte MyExeName = "D:\mdPlayer.exe" OtherExeName = "E:\mdPlayer.exe" Open MyExeName For Binary As #1 N = LOF(1) ReDim arrBytes(1 To N) As Byte Get #1, , arrBytes Open OtherExeName For Binary Access Write As #2 Put #2, , arrBytes Close #2 Close #1 End Sub '----------------------

[此贴子已经被作者于2005-7-10 6:31:16编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-10 11:07 | 显示全部楼层

3:sailorgg 的做法是非常好的一个做法,把源代码隐藏(赋值)于文档变量中,这是正确的思路。

版主,不太懂文档变量的使用,请教一下,你是如何做到的?

TA的精华主题

TA的得分主题

发表于 2005-7-10 14:00 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

我整理了一个,做了一个"夹带"程序,打开"直读.DOC"文档,可以将指定的夹带程序以二进制方式读到并写入目标(含有夹带程序的WORD文档)的文档变量中,可以夹带10以个的文件,可惜还是有一些缺点,文档变量中的字符串长度还是有限制.因此,尽可能夹带小型程序或者文件.

此"夹带"程序,可以将宏自动复制到目标文档中,以后,只要打开该目标文档,将会创建(在C盘根目录下-还原该文件),注意,此处没有使用SHELL命令,可根据实际情况进行修改.

以下代码供参考:

'* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-7-10 13:59:02 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [ThisDocument-ThisDocument]^' '* -----------------------------

Option Explicit Private Sub Document_Open() Call GetByteToVariable End Sub '---------------------- '以下代码将用户需要夹带的文件以二进制方式读取并写到目标WORD文档中 Sub GetByteToVariable() Dim TargetDoc As Document, JDFileCount As Byte, MyFileName As String Dim N As Long, Mystring As String, MyDialog As FileDialog, arrBytes() As Byte Dim strPostfix As String, aArray As Variant, strVarName As String, TargetFullName As String On Error GoTo ErrHandle '启动错误处理程序 JDFileCount = 0 '初始化变量(此变量的意义在于对夹带文件计数) Application.ScreenUpdating = False '关闭屏幕更新 '新建一个空白文档,作为夹带的目标WORD文档 Set TargetDoc = Documents.Add TargetDoc.SaveAs "JDTest.doc" TargetFullName = TargetDoc.FullName '恢复屏幕更新 '重新激活本文档 Application.ScreenUpdating = True ThisDocument.Activate Start: JDFileCount = JDFileCount + 1 '累计 '如果夹带文件数目超过9个,则退出程序 If JDFileCount > 9 Then Exit Sub Set MyDialog = Application.FileDialog(msoFileDialogFilePicker) With MyDialog .AllowMultiSelect = False .Filters.Clear .Filters.Add "所有文件", "*.*", 1 '如果用户点选确定,则返回一个路径名 If .Show = -1 Then MyFileName = .SelectedItems(1) '取得夹带文件的NAME名(文件名及后缀) strPostfix = VBA.Mid(MyFileName, VBA.InStrRev(MyFileName, "\") + 1) Else '如果用户在第一次时即取消浏览对话框时,关闭新文档 GoTo KillDoc End If End With '指定一个夹带源文件位置 '以上代码适用于XP及以上版本,否则请以 MyFileName = "D:\mdPlayer.exe"处理之 Open MyFileName For Binary As #1 N = LOF(1) '取得总字节数 '动态声明一个Byte类型的数组 '在二进制文件中,每一个字节,构成一个数组元素 ReDim arrBytes(1 To N) As Byte '将一个已打开的磁盘文件读入一个数组变量之中 Get #1, , arrBytes Close #1 '关闭该文件 '在该二进制数组中循环 For Each aArray In arrBytes '字符串数据以","为分隔符在内存中累加 Mystring = Mystring & aArray & "," Next Erase arrBytes '清空数组,释放内存 '随机定义一个文档变量名,为时间序列 strVarName = strPostfix & JDFileCount '将最后一个,(","分隔符)去掉 Mystring = Mid(Mystring, 1, Len(Mystring) - 1) With TargetDoc '写入本文档的文档变量中 .Variables.Add Name:=strVarName, Value:=Mystring End With Mystring = "" '初始化变量 If MsgBox("您是否想继续夹带另外的文件?", vbYesNo + vbInformation) = vbYes Then GoTo Start '夹带结束后,将自动宏复制到目标WORD文档并保存. Application.OrganizerCopy Source:=ThisDocument.FullName, Destination:=TargetFullName, _ Name:="Main", Object:=wdOrganizerObjectProjectItems TargetDoc.Save Exit Sub ErrHandle: '错误处理,提示错误号和错误描述 MsgBox "Error:=" & Err.Number & vbCrLf & Err.Description, vbOKOnly + vbExclamation, "Error" '关闭目标文档并从磁盘中删除 KillDoc: TargetDoc.Close False: Kill TargetFullName End Sub '---------------------- '* +++++++++++++++++++++++++++++ '* Created By I Love You_Word!@ExcelHome 2005-7-10 13:59:10 '仅测试于System: Windows NT Word: 10.0 Language: 2052 '^The Code CopyIn [标准模块-Main]^' '* -----------------------------

Option Explicit Sub AutoOpen() If ThisDocument.Name = "直读.doc" Then Exit Sub Call FileRevert End Sub '---------------------- Sub FileRevert() '还原夹带文件在C盘根目录下的同一文件名 Dim RevertFileName As String, MyArray() As String, arrBytes() As Byte Dim N As Long, aVar As Variable, aArray As Variant On Error Resume Next For Each aVar In ThisDocument.Variables RevertFileName = "C:\" & VBA.Mid(aVar.Name, 1, Len(aVar.Name) - 1) '如果已存在该文件,则删除之 If Dir(RevertFileName, vbDirectory) <> "" Then Kill RevertFileName MyArray = VBA.Split(aVar.Value, ",") ReDim arrBytes(UBound(MyArray())) N = 0 For Each aArray In MyArray arrBytes(N) = aArray N = N + 1 Next Open RevertFileName For Binary Access Write As #1 Put #1, , arrBytes Close #1 Next End Sub '----------------------

'这是成品"夹带"程序(不含夹带的文件,是用来制作"夹带文件"的夹带程序)

ToNND8dG.rar (18.9 KB, 下载次数: 88)

[此贴子已经被作者于2005-7-10 14:02:05编辑过]

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-10 14:58 | 显示全部楼层

TO 守柔,好!

已经具有相当强的实用价值了。

我还在继续思考关于用十六进制进行读取的问题,也略有眉目了,完成后再谈。

TA的精华主题

TA的得分主题

发表于 2005-7-11 12:43 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2005-7-11 23:30 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2005-7-12 19:49 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助

第一次试验,word死了,再来第二遍. 又死了。大家试试,

我是想把ggg这个程序加进去的。

又死了。第三次了。

这一次,是“内存溢出”

我还是等大家讨论完了,来分享吧(能力有限)。也不想word死n次。

[此贴子已经被作者于2005-7-12 20:08:10编辑过]

TA的精华主题

TA的得分主题

发表于 2005-7-12 20:03 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册

To :守柔and 七兄

这是我刚做的一个二进制转十六进制代码:

Option Explicit Sub twoTohex() Dim MyExeName As String Dim OtherExeName As String Dim Mytext As String Dim Myhex As String Dim Fhex As String Dim N As Long Dim I As Long Dim arrBytes() As Byte MyExeName = "c:\regedt32.exe" Open MyExeName For Binary As #1 N = LOF(1) ReDim arrBytes(1 To N) As Byte Get #1, , arrBytes For I = 1 To N Myhex = Hex(arrBytes(I))

If Len(Myhex) = 1 Then Fhex = "0" & Myhex Else Fhex = Myhex End If Mytext = Mytext & Fhex Next I Close #1 Me.Variables.Add Name:="Myvar", Value:=Mytext End Sub

大家看看是否有更好,更快捷的方法。

TA的精华主题

TA的得分主题

发表于 2005-7-14 16:40 | 显示全部楼层

word文件中“夹带”另类方法:

通过在word 文件中嫁接你的目标文件,再用vba 读取还原“夹带”文件。

CRzjlD0J.rar (5.82 KB, 下载次数: 62)

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

本版积分规则

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

GMT+8, 2024-11-24 13:55 , Processed in 0.049075 second(s), 6 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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