使用按键精灵让Office执行自动保存

大家有没有碰到过在word中写着写着,突然断电的事故?如果此时发现忘了保存,你会怎么办?有些朋友就可能想要砸电脑了。其实,熟练使用office的朋友可能知道,在office中,已经提供了自动保存的功能。不过,这个功能好像并不是很好用,至少我本人觉得如此。为了保险起见,还是建议大家先把Office 原生的这个功能给使用起来,不知道如何使用的朋友请参见文末。

接下来,让我们进入正题吧。

问 题

假设Office的自动保存功能失效,在用户没有随时 Ctrl+S 习惯的情况下,如何能尽量少地减少因为程序崩溃导致的文档丢失。

解决思路(以Word 2007、Excel 2007为例)

想法一:当用户正在操作Office的时候,能有一个程序定时模拟键盘 Ctrl + S 的动作。

这个想法存在一个问题,即按键冲突。当用户点击键盘A,试图输入字母A的时候,恰巧程序执行了Ctrl,此时便会导致触发 Ctrl + A的快捷操作。这是我们不希望发生的。


想法二:用按健使用频率最低的按键替换Office 默认“保存”快捷键(比如使用PauseBreak),然后如同想法一。

这个想法几乎毫无破绽,但是一波要有三折才算完美,Word中提供了完全自定义的快捷键,但伟大的Excel却必须以Alt开头,万内的谷歌也没能解释这是WHY。


想法三:在Excel中插入VBA脚本,在脚本中直接调用Excel内部的“命令”来解决Excel无法自定义快捷键的办法。

采用!

代码实施

Word 中快捷方式修改

Word选项 / 自定义 / 键盘快捷方式自定义 / 选择FileSave命令,添加想要的新快捷键,选择指定。


进入office选项自定义面板


设置office保存快捷方式


Excel 利用VBA脚本来设置快捷键

打开Excel后,切换到“视图”选项卡,点击取消隐藏,把隐藏的Personal.xlsb显示出来,然后用快捷键 Alt +F11调出宏开发面板。

Excel 2007中的个人宏 工作簿(Personal.xlsb) 

个人宏工作簿是一个自动启动 的 Excel 文件,你可以用这个 Excel 文件保存经常使用的数据或者宏,例如你可以将你经常要使用到的例子或者反复使用的 宏 保存到个人宏工作簿中,这就相当于一个宏模板。个人宏工作簿可以为.xlsb格式,默认为Personal.xlsb 文件,也可以直接创建.xlsx 文件作为个人宏工作簿。

显示Excel隐藏文档


打开VBA编程界面


在Thisworkbook中插入下列代码:

 Private Sub Workbook_Open()
     Application.OnKey "{PGDN}", "mySave" 'excel打开的时候注册快捷键
 End Sub


在模块中插入下列代码:

Sub mySave()
  On Error Resume Next
  
  If UCase(Right(ActiveWorkbook.FullName, 5)) = ".XLSB" Then '如果当前不是正常的excel文件,那么忽略
  Exit Sub
  End If
  
  If Len(ActiveWorkbook.Path) <= 0 Then '如果这是新打开的excel,则要跳出另存为的窗口

     Dim fName  As Variant
     Dim fileFormat As String
      Dim NewFileType As String
      NewFileType = "Excel 工作薄 (*.xlsx), *.xlsx," & _
                     "Excel 97-2003 工作薄 (*.xls), *.xls"
                     
     fName = Application.GetSaveAsFilename(fileFilter:=NewFileType)
     If fName = False Then
     Exit Sub
     
     End If
     
   fileFormat = Right(RTrim(fName), 4)
   If fileFormat = ".xls" Then
      ActiveWorkbook.SaveAs fName, xlNormal
      ElseIf fileFormat = "xlsx" Then
      
      ActiveWorkbook.SaveAs fName, 51 ’注意要用51来保存xlsx
      End If
Else
ActiveWorkbook.Save '否则直接保存
End If
End Sub


保存完上述代码后,回到excel中,这个时候如果试图打开一个新的excel,会提示personal.xlsb已经打开,询问是否要以只读的方式打开。这是因为每一个excel都会默认打开personal.xlsb这个文件。解决办法是设置该文件可以共享编辑,然后再把这个文件给隐藏起来(隐藏的方式和取消隐藏的方式一样)。


Excel提示Personal.xlsb正处于锁定状态


允许用户共享personal.xlsb


设置完上述之后,你可以完全退出Excel后,重新进入Excel试下我们的快捷键是否成功了。


唯一的问题:以后关闭Excel需要关闭两次,第一次是正常的Excel文件,第二次是personal.xlsb文件,目前我还不太清楚如何解决这个问题。



按键精灵脚本编写

在使用按键精灵前,有考虑过自己写代码来发送键盘消息,但是既然有一款现成的,何必在自己造车呢。下载按键精灵9 (貌似这个按键精灵9的界面在win7下有问题,经常黑屏,不过不影响使用)。

按键精灵开始界面


按键精灵编程界面


先用按键精灵提供的“抓抓”来抓取Word和Excel的窗口类名分别为“OpusApp”和“XLMAIN”。

按键精灵的抓抓工具


使用按键精灵抓抓工具抓取Office的句柄

然后利用按键精灵提供的界面编程QUI来进行界面设计(和VB界面设计差不多),然后插入下列VBScript代码,本人对VB代码不太精通,所以下面代码只供参考。


Event Form1.btnStart.Click
    Form1.Timer1.Interval = Form1.interval.Text * 1000
    Form1.Timer1.Enabled = True
    Form1.btnStop.Enabled = True
    Form1.btnStop.BackColor = "F0F0F0"
    Form1.btnStop.TextColor = "000000"
    Form1.btnStart.Enabled = False
    Form1.interval.Enabled = False
End Event
Event Form1.Timer1.Timer '定时器,定时执行保存操作
    Hwnd = Plugin.Window.Foreground()
    sClass = Plugin.Window.GetClass(Hwnd)
    If sClass = "XLMAIN" or sClass = "OpusApp" then '如果当前窗口是Word或Excel,则按下PageDown
        KeyPress "PageDown", 1
    End If
End Event
Event Form1.btnStop.Click
    Form1.Timer1.Enabled = False
    Form1.btnStop.Enabled = False
    Form1.btnStart.Enabled = True
    Form1.btnStart.BackColor = "F0F0F0"
    Form1.btnStart.TextColor = "000000"
    Form1.interval.Enabled = True
End Event
Event Form1.Load
    Form1.Timer1.Enabled = False
    Form1.btnStop.Enabled = False
    Form1.btnStart.Enabled = True
    Form1.interval.Enabled = True
End Event


最后,利用按键精灵的发布功能,把我们的界面和脚本做成一个独立的小软件,因为是免费版的,所以每次运行都会有广告,而且界面不怎么美观,不过不影响脚本执行,也就不计较这么多了。

制作按键精灵脚本

大功告成,现在只要运行这个软件,每隔一定时间就会自动执行保存了。

发布后的按键精灵工具

发布后的按键精灵工具

Office 自带的自动恢复功能

以Word 2007为例,点击选项 / 保存,在右边的界面中对自动保存周期和位置进行设置,时间越短丢失的数据越少。

office自动保存功能面板

文章索引

[隐 藏]

本站采用知识共享署名 3.0 中国大陆许可协议进行许可。 ©2014 Charley Box | 关于本站 | 浙ICP备13014059号