ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

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

[已解决]如何做到非本机打开密码保护宏就删除所有代码?

[复制链接]

TA的精华主题

TA的得分主题

发表于 2007-9-26 10:18 | 显示全部楼层 |阅读模式

Function GetComputerName()
GetComputerName = Environ("ComputerName")
End Function
Sub Test()
    If UCase(GetComputerName) <> UCase("shourou") Then Exit Sub
End Sub

守柔提供的以上代码非常好用;现在我想在现有的宏代码中加入一段代码,如果不是自己的电脑打开starup文件夹下的WORD宏有工程保护密码模板文件时(密码是已知的),就删除自身所有的宏代码并保存,需要不弹出确认保存窗口就把所有代码删除!

请教守柔大师如何实现?

[此贴子已经被作者于2007-10-14 12:39:25编辑过]

TA的精华主题

TA的得分主题

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

可以参考一下这个链接:

http://club.excelhome.net/viewthread.php?tid=212027&replyID=667753&skin=0

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-26 11:08 | 显示全部楼层

守柔帮我修改测试一下好吗 ?

参考守柔的代码集:五十八) 删除所有代码(包括自身)
'* +++++++++++++++++++++++++++++++++++++++
'^The Code CopyIn [ThisDocument-ThisDocument]^'
'* --------------------------------------------------------------------------
Private Sub Document_Open()
        D im i ,  A  A s  I n t e g e r 

If UCase(GetComputerName) <> UCase("shourou") Then 
        For Each i In ActiveDocument.VBProject.VBComponents
        A  =  i.CodeModule.CountOflines
        i.CodeModule.DeleteLines  1,  A
    N e x t 
End Sub
'----------------------

这样可以吗?还有需要不弹出确认保存窗口就把所有代码删除怎么添加代码语句?

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-29 22:08 | 显示全部楼层

能实现符合条件就自动删除VBA自身代码吗?

守柔老大,这个问题我在论坛里找了很久都没有完美的解决方案阿,好像都被当成病毒了,要么就是WORD测试代码的时候弹出安全窗口不给运行代码,现在有更好的解决方案吗?

[此贴子已经被作者于2007-9-29 22:09:22编辑过]

TA的精华主题

TA的得分主题

发表于 2007-9-30 05:33 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
QUOTE:
以下是引用zhaoyes在2007-9-29 22:08:58的发言:

守柔老大,这个问题我在论坛里找了很久都没有完美的解决方案阿,好像都被当成病毒了,要么就是WORD测试代码的时候弹出安全窗口不给运行代码,现在有更好的解决方案吗?


你没有认真去领会链接中的内容。

请认真阅读代码中的注释行。

'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2007-9-30 5:23:56
'仅测试于System: Windows NT Word: 11.0 Language: 2052
'№ 0267^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------
Option Explicit
Function GetComputerName()
    GetComputerName = Environ("ComputerName")
End Function
'----------------------
Sub RemoveMoudle()
'把所有重要的代码写到"模块1中",如果不够,可再插入"模块2"等
'在代码中继续移除已知名的模块即可.
'如果使用代码在模块中循环,则必须在安全性中设置信任对于VB项目的访问
'尽管可以使用VBA完成对于注册表中WORD安全性对于信任VB项目的修改
'但可能通过不病毒扫描程序
'本例只是在允许宏运行的前提下才存在,很明显,若要运行模块中的宏,必须允许
'宏运行,否则他人使用该文档也没有意义
'定义一个3个字节的string型常量
    Const MyPassWord As String * 3 = "123"
    On Error GoTo Finish '如果已移除模块后再次打开时,则退出
    '若更可靠些,可以写在文档变量(Variables)中
    Application.ScreenUpdating = False
    '输入密码
    Application.VBE.CommandBars.FindControl(ID:=2578).Execute
    SendKeys MyPassWord & "{Enter 2}", True
    Application.OrganizerDelete Source:=ThisDocument.FullName, Name:="模块1", Object:=wdOrganizerObjectProjectItems
Finish:
    Application.ScreenUpdating = True
    MsgBox "OK,已删除!"    '此句请删除,仅作为测试用
    ThisDocument.Close True
End Sub
'----------------------
Private Sub Document_Open()
'如果计算机用户名不为指定的用户("shourou")则进入删除模块程序
    If UCase(GetComputerName) <> UCase("shourou") Then RemoveMoudle
End Sub
'----------------------

TA的精华主题

TA的得分主题

 楼主| 发表于 2007-9-30 12:34 | 显示全部楼层
QUOTE:
以下是引用守柔在2007-9-30 5:33:16的发言:

你没有认真去领会链接中的内容。

请认真阅读代码中的注释行。

'* +++++++++++++++++++++++++++++
'* Created By SHOUROU@ExcelHome 2007-9-30 5:23:56
'仅测试于System: Windows NT Word: 11.0 Language: 2052
'№ 0267^The Code CopyIn [ThisDocument-ThisDocument]^'
'* -----------------------------
Option Explicit
Function GetComputerName()
    GetComputerName = Environ("ComputerName")
End Function
'----------------------
Sub RemoveMoudle()
'把所有重要的代码写到"模块1中",如果不够,可再插入"模块2"等
'在代码中继续移除已知名的模块即可.
'如果使用代码在模块中循环,则必须在安全性中设置信任对于VB项目的访问
'尽管可以使用VBA完成对于注册表中WORD安全性对于信任VB项目的修改
'但可能通过不病毒扫描程序
'本例只是在允许宏运行的前提下才存在,很明显,若要运行模块中的宏,必须允许
'宏运行,否则他人使用该文档也没有意义
'定义一个3个字节的string型常量
    Const MyPassWord As String * 3 = "123"
    On Error GoTo Finish '如果已移除模块后再次打开时,则退出
    '若更可靠些,可以写在文档变量(Variables)中
    Application.ScreenUpdating = False
    '输入密码
    Application.VBE.CommandBars.FindControl(ID:=2578).Execute
    SendKeys MyPassWord & "{Enter 2}", True
    Application.OrganizerDelete Source:=ThisDocument.FullName, Name:="模块1", Object:=wdOrganizerObjectProjectItems
Finish:
    Application.ScreenUpdating = True
    MsgBox "OK,已删除!"    '此句请删除,仅作为测试用
    ThisDocument.Close True
End Sub
'----------------------
Private Sub Document_Open()
'如果计算机用户名不为指定的用户("shourou")则进入删除模块程序
    If UCase(GetComputerName) <> UCase("shourou") Then RemoveMoudle
End Sub
'----------------------

此代码做成word模板后放在STARUP文件下,就算非本机都不会触发Document_Open事件,而且所有宏代码控件功能都能正常使用,模块并没有被删除;当此模板改后缀名为.DOC时,符合条件后就会打不开文件和看不见代码,但是问题来了:用Advanced VBA Password Recovery密码恢复软件,它能够很轻松地得到Visual Basic编制的VBA密码,然后用密码进入VBE可看到所有代码并没有被删除,上述代码好像只是一个障眼法,请守柔检查一下我说的对不对。这样的话我需要删除代码不被人知道的功能就没有达到啊。
[此贴子已经被作者于2007-9-30 12:42:37编辑过]

TA的精华主题

TA的得分主题

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

绕了很多弯路,终于完美解决!简化了代码之后如下

'删除模板模块的代码,有工程保护密码也一样删除模块,注意模板文件一定要另存为模板不能直接改后缀名
Option Explicit
Function GetComputerName()
    GetComputerName = Environ("ComputerName")
End Function
Sub RemoveMoudle()

On Error Resume Next '这一句一定要写
Application.OrganizerDelete Source:=ThisDocument.FullName, Name:="模块1",Object:=wdOrganizerObjectProjectItems
    Application.ScreenUpdating = True
    Me.Save
    ActiveDocument.Close (True)
End Sub
Sub AutoOpen()
    If UCase(GetComputerName) <> UCase("shourou") Then RemoveMoudle
End Sub
Sub AutoNew()
    If UCase(GetComputerName) <> UCase("shourou") Then RemoveMoudle
End Sub
Sub AutoExec()
'加载模板后如果计算机用户名不为指定的用户("shourou")则进入删除模块程序
    If UCase(GetComputerName) <> UCase("shourou") Then RemoveMoudle
End Sub
Private Sub Document_Open()
'打开文档后如果计算机用户名不为指定的用户("shourou")则进入删除模块程序
    If UCase(GetComputerName) <> UCase("shourou") Then RemoveMoudle
End Sub

[此贴子已经被作者于2007-10-15 9:13:59编辑过]

TA的精华主题

TA的得分主题

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

好帖,收藏学习!

TA的精华主题

TA的得分主题

发表于 2010-7-1 09:12 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2010-10-20 21:00 | 显示全部楼层
记录下。看看研究哈如何删除所有模块呢?...
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

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

GMT+8, 2025-1-12 01:44 , Processed in 0.042009 second(s), 8 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

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

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

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