存档

文章标签 ‘工具’

在Excel中发送邮件

2010年8月13日

最近很久没有更新。

在Excel中发送邮件有很多方式,可以使用Outlook,或者使用Lotus Notes。这里使用CDO组件来,CDO组件包括在cdosys.dll这个动态链接库中。关于CDO的文章,网络上已经有很多资源

这个加载宏使用CDO组件来直接发送邮件,这样不需要Outlook或Lotus Notes这些外部程序。而且使用Outlook时,会有一个烦人的提示窗口。
Outlook Warning Message

使用CDO组件发送邮件的前提是你的邮箱支持SMTP服务。

界面:
ExcelEmail UI

设置:
ExcelEmail Setup

发送界面:
ExcelEmail Sender

下载:Box.net | SkyDrive

VBA , , ,

正则搜索和替换加载宏

2009年12月6日

和Word不一样,Excel只支持简单的通配符查询。使用正则表达式则可以提供强大的搜索和替换功能,因此做了一个利用正则表达式实现搜索和替换功能的加载宏。
运行加载宏后,在“编辑”菜单的最末添加“RegEx Find”自定义菜单项。点击后弹出窗口,可以在窗口上的搜索和替换文本框中使用正则表达式。下面的列表框中最多只显示1000条内容(可以自己修改)。界面如下:
RegEx Find Addin

下载:SkyDrive | Box.net

VBA, 其它 , , ,

Excel正则表达式工具

2009年11月6日

正则表达式是基于文本的编辑器和搜索工具的一个重要部分,传统的?和*方法十分有限。正则表达式在数据有效性验证、替换文本、提取子字符串有很好的应用。

不同的程序或语言对正则表达式的支持是不一样的。像MS Excel,仅支持简单的通配符查找和替换。VBA中没有正则表达式对象,要使用正则表达式的话,我们需要在引用里添加Microsoft VBScript Regular Expression 5.5动态库。VBScript的正则表达式支持向前查找(包括肯定式和否定式),支持分组和非分组(仅捕获位置),但不支持向后查找。

下面是一个简单的例子:

Sub RegExMatch()
    Dim regEx as RegExp
    Dim aMatch as Match
    Dim Matches as MatchCollection
    dim patrn as String                ' 搜索模式
    Dim strng as String
    Dim RetStr as String
 
    patrn="is."
    strng="IS1 is2 IS3 is4"
 
    Set regEx=new RegExp
 
    regEx.Pattern=patrn
    regEx.IgnoreCase=True
    regEx.Global=True
    Set Matches=regEx.Execute(strng)
 
    For Each aMatch in Matches
        RetStr=RetStr & "Match found at position "
        RetStr=RetStr & aMatch.FirstIndex & ". Match Value is '"
        RetStr=RetStr & aMatch.Value & "'." & vbCrLf
    Next
    MsgBox RetStr
End Sub

也可以使用后绑定的方法。

    Dim regEx As Object
    Set regEx = CreateObject("VBSCRIPT.REGEXP")

RegEx对象的属性和方法

属性
Global              设置或返回一个 Boolean 值, 该值指明在整个搜索字符串时模式是全部匹配还是只匹配第一个. 缺省为False.
IgnoreCase    设置或返回一个Boolean值, 指明模式搜索是否区分大小写. 缺省为False.
Pattern            设置或返回被搜索的正则表达式模式.

方法
Test                   对指定的字符串执行一个正则表达式搜索, 并返回一个 Boolean 值指示是否找到匹配的模式.
object.Test(string)
Execute           对指定的字符串执行正则表达式搜索.
object.Execute(string)
Replace           替换在正则表达式查找中找到的文本.
object.Replace(string1, string2) string1是将要进行文本替换的字符串, string2是替换文本字符串.

Matches集合和它所包含的Match对象,只能由上面的Execute方法来返回。
每个Match对象包括三个属性。

  • FirstIndex – 匹配项中第一个字符的位置
  • Length – 匹配项的长度
  • Value – 匹配项的值

当匹配模式中包含分组的话,Match对象还会包含一个SubMatches集合,也就是$1、$2等等。

关于正则表达式网络上已经有很多的资料,可以Google一下关键字。这里主要将一下分组、反向引用和向前查找。

分组,非捕获分组,反向引用

正则表达式模式中使用圆括号对字符进行分组,并保存匹配的文本,被匹配的内容指定给变量$1、$2等等。捕获组的编号有圆开括号在正则表达式模式中的位置决定。使用嵌套的圆括号时,同样的规则也适用。VBScript中不支持命名的分组。

VBScript支持非捕获圆括号(?:the-non-captured-content)。非捕获分组匹配的内容不指定给变量$1等。

非捕获分组使模式看起来更加复杂,但能减少要处理的组数,因此编程会更容易一些,同时也可以提升效率。

有关捕获圆括号的常见用法是将其用于反向引用。下面是摘自脚本帮助文件关于反向引用的介绍。

正则表达式一个最重要的特性就是将匹配成功的模式的某部分进行存储供以后使用这一能力。请回想一下,对一个正则表达式模式或部分模式两边添加圆括号将导致这部分表达式存储到一个临时缓冲区中。可以使用非捕获元字符 ‘?:’, ‘?=’, or ‘?!’ 来忽略对这部分正则表达式的保存。

所捕获的每个子匹配都按照在正则表达式模式中从左至右所遇到的内容存储。存储子匹配的缓冲区编号从 1 开始,连续编号直至最大 99 个子表达式。每个缓冲区都可以使用 ‘\n’ 访问,其中 n 为一个标识特定缓冲区的一位或两位十进制数。

向后引用一个最简单,最有用的应用是提供了确定文字中连续出现两个相同单词的位置的能力。请看下面的句子:

Is is the cost of of gasoline going up up?
根据所写内容,上面的句子明显存在单词多次重复的问题。如果能有一种方法无需查找每个单词的重复现象就能修改该句子就好了。下面的 VBScript 正则表达式使用一个子表达式就可以实现这一功能。
“\b([a-z]+) \1\b”
在这个示例中,子表达式就是圆括号之间的每一项。所捕获的表达式包括一个或多个字母字符,即由’[a-z]+’ 所指定的。该正则表达式的第二部分是对前面所捕获的子匹配的引用,也就是由附加表达式所匹配的第二次出现的单词。’\1′用来指定第一个子匹配。单词边界元字符确保只检测单独的单词。如果不这样,则诸如 “is issued” 或 “this is” 这样的短语都会被该表达式不正确地识别。

使用上面所示的正则表达式,下面的 VBScript 代码可以使用子匹配信息,在一个文字字符串中将连续出现两次的相同单词替换为一个相同的单词:

Dim ss, re, rv
ss = "Is is the cost of of gasoline going up up?." & vbNewLine
Set re = New RegExp
re.Pattern = "\b([a-z]+) \1\b"
re.Global = True
re.IgnoreCase = True
re.MultiLine = True
rv = re.Replace(ss,"$1")

请注意在 VBScript 代码中,全局、大小写敏感性以及多行标记都是使用 RegExp 对象的适当属性来设置的。

在replace 方法中使用 $1 来引用所保存的第一个子匹配。如果有多个子匹配,则可以用 $2, $3 等继续引用。

向前查找

VBScript支持向前查找,但不支持向后查找。向前查找包括肯定式向前查找和否定式向前查找。

向前查找根据要匹配的字符序列后面存在一个特定的字符序列(肯定式向前查找)或者不存在个特定的字符序列(否定式向前查找)来决定是否匹配。实际上,向前查找指的是一个子模式,这个子模式匹配特定的字符序列,但不返回匹配结果,所以也可以说向前查找子模式匹配的是测试文本中的位置。

例如要匹配States中的State,可以用
(?=States)State
或者用
State(?=s)

写了一个在Excel中的正则表达式工具,可以获得详细的匹配位置、内容和分组,并且可以获得替换内容。
Excel RegEx Tool

下载:SkyDrive | Box.net

VBA , ,

一个小孩子玩的绘画软件 – Tux Paint

2009年10月30日

SourceForge上偶然发现一个开源的绘画软件Tux Paint,介绍是说专门针对小孩子的。便下载下来给四岁的女儿使用,她还真的很喜欢,在电脑上堆砌出一层一层的色彩和图案。
Tux Paint的界面十分易用,一个空的画布和左右很多有意思的工具,另外还配有有趣的声效。
Tux paint

Tux Paint的官方网站:http://www.tuxpaint.org/
下载:
官方网站,另外还有Zip版免安装文件
SourceForge下载

其它

Office文档的二进制分析工具

2009年8月1日

近日微软发布了针对Office二进制文件格式的图形化视图安全工具Microsoft Office Visualization Tool (OffVis),其目的是发现文档中是否存在特定漏洞。对Office的Excel、Word和PPT文档的文件结构有兴趣的同学可以利用这个工具十分方便的解析Office的二进制文件格式。

下载:http://go.microsoft.com/fwlink/?LinkId=158791

下载后不需安装,解压即可。只是需要安装MS .Net Framework 2.0。

从菜单“File”中选择“Open Data File”,选择Office文档,然后在Parser列表框中选择对应的文档类型,再单击“Parse”按钮就可以获得结果。如下图:

OffvisSample

Spreadsheet ,