禁用EXCEL的Open/Save As功能

 

    发现我大多数时候在CSDN提的技术问题都没有得到解决过,一切还是得靠自己,这个问题由复杂变简单,写下来可以让别人也可以参考一下.

 

    Requirement:User通过Citrix连接到Server,运行Server上的程序会产生一些xls格式的表示,Leader希望禁掉所有xls文件的Open/Save As功能,就是不希望User删除Server上的文件.

 

    我本来以为没有必要做这个事情,因为User本来就没有权限删除Server上的权限的,但是他可以Save As后再删除,但他是删除他自己的文件,原始文件他不能删除也没有关系撒,但严谨一点的话就是不希望User做查看Report以外的操作,要操作自己Copy到自己本地磁盘上去操作,呵呵...

    于是开始找方法啊找方法:

     第一种最简单但不算方法的方法就是改变xls文件的默认打开方式.

     (还有一个问题值得注意的就是禁用了User使用Open/Save As功能但是其他应用程序可以正常Open/Read/write Excel文件.)

     这种方法只能实现用户双击的时候不能正常打开xls,但是人家还是可以选择打开方式为Excel撒,然后就可以Sava As了,想到这个方法也是因为之前有误解以为根本就不让User打开文件,弃之,BS下自己.

     第二种方法就是用Windows API,但是对这个一点都不熟悉,那就学吧,先把思路整理出来.

     就是用VB写一个程序,当EXCEL一启动的时候就触发它,然后这个程序循环扫描桌面所有的Excel文件窗口,然后来禁用Open/Save As功能.实现了一半,发现获得Window句柄时并不能根据Window句柄获得Menu,再经研究发现,MS根本就实现不了,这个好像只能获得本应用程序的Menu,所以弃之,选择另外的方向.

    第三种方法就是现在成功实现的方法,当第二种方法遇到问题的时候开始重点转移到Maro,如果能编辑一个宏实现禁用Open/Sava As 功能,然后这个宏可以应用到所有的xls文件,而且是xls一打开的时候就自动执行这个宏,那就完成了为需求的实现鸟,呵呵,事实证明,这个是最容易最简单的一种方法.

    实现: 1.打开一个新的Workbook,打开vba编辑器(ALT + F11),双击ThisWorkbook,输入下面代码.

               Private Sub Workbook_Open()
                   Application.CommandBars("File").Controls("Save As...").Enabled = False
                   Application.CommandBars("File").Controls("Open...").Enabled = False
               End Sub

             注意:如果你的操作系统是中文的话就应该是:

                   Application.CommandBars("File").Controls("另存为...").Enabled = False
                   Application.CommandBars("File").Controls("打开...").Enabled = False

             跟你EXCEL里面菜单项目的名字一样就可以了.

             2.将Workbook保存名为PERSONAL.XLS,然后放在C:/Program Files/Microsoft Office/OFFICE11/XLSTART目录下,

       这个路径是相对路径,你可以搜索XLSTART目录在你的电脑上,然后将此文件放在这个目录下.

 

这样的话每次你打一个xls文件PERSONAL.XLS文件都会打开而且自动执行宏,所以你的文件的Open/Save As也就变灰了,不能用咯.

 

补充:可以将PERSONAL.XLS文件设置为hide,这样可以防止用户不小心把PERSONAL.XLS文件也改变并且存盘了.

参考资料:       

http://faq.csdn.net/read/213792.html
http://office.microsoft.com/zh-cn/help/HA010346282052.aspx
   

    2010-03-01

     More requirement:

     禁用一个三级菜单项,例:

     Application.CommandBars("Data").Controls("Get External Data").Controls("New Database Query...").Enabled = False    

    还遇到个问题就是把这个文件放进XLSART后,目地是达到了,但是如果删除了这个文件的话,相应的功能并不会消失,菜单项还是会被禁用,所以就只能所所有禁用的功能改为True

    如:Application.CommandBars("Data").Controls("Get External Data").Controls("New Database Query...").Enabled = True

    这样再打开其他Excel文件就没有影响了,而且不用的话最好是把XLSTART下面的文件删掉,免得每次打开一个文件这个文件还是自动为启动,占资源.

    还增了个需求就是在菜单栏加一个自定义菜单,然后实现当User点此菜单就自动将本文件另存到他本地C:/Temp/下.

 

'添加一个菜单项

    'SaveToC' 是宏名,点BEA就自动运行SaveToC

Sub CreateMyMenu()
     Set MyMenu = Application.CommandBars("Worksheet Menu Bar").Controls.Add(Type:=msoControlPopup)
     With MyMenu
          .BeginGroup = True
          .Caption = "BEA"
          .OnAction = "SaveToC"
     End With
End Sub

 

'删除菜单项
Sub DeleleMyMenu()
 On Error Resume Next
    Application.CommandBars("Worksheet Menu Bar").Controls("BEA").Delete
End Sub

 

'打开文件的时候如果此菜单存在就删除,然后调用添加菜单项

Private Sub Workbook_Open()  
  Call DeleleMyMenu
  Call CreateMyMenu 
End Sub

 

'在关闭文件的时候调用删除单菜荐
Private Sub Workbook_BeforeClose(Cancel As Boolean)

   Call DeleleMyMenu 
End Sub

 

'宏 SaveToC

Sub SaveToC()
'
' SaveToC Macro
' Macro recorded 2/26/2010 by Jessie
'
'
    Dim strFileName As String
    Dim strPath As String
    Dim iResponse As Integer
    Dim blnIsExistFolder As Boolean
    Dim blnIsExistFile As Boolean
   
    strPath = "C:/temp/"
       
    If FileFolderExists(strPath) Then
        blnIsExistFolder = True
    Else
       blnIsExistFolder = False
    End If
   
    If blnIsExistFolder = False Then
       MkDir (strPath)
    End If
   
    strFileName = strPath & ThisWorkbook.Name
   
    If FileFolderExists(strFileName) Then
       blnIsExistFile = True
    Else
       blnIsExistFile = False
    End If
   
    If blnIsExistFile = True Then
       iResponse = MsgBox("The file '" & ThisWorkbook.Name & "' already exists. Do you want to replace the existing file?' ", vbYesNoCancel + vbExclamation)
    Else
       Application.ActiveSheet.SaveAs Filename:=strFileName
    End If
    If iResponse = 6 Then
       Application.DisplayAlerts = False
       Application.ActiveSheet.SaveAs Filename:=strFileName
       Application.DisplayAlerts = True
    End If
   
End Sub
Public Function FileFolderExists(strFullPath As String) As Boolean
    On Error GoTo EarlyExit
    If Not Dir(strFullPath, vbDirectory) = vbNullString Then FileFolderExists = True
   
EarlyExit:
    On Error GoTo 0
End Function 

 

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值