Outlook用宏替换选中文本

接上文,体会到了vba在office套件中的强大功能。于是我认真思考了平常工作中有没有哪些机械重复性的操作是需要自动化的程序替代的。我司产品的图号(drawing)都是用一长串数字来命名的,很难以记忆。而客户很喜欢用自己习惯的简称来进行沟通。我在与德国同事沟通的每封邮件中都必须写清楚针对的是哪个图号,所以我很需要在输入邮件时快速地将简称替换为图号。

我为这个宏构思的操作步骤是:在写邮件时先输入简称,然后选中这个简称后运行宏,选中部分直接转换为图号。 由于上一次已经简单了解了vba语言的结构,所以我只要知道如何将字符串定义为鼠标选中的文本,后面的替换工作只需要简单地if判断后为选中文本定义新的字符串值即可。 据此,我又在google中进行了一番学习。。。

代码并不难,但是没想到一直报错。后来终于发现,如果需要将object定义为Word.Application对象的话,前提是要在outlook的库中勾选word library,如图:

最终可用的代码如下:

Sub QuickDrawing()
    Dim objItem As Object
    Dim objInsp As Outlook.Inspector

    ' Add reference to Word library in VBA Editor, Tools, References
    Dim objWord As Word.Application
    Dim objDoc As Word.Document
    Dim objSel As Word.Selection
    On Error Resume Next

    'Reference the current Outlook item
    Set objItem = Application.ActiveInspector.CurrentItem
    If Not objItem Is Nothing Then
        If objItem.Class = olMail Then
            Set objInsp = objItem.GetInspector
            If objInsp.EditorType = olEditorWord Then

                Set objDoc = objInsp.WordEditor
                Set objWord = objDoc.Application
                Set objSel = objWord.Selection

                If objSel = "Nickname1" Then
                objWord.Selection = "DrawingXXXXXXXXXX"
                End If
                
                If objSel = "Nickname2" Then
                objWord.Selection = "DrawingYYYYYYYYYY"
                End If
                
                '重复使用多个if判断

            End If
            
        End If
        
    End If
    
    Set objItem = Nothing
    Set objWord = Nothing
    Set objSel = Nothing
    Set objInsp = Nothing
    
End Sub

后续改进:

  1. 很无脑地直接使用多个if来判断,不便于后期添加更多的图号。标准的做法应该是在Excel中有一个简称和图号的对应表,选中的文本和表中的简称进行对比后返回相应的图号。但是这样又涉及到Excel对象的操作,又要花点时间去摸索。
  2. 目前的选中文本仅对于邮件正文区域有效,主题栏中选中的文本并不起作用。其实我一开始先做了一个在空白主题栏中输入简称后将整个主题替换为图号的宏,但是觉得那样在实际操作中限制过多,于是改为替换选中文本的方案。

实际使用后发现,vba真香!

发表评论

电子邮件地址不会被公开。 必填项已用*标注

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>

此站点使用Akismet来减少垃圾评论。了解我们如何处理您的评论数据