ExcelTip.Net留存知识帖 ---【注:附件之前被网盘供应商清空后,现已修复-现已修复-现已修复为本地下载!】
现在位置:首页 > E文精选 > 综合应用 > EXCEL中脚本的学习与应用

EXCEL中脚本的学习与应用

作者:绿色风 分类: 时间:2022-08-17 浏览:147
楼主
raulerini
  时代在飞速发展,EXCEL从我最先开始接触到的EXCEL2003已经发展到最新的EXCEL2010版本了。EXCEL2010固然强大了许多:再也不用忍受2003那灰不溜秋的菜单栏了,能做许多炫目的3D图表了,行列数多的可以媲美一个中型数据库了…….但我今天想讲的知识就是一个关于EXCEL2003的功能(至少大部分的知识都是基于2003的)。或许你会感到疑惑:掌握2003中的过时的技巧有用吗?呵呵,我可以很负责任的告诉你,有用!非常有用,古人有云:技术会过时,而知识永远不会过时。说不定,你看完我的文章,会有一股重新找excel2003安装盘的冲动呢?
      
    或许你又会问:EXCEL2003还有什么功能2010里面做不到的吗?没错!的确有,并且是一个非常强大的功能,那就是EXCEL2003中的脚本编辑器。


    还是从一个很实用的例子开始说起吧:
1[批量替换批注]

某工作表中有大量的批注,每个批注的作者都是raulerini,现要批量将raulerini替换为Exceltip。

     我知道你想做什么,你想按CTRL+H替换对不对?没成功?那就ALT+F11打开VBE编辑器,什么for each cm in activesheet.comments,然后来加个if判断……最后调试,改错,再调试,运行。哈哈,最终大功告成!
     如果我告诉你太复杂,只要你上面的步骤多按一个shift键,30秒就能搞定!不信????那我演示给你看。
步骤:

  1. 1、ALT+Shift+F11打开脚本编辑器(是不是只多按了一个shift?)
  2. 2、CTRL+H替换,替换raulerini为exceltip
  3. 3、回到EXCEL界面,按屏幕上出现的刷新按钮,大功告成!


操作图示:


 


    看了上面这么精简的解法,你是不是又有了一股想重新找出EXCEL2003安装盘的冲动?可是你却还舍不得在你的硬盘腾出一部电影的空间?好吧,那我再大费口舌举另一个常见的例子好了。


2[批量更改上下标]

工作表中无规律的分布着很多ExcelTip这个单词,现在想将Tip三个字母设置为下标。应该如何操作?

    我知道你又想按ALT+F11开始写VBA代码了!不是告诉过你吗,你少按了一个shift键。
解法:
  1. 1、ALT+Shift+F11打开脚本编辑器
  2. 2、查找ExcelTip,替换为Excel<sub>tip</sub>
  3. 3、返回EXCEl界面,按刷新按钮

又是30秒的事情!何必非要用到sub,非要用到循环,非要用到判断呢?


操作图示:

 


好吧,或许你已经下定决心删掉一部电影来重装EXCEL2003了,不管那部电影是经典的泰坦尼克或同样经典的3DXX团。我必须承认你这个做法是相当正确的,既然20102003能在同一块硬盘中井水不犯河水,几百M的容量的"损失"还是相当值得的!




2楼
raulerini
恩,或许你还是不愿意为这偶尔暂时的快捷支付几百M的容量,或许公司限制的厉害没办法随便安装。好吧,那我就讲些2010里面也能用的到得东西(当然2007也能用)


3:[批量更改上下标]

    与例题2相同,但是唯一的一点改变在于数据不是零散分布而是位于同一列的,要求将Exceltip中的tip设置为下标。



    你还想用VBE?说了不让那么复杂嘛!继续脚本吧
步骤:
  1. 1、B列输入公式="<table><tr><td>"&substitute(A1,"Tip","<sub>Tip</sub>"),下拉
  2. 2、CTRL+C复制,并打开剪贴板(如果你设置了按两次C打开剪贴板,那么可以直接按CTRL+C+C)
  3. 3、单击剪贴板中的数据,将其粘贴至EXCEL中
  4. 4、鼠标右键→选择性粘贴→在出现的对话框中选择“粘贴为Unicode文本”,大功告成!


操作图示:

 



   记住上面的4步,一录二拷三粘再粘,因为我们后面会多次用到。

   当然相对于例2,数据只能在同一列(你说这不是真美妙废话,不同列的情况下你给我输入公式试试!)。


   搞了这么老半天,举了这么多例子,上面的那个函数,那些代码到底是什么意思呢?我们不能只知其然不知其所以然吧?

   好吧,老实说,其实我也不是很懂!(你大叫道:什么!你不懂还在这里侃侃而谈!)。我只能大概的说,这是一个html语言的写法,html语言我没学过(当然,计算机方面的东西我都没系统的学过,本人非电脑专业出身,从事的也非计算机方面的工作,亦未受过任何专业之电脑培训,呵呵,每次给同事解决不出问题就以这个理由来搪塞),但大概来说,html一种标记语言,使用标记标签来标记元素。标记标签通常用一对"<>"包围。一般标记标签是成对出现的,比如 <b></b> ,前面的是开始标签,后面的是结束标签。但html语言也允许只有开始标签而省略闭合标签(当然这样写是不规范的)。
html中的<table>用来标记一个表格,而<tr>用来标记表格中的一行,<td>用来标记一个单元格。这样你就容易理解上面这段函数的意思了。

对比上面的函数,我们最终得到的函数结果实际上是生成了这样一串字符串,每个字符串的含义如下:


 

3楼
raulerini
4[隐藏部分文字]

趁热打铁,我们来做一道相似的题目,一列单元格中有部分文字,例如,我们有一些选择题,但其包含答案。要将答案部分隐藏掉。

步骤:

  1. 1、B列输入公式"="<table><tr><td>"&LEFT(A2,FIND("(",A2)-1)&"<font color=white>"&MID(A2,FIND("(",A2),99)&"</font>"


后面的步骤我就不再重复了,一录二拷三粘再粘。


操作图示见下:

 


    这里我们又学会了一个标签<font>,这个标签主要是要来设置字体的,当然字体设置包括字体名称<font face>(注意不要想当然的以为名称就是name!这里是face),字体大小<font size>,字体颜色<font color>等等,例如,我们要设置字体为隶书,24号字,颜色为黄色,则代码为<font face=隶书 size=24 color=yellow>,注意每个属性间是以空格隔开的。
       html代码的书写比较自由,引号可加可不加,例如上面的代码, face=隶书
face='隶书'(加单引号) 以及face="隶书"(加双引号),这三种代码都是正确的


    那如果要设置字体的下划线及粗斜体呢?注意,这个与VBA不同的,下划线及粗斜体并不是<font>对象内部的属性了,而是单独的有专门的标签,例如粗体<b></b>,斜体<i></i>,下划线<u></u>,如果我们将字设为粗斜体加下划线,正确的标签写法是<u><i><b>test</b></i></u>

    最后还要废话一句,上面的3个标签中,哪个写在前面哪个写在后面是没有区别的,即没有一定的先后顺序。但是,要注意的是,闭合标签的顺序要依照开始标签的顺序来决定,即最先开始的标签最后闭合,如上面的<u>最先开始,所以最后闭合的一定是</u>标签,顺序搞反了可就没了对称美咯,嘿嘿。



    另外一些有用的标签:
        <td bgcolor></td>这个标签是<td>对象的一个属性(background color,背景色,简写bgcolor),用来设置单元格背景色,即填充色,例如将当前单元格背景色设置为黄色<td bgcolor=yellow>test</td>。记得我之前写过一篇文章,是写在EXCEL2003中如何根据当前单元格的值填充不同的背景色,现在因为2010的条件格式已经突破了3种的限制,这个问题已经变得很好解决了,但是在2003下,用条件格式+自定义格式都没办法解决的问题却可以用脚本+函数来解决。


       <sub></sub>下标,<sup></sup>上标,这个上面已经讲过并举例了


       <table border></table>设置表格的边框,例如设置表格边框线粗为3代码为<table border=3></table>。这个本人觉得实际用处不大。


    设置拼音<ruby></ruby>以及<rt></rt>这两组标签是用来设置拼音的,例如<table><tr><td><ruby>中国<rt>zhongguo</rt></ruby></font>,设置单元格的内容为中国,同时设置其拼音为zhongguo,大家可以在excel中试验一下,本人觉得这个也是个比较有用的标签,之前我曾写过用脚本批量隐藏数据的7种方法,这也是其中一个比较有用且简便的方法。

    通常情况下,我们需要将上面的代码与函数结合起来运用,而经常运用到得函数一般有:leftrightmidsubstitutereplaceiflookup,choose等等。

    好吧,相信我讲了这么多,你应该能应付一些单元格设置上的小问题了,的确,脚本在对单元格进行批量设置的时候有其独特的优势。

4楼
raulerini
   下面我们再来讲点复杂的:正则表达式
   听到上面这5个字,有的人立马眼冒金星晕晕沉沉了吧,不错,其实正则表达式我也只是略懂、略懂。但不得不说,正则表达式的确是一个非常有用的工具,仅仅略懂也能受益颇多了。
   可能有的人还在晕乎:不是讲脚本吗?怎么转了这么大个弯忽然绕到正则表达式中去了?小乐你的思维也太能漂了吧?
   我说莫急莫急,我现在正要讲的就是正则表达式在脚本中的运用呢。

        Excel的确是好用,但是查找替换功能却是它的一块短板,甚至于有的时候我们不得不将excel中的文字复制到word中去进行替换,例如我们要查找前面是汉字后面是字母的单元格,或者是我们在替换的时候要替换诸如"A*B"的内容为"A*D"?你能怎样将其中的通配符"*"在替换中保留下来?
    不要企图跟我谈VBA,这里只讨论技巧,何况VBA中的正则表达式也简单不到那里去。

    啰啰嗦嗦了这么多,那EXCEL中到底有没有类似正则表达式的功能呢?至少也得跟word中的查找替换相差不多吧?

    呵呵,又得再向你推销一下EXCEL2003了(电影删掉了吗?重装2003了吗?),装好了???那我们正式开始。


    还是从上面的例4开始谈起,例4中我们所有的数据都在同一列,所以我们能轻松的用函数解决,但是,如果数据是零散分布在不同的列呢?如果我们要隐藏题目中的答案又当如何?
5:[部分数据的隐藏]

数据表中零散的分布着许多选择题,要将题目中的答案部分隐藏掉,应当如何操作?

步骤:
  1. 1、ALT+SHIFT+F11打开脚本编辑器(再次提醒,莫忘了shift键哦)
  2. 2、CTRL+H替换,查找框中输入{\([A-E]+\)},替换框中输入<font color=white>\1<\font>,勾选最下面的"使用正则表达式",全部替换
  3. 3、回到EXCEL,点刷新,OK了


操作图示:

 


   仍然是经典的三步:一打开二替换三刷新,但是由于替换的内容复杂了点。
   这里我简单讲讲上面表达式的意思。

 


    如上图,整个表达式就是为了查找用括号包围的ABCDE中的一个或者多个字母,因为括号本身也是正则表达式中的一个标记符号,所以括号前面用"\"转义符号强制显示,最后,整个表达式用"{}"大括号包围起来,以便在替换的时候利用
   替换框中,前面一部分的<font>代码我就不再啰嗦,中间的\1,代表的就是查找框中用大括号标起来的部分,Word中也有类似的功能

   上面就是一个简单的正则表达式的例子,看,look,瞧,是不是也就那么回事?
5楼
raulerini
   当然正则表达式的内容博大精深,要完全正握并不是我一幅图就能解决的问题,好好的自己钻研才是学习的正确方法。

   再来举一个正则表达式应用的例子,
6:[匹配汉字和字母]
       EXCEL中有大量的数据,其中很多都是前半部分是汉字,后面是字母,现需要保留前半部分的汉字,去除掉字母(即汉字与字母分离)

   用普通的替换打死也弄不出来吧,好,请出脚本编辑器
   步骤:

一打开二替换三刷新,我这里只给出替换的内容

    查找框中:\>{:Id+}[A-Za-z]+
替换为\>\1



       图示如下:
      
 



  简单说明下上述表达式的意思,:Id代表的是汉字,{:Id+}代表的是1个或多个汉字,并标记为表达式1[A-Za-z]+
代表是所有的字母集合,数量也是1个或者多个,最前面的\>相信大家也清楚了,转义符"\"强制显示后面的">"符号,而这个">"代表的是脚本标签"<td>"中最后的">"符号

  整个表达式的意思是,查找单元格中汉字在前,字母在后的表达式,替换为前面的汉字。

  需要说明的是:这里的正则表达式的语法与VBA中引用的regexp语法貌似有些不一样,例如,这里可以用:Id代表汉字,但VBA中并没有此类的表示方法

  好吧,正则表达式我也不准备再深入了,知道这个原理,知道三个步骤,自己研究研究下正则表达式的语法,以后就不用每次将EXCEL里面的内容拷到word中又拷回来了。
关于脚本和正则表达式,我之前还发过一个帖子,是整理选择题的。也值得一看。

选择题的快速整理
  

http://www.exceltip.net/thread-21482-1-1.html
6楼
raulerini
   我们再回归到函数上来,讲更多适用于2010版本的用法。

   前面已经讲了很多关于单元格处理的例子了,现在举一个批量插入图片的例子。这个例子也可以充分体现脚本语言的强大之处。

7:[批量插入图片]

A列有一些人名,例如amulee,rongjun等等,在我的电脑中有这些人名对应的头像图片,也是以amulee.jpg,rongjun.jpg命名,现需要将图片插入对应的人名所在的行。

公式:(步骤我就不再啰嗦了,函数法是4步,谨记!)

  1. ="<table><img  src='C:\Documents and Settings\Administrator\My Documents\我的图片\"&A1&".jpg'>"


  操作见下图:

 


  这里又引入了一个<img>标签,作用是用来定义图片的。

   脚本还能干什么呢?能合并单元格吗,我们试试吧。
   例8[批量合并单元格]
         A列有一些数据,需要将A列的数据相同的合并在一起
   公式:

  1. =IF(A2=A1,"","<table><tr><td rowspan="&COUNTIF(A:A,A2)&">"&A2&"</td>")



操作见下图。

 


    这里主要用到了单元格<td>rowspan属性,指的是单元格的行跨度(姑且这么翻译吧),即一个单元格占了多少行,说白了也就是要合并几行为一个单元格。通过countif函数计算要合并的行数,最终形成指定的行合并在一起
7楼
raulerini
   至此,脚本中经常用到的大部分内容我都讲完了。最后讲一个复杂点的。这个也是我研究了比较久的一个例子。

9[批量自定义格式]
       A列中有一些分数,需要将这些分数根据分数的高低分别显示为"A","B","C","D","E"五档,但是改变的只是单元格的显示,本身单元格的值仍然不变,可以照常的参与加减乘除运算等,即需要自定义格式。


   我们知道,自定义格式中可以用比较符号,但是,只能分为3档,如何将A列中的5档数据分别显示为"A","B","C","D","E"呢?
公式:

  1. ="<html xmlns:x='urn:schemas-microsoft-com:office:excel'><table><tr><td style='mso-number-format:\0022"&lookup(A1,{0,60,70,80,90},{"A","B","C","D","E"})&"\0022'>"&A1



   这个公式够头大的了吧。粗略分析下该公式,该公式不同于以前的部分在于,在<table>标签外面多了一个<html……..>标签,这个是用来定义一个namespace的,而<td>标签中,style='mso-number-format:定义了该单元格的自定义格式,再往后面,两对\0022实际上代表的就是"“”"引号,因为公式中不能嵌套引号所以用\0022代替,至于lookup公式部分不解释也罢。


操作图解:

 


   这个公式也有许多很实际的用处,例如,在单元格中需要显示的是公式的过程,例如,单元格中显示5+9+3,表示一个单元格如何累加的过程,但同时又希望该单元格能直接参与运算,那么就可以用上述的批量自定义格式的方法来解决。

   当然,脚本还有一些其他很实用的用处,例如对工作表进行排序,快速行列转换,批量增加数据有效性,批量插入复选框,批量建立超链接等等。这些我之前都有发过相关的帖子,有兴趣的朋友可以搜索研究一下。
8楼
raulerini
后记:距离我上一次写脚本的帖子已经一年多了,这一年多以来,已经习惯打开的是2007或者2010的界面了。今天自己整理一下,发现原来脚本还真的这么好用。同时偶要感谢柳柳对偶滴鼓励和大力支持
9楼
君柳
脚本还可以批量修改超链接、批量。。用处大大的。10里没有脚本编辑器真有些郁闷呢
10楼
sjz76meizi
11楼
lrlxxqxa
小乐好强大,仰望
12楼
zzmxy
xml一直都是一个不敢接触的领域啊原来xml也不过如此~~~太给力了!
13楼
水星钓鱼
牛人。膜拜
14楼
ym_tang1225
太高深了
15楼
余方方

16楼
xpm130
仰望~~~
开眼界!!!



17楼
無心
收藏,学习
18楼
herelazy
真的很强大啊!
19楼
chenguanghui
还没有使用过脚本编辑器呢
20楼
い卋玑┾宝珼
太给力了,此帖必需MARK
21楼
小志就是我了
强大,学习了。
22楼
wise
重新翻开学习
23楼
yeminqiang


免责声明

有感于原ExcelTip.Net留存知识的价值及部分知识具有的时间限定性因素, 经与ExcelTip.Net站长Apolloh商议并征得其同意, 现将原属ExcelTip.Net的知识帖采集资料于本站点进行展示, 供有需要的人士查询使用,也慰缅曾经的论坛时代。 所示各个帖子的原作者如对版权有异议, 可与本人沟通提出,或于本站点留言,我们会尽快处理。 在此,感谢ExcelTip.Net站长Apolloh的支持,感谢本站点所有人**绿色风(QQ:79664738)**的支持与奉献,特此鸣谢!
------本人网名**KevinChengCW(QQ:1210618015)**原ExcelTip.Net总版主之一

评论列表
sitemap