chrisfang的Excel大全
  • Datedif函数全面解析及BUG分析

    2012-04-08

    以前发在EHblog的老博文,现在关闭了,准备陆陆续续搬迁一点过来。时间久了,有些文章也不一定保值了。

    DATEDIF函数是一个隐藏的日期函数,继承于Lotus 1-2-3。这个函数用于计算两个时间点之间的间隔,并且可以以“日”、“月”、“年”为单位计算间隔数。一般来说,用这个函数会比直接使用日期运算来的简单,但是这个函数并不是那么可靠,偶尔会犯点小毛病。所以就我本人来说,一般情况下都会用其他方式来替代实现它的功能。阅读本篇博文需要一定的函数公式理解能力,初学者慎入。

    ———————————————以下原文发表于2009-7-27———————————————

    从不同的角度来看,DATEDIF函数都是一个比较特殊的函数:
    1)在多个Excel版本中,DATEDIF函数都是隐藏函数,没有出现在函数列表中,Excel2007中的公式自动完成功能也不会自动生成这个函数名称,甚至在多个版本中的帮助文件中都找不到这个函数的踪影。
    2)在多个版本中,DATEDIF函数的算法发生了改变,据我目前所知,Excel2003 SP3、Excel2007 SP1、Excel2007 SP2 以及还未正式上市的Excel 2010中,这个函数的运算结果都有所不同。更早期的版本尚无研究。
    3)工作表函数DATEDIF与VBA中的函数Datediff也不相同。
    本文将主要以Excel 2007 SP2版本中的DATEDIF函数运算作为研究对象,并附上Excel 2003 SP3的相应结果作为参考。请使用正确的版本打开附件,否则将会出现不同的运算结果。

    Excel早期版本的帮助文件中,对DATEDIF函数的解释如下:

    DATEDIF(start_date,end_date,unit)
    参数start_date代表时间段内的第一个日期或起始日期。参数end_date代表时间段内的最后一个日期或结束日期。参数unit为所需信息的返回时间单位代码。各代码对应的含义如下:
    "Y"——时间段中的整年数。
    "M"——时间段中的整月数。
    "D"——时间段中的天数。
    "MD"——start_date与end_date日期中天数的差。忽略日期中的月和年。
    "YM"——start_date与end_date日期中月数的差。忽略日期中的日和年。
    "YD"——start_date与end_date日期中天数的差。忽略日期中的年。

    这6个unit参数看上去极其简单,无非就是年月日的差值运算,但其实里面包含了许多玄机,下面将针对这6种unit代码分别进行详解:
    以下假定start_date存放于A2单元格内,end_date存放于B2单元格内。

    1,=Datedif(A2,B2,"Y")

    此参数含义为返回时间段内的整年数,
    1)所谓“整年”的判断包含了两个日期值(m-d)的大小判断,假定A2与B2相差一年,如果B2的日期值小于A2的日期值,则不满一整年;如果B2的日期值大于等于A2的日期值,则可以记为一整年。
    2)对于包含闰年的情况,不影响日期值大小的判断,例如A2为闰年的2月29日,则B2为闰年的2月29日及以后或非闰年的3月1日及以后都可以判断为大于等于A2日期。

    综合以上算法解释,这个参数的算法可以表示为以下的公式:
    =YEAR(B2)-YEAR(A2)-1+(DATE(YEAR(B2),MONTH(A2),DAY(A2))<=B2)

    =YEAR(B2)-YEAR(A2)-1+(A2<=DATE(YEAR(A2),MONTH(B2),DAY(B2)))

    2,=Datedif(A2,B2,"M")

    此参数含义为返回时间段内的整月数,
    要判断整月数,也是与A2、B2的所在月份及日期相关。
    此参数的算法为:将B2、A2相减得到的天数记为Days1,从A2开始到B2的前一个月的所有月份的天数和值记为Days2,如果Days1大于等于Days2,则满足最后一个月的整月条件,否则则不足最后一个月的整月。
    换言之,使用此参数时,首先计算前后日期之间的差值,然后以起始月到(中止月-1)之间的整月天数作为计算“整月”的依据,差值大于或等于整月天数的,函数结果就是(中止月-起始月);如果差值小于整月天数,函数结果就是(中止月-起始月-1)。

    综合以上算法解释,这个参数的算法可以表示为以下的公式:
    =(YEAR(B2)-YEAR(A2))*12+MONTH(B2)-MONTH(A2)-(B2-A2<(TEXT(B2,"yyyy-m-1")-TEXT(A2,"yyyy-m-1")))*1

    关于此参数算法的讨论,可参考以前的一个老帖:http://club.excelhome.net/viewthread.php?tid=165589

    3,=Datedif(A2,B2,"D")

    此参数含义为返回时间段内的天数,
    这个参数算法最简单,实质就是两个Date相减得到的天数差,其算法可以表示为以下的公式:
    =B2-A2

    4,=Datedif(A2,B2,"MD")
    此参数含义为返回时间段内的天数,忽略月和年。
    虽然说“忽略”月和年,但实际上当B2的day小于A2的day时,两者的日期差为负数,需要借位相减才能得到正数。如何借位,向谁借位就涉及到了两个日期的所在月份及其年份。
    此参数算法包含以下几部分:
    1)当B2的day大于等于A2的day时,可直接将两者的day相减得到结果。
    例如A2为2003年3月4日,B2为2004年1月9日,其中的B2的day为9,A2的day为4,则函数结果为9-4=5。
    2)当B2的day小于A2的day时,以B2所在日期作为基准,将B2减去Date(B2所在年份、B2的前一个月份、A2的day)所得到的差值为结果。
    例如A2为2003年3月4日,B2为2004年2月3日,则将B2减去2004年1月4日的天数差作为函数结果。假如B2的月份为1月,则其前一个月份为前一年的12月。
    3)此参数在Excel 2007 SP2版本中包含bug,当满足上面第二个条件且B2日期为闰年的1月份日期时,函数结果会偏大164。这个bug在Excel2003 SP3版本中不存在,但在目前尚未发布的Excel 2010中仍有这个问题存在,只不过那个版本中的差值为113。这个莫名其妙的数值如何出现的,目前暂时没搞清楚。
    4)此参数包含的另一个问题可能不能算bug,但在各个版本中都存在,由于第二条算法的原因,当A2的day为29、30、31且B2的月份为3月份时,由于B2的前一个月份即2月份中没有29号、30号、31号,Date(B2所在年份、B2的前一个月份、A2的day)会由Excel自动将这样的date转换为3月1日、3月2日、3月3日,由此产生误差会出现0和负数。对于这样一个计算两个日期差的函数来说,出现负数好像有点不太合理。
    例如,A2日期为2003年5月31日,B2日期为2005年3月1日,date(2005,2,31)=2005年3月3日,因此B2与此日期相减得到结果为-2。
    基于第4点的问题,个人认为有以下两种算法可能会更合理一些:
    I)当day(B2)<day(A2)时,将B2与其当月1日相减+A2的月末与A2相减+1,用公式来表达就是:
    =IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),B2-TEXT(B2,"yyyy-m-1")+DATE(YEAR(A2),MONTH(A2)+1,1)-A2)
    II)当day(B2)<day(A2)时,将B2与Date(B2所在年份、B2的前一个月份、A2的day)相减,当差值小于零时取零作为结果。用公式来表达就是:
    =IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),MAX(B2-DATE(YEAR(B2),MONTH(B2)-1,DAY(A2)),0))
    当然,这两种方法只是本人的建议,仅供参考。

    综合以上算法解释,这个参数在不够减的时候借位是以B2为基准的,这个参数的算法可以表示为以下的公式:
    =IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),B2-DATE(YEAR(B2),MONTH(B2)-1,DAY(A2))+164*(TEXT(DATE(YEAR(B2),MONTH(B2)+1,29),"m-d")="2-29"))

    其中包含下划线的部分是对上面第三点中提到的闰年bug的模拟。如果要排除闰年的错误,则可以使用下面的公式:
    =IF(DAY(B2)-DAY(A2)>=0,DAY(B2)-DAY(A2),B2-DATE(YEAR(B2),MONTH(B2)-1,DAY(A2)))

    关于这个参数算法的讨论,还在这个帖子中进行过:http://club.excelhome.net/viewthread.php?tid=357741

    5,=Datedif(A2,B2,"YM")
    此参数含义为返回时间段内的整月数,忽略日和年。
    这里提到了“忽略”日,但实际与参数“M”一样,还是有关日期的相关计算。这个参数的算法实际上与参数“M”的算法一致,只是忽略其中年份差中所包含的月份数。

    其算法可以表示为以下的公式,其中引用了Datedif函数的“M”参数方便公式编写:
    =MOD(DATEDIF(A2,B2,"m"),12)

    6,=Datedif(A2,B2,"YD")
    此参数含义为返回时间段内的天数,忽略其中的年。
    这个参数的算法比较复杂,情况比较多,简单地说包括以下几个重点:
    1)当B2月份为3月份且B2的day大于等于A2的day时,两者相减是以A2的所在年份为基准的(如果够减,则以[A2的年份&B2的日期]与A2相减;如果不够减,则以[A2年份+1&B2的日期]与A2相减)
    2)当B2月份为3月份且B2的day小于A2的day时,两者相减是以B2的所在年份为基准的(如果够减,则以B2与[B2的年份&A2的日期]相减;如果不够减,则以B2与[B2年份-1&A2的日期]相减)
    3)当B2的月份不是3月份时,两者相减是以A2的所在年份为基准的,相减方式同第一条。
    4)当B2的day小于A2的day,且B2日期是闰年的1月份日期,且B2与A2日期不直接够减时,存在着与“MD”参数类似的闰年bug,函数结果偏大164。这个bug在Excel2003的SP3中不存在,但在Excel 2010中依旧存在,且差值变为113。

    综合以上算法解释,这个参数的算法可以表示为以下的公式(上面的文字不好理解,如果能看懂下面的公式则比较容易理解上述算法):
    =IF(--(TEXT(B2,"!0!0-m-d"))>=--(TEXT(A2,"!0!0-m-d")),IF((DAY(B2)<DAY(A2))*(MONTH(B2)=3),B2-DATE(YEAR(B2),MONTH(A2),DAY(A2)),DATE(YEAR(A2),MONTH(B2),DAY(B2))-A2),IF((DAY(B2)<DAY(A2))*(MONTH(B2)=3),B2-DATE(YEAR(B2)-1,MONTH(A2),DAY(A2)),DATE(YEAR(A2)+1,MONTH(B2),DAY(B2))-A2+164*(TEXT(DATE(YEAR(B2),MONTH(B2)+1,29),"m-d")="2-29")*(DAY(B2)<DAY(A2))))
    其中包含下划线的部分为闰年bug的模拟,如果希望排除闰年的错误,可以将这部分内容去除。
    以上分析了6个参数详细算法含义,由于无法得到详细的内部运算代码,因此以上分析结论全部来源于Datedif函数公式的黑箱测试。
    欢迎有兴趣的朋友继续测试和分析。以下提供附件(注意使用相应版本的Excel打开附件):

    附件1:Excel2007版(请用Excel 2007 SP2版本打开)

    微盘下载:http://vdisk.weibo.com/s/3Vh1l

    本地下载:Datedif函数测试2007版 (2031)
    附件2:Excel2003版,2003版中不含闰年bug,其余算法与2007类似(请用Excel 2003 SP3版本打开)

    微盘下载:http://vdisk.weibo.com/s/3Vh6m

    本地下载:Datedif函数测试2003版 (2066)

     

    作者: chrisfang | 分类: Excel函数公式 | 阅读: 9,897 次浏览 | Tags:
  • 你也许未曾见过这样的TEXT函数用法

    2012-04-08

    以前发在EHblog的老博文,现在关闭了,准备陆陆续续搬迁一点过来。时间久了,有些文章也不一定保值了。

     TEXT函数是一个通过自定义的文本格式,将数值或文本转换成另一个格式文本的函数。类似于编程语言中的Format函数。在微软的帮助中,有关TEXT函数的使用十分简单,它的主要格式代码基本与“自定义格式”中的代码无异。而我是第一个发现它能够在格式代码中结合变量来使用的人,因此就有了下面这篇博文。在这之后,TEXT函数的用途被大大扩展,成为最活跃的函数之一。

    ———————————————以下原文发表于2008-6-20———————————————

    不少朋友都会使用Text函数,它的用法在很多人看来就是自定义单元格格式的函数版。结合不同的格式代码及条件,可以让对象显示不同的格式效果。然而在我看来,Text函数的作用远不止如此,与自定义单元格格式的代码和功能相比,Text函数可以做的更多、走的更远。Text函数是Excel在字符处理函数中少有的几个具有丰富想像力的Excel函数之一。在某些情况下,Text函数还可以替换if函数、替代Choose函数,还可以生成内存数组。

    下面就跟随几个简单的例子,来看看Text函数究竟还能为我们做些什么。

    你也许未曾见过这样的TEXT函数用法

     详情请见附件

     附件下载:

    微盘下载:http://vdisk.weibo.com/s/3Ve2Y

    本地下载:你未曾见过的TEXT函数用法 (2219)

    作者: chrisfang | 分类: Excel函数公式 | 阅读: 5,218 次浏览 | Tags:
  • MMULT函数经典用法

    2012-04-08

    以前发在EHblog的老博文,现在关闭了,准备陆陆续续搬迁一点过来。时间久了,有些文章也不一定保值了。

    MMULT函数原是一个用于矩阵乘积运算的数学函数,相当专业,一般人不会去碰。但在Excel的实际应用中,我们很多时候会把它拿来作为条件统计公式的一部分。阅读本篇博文需要一定的函数公式理解能力,初学者慎入。

    ———————————————以下原文发表于2008-6-14———————————————

    Countif、Sumif、Subtotal等函数都是运用于条件求和、条件计数等统计需求的常用函数,但这些函数都要求其第一参数为单元格区域的直接引用。当问题比较复杂、统计条件比较多的情况下,有些时候就无法直接使用这些函数进行条件统计,而使用Mmult函数可以很好地替代这些函数,在复杂条件下的数组统计上进行运用。

    应该说,Mmult函数是数组条件统计的一大利器,用好Mmult函数可以简化许多复杂问题的公式解决方案。

    论坛上之前也有一些针对Mmult函数的介绍和讲解专帖,本帖中不再对Mmult的原理进行过多的介绍,而是着重结合具体问题如何使用Mmult函数进行一些详细的分解。

    下面的这个附件以一些简化的案例模型来针对Mmult的不同使用方法进行了一些探讨,同时也引用了一些论坛上已有的具体案例,希望可以给大家提供一些参考意见,同时也欢迎大家参与讨论。

    MMULT函数经典用法

    详情请见附件

    附件下载:

    作者: chrisfang | 分类: Excel函数公式 | 阅读: 7,807 次浏览 | Tags:
  • 【调色板】PPT版使用说明

    2012-03-03

    【调色板】加载宏,是一款使用Xcelsius水晶易表结合VBA所开发的加载宏,适用于2003~2010版PPT。可以用于PPT中的颜色自定义,可以对文本框、图形、表格、SmartArt、艺术字等多种对象的填充色、字体颜色、线条色(边框色)进行所见即所得的即时设置,并且提供了渐变色系等强大的辅助配色功能。

    此版本为PPT版本,专为PPT所用,Excel版本的可以参见这里:《【调色板】使用说明【调色板】PPT版使用说明

    对比PPT系统本身自带的色板来说,这款工具的主要优势在于:

    1,操作步骤简化。

    不需要选定对象以后再去分别查找不同的菜单命令和选项,设置不同的参数。最简单的情况下只需要一个按键就可以完成不同对象的色彩设置需求。

    2,所见即所得。

    系统自带的色板中,要使用“主题颜色”和“标准颜色”以外的“其他颜色”时,需要打开配色面板,所选择的颜色不能即时反映到表格对象中。而使用本工具所有设置颜色的过程中,都可以即时反映到表格对象上。

    3,辅助配色。

    这款工具携带了高度自由的RGB和HSB两种模式的滑块式调色功能,除此以外还提供了【渐变色】体系的辅助色系供用户选择使用。用户不需要掌握更多的配色知识就能直接运用到工具中所提供的便捷的辅助配色。

     【开发特点】: 

           这款工具使用了水晶易表的建模和控件所生成的Flash文件作为PPT加载宏的界面和功能载体。最后由VBA完成组装和功能调用。整个工具的大部分开发过程都是通过水晶易表中的函数公式所完成,只在最后的PPT加载调用时使用了少量的代码。并且其中的Flash模块可以分离出来作为其他软件的独立功能模块。

            这是一个水晶易表制作的Flash与PPT的完美结合,充分利用了水晶易表在交互界面上的美观优势、模块逻辑设计上的简单易行。最后再结合VBA的强大综合能力。整个设计开发过程大大降低了开发者的门槛和难度。

    【最新版本】:V3.0

    【更新历史】:

              Excel版本中包含了v1.0和v2.0版,PPT版本直接从Excel的v3.0版开始移植
             

    V3.0:发布日期2012年3月5日

    1,基准色选择

    2,RGB和HSB滑块调节

    3,【渐变色】系选择,包括相邻色、深浅色、明暗色。

    4,填充色、文字色和线条色三种对象选择

    5,支持文本框(包括占位符)、图形、SmartArt、艺术字、表格等对象,暂不支持图表等嵌入对象

    6,中英文菜单选择

    7,在线帮助

     

    【使用前的设置】:

    本程序是加载宏,需要在PPT程序中安装加载,具体操作方法可参考(方法不复杂,两步就完成):

    加载宏(Addin)使用方法

    2007和2010版的用户可以加载使用《调色板v3.0_for2003》,也可以使用专为07和10版设计的《调色板v3.0_for2007&2010》。

    本插件调用了Flash模块,需要系统中支持Flash,通常情况下您的系统如果能够正常显示网页动画,一般都已经包含了Flash播放器插件。但如果您的系统中没有包含这部分功能,则会影响到此工具的正常运作(无法加载显示)。如果要添加Flash播放器,可联机到Adobe的官方站点中下载安装:

    http://get.adobe.com/cn/flashplayer/

    由于Flash安全设置方面的原因,初次运行本插件时有可能出现错误,请关闭Excel程序后重新打开再尝试。在某些情况下,插件使用时如果提示“无法访问外部数据”的错误,可以照错误提示中的方法进行设置,

    也可以点击运行这个文件包当中的“Flash安全配置”批处理文件。

     

    【程序使用说明】:

    以PPT2010版本为例,在正确加载此插件以后,会在PPT功能区中出现【调色板】选项卡(2007版也会显示此选项卡,2003版不会显示图标,但会在工具栏中显示菜单),显示如下:

    【调色板】PPT版使用说明

    在【调色板】选项卡中点击【我的调色板】命令按钮以后就会出现上图中的面板。
    在面板中主要包含这几部分功能模块:
    【菜单语言选择】:可以选择英文或中文菜单显示,流行语谓之:与国际接轨

    【调色板】使用说明

    【基准色选择】:可以在12种基准色(包括黑色和白色)当中直接选择。这12种基准色是在Excel色板中和许多其他软件中常见的标准颜色。这是一个滑动展示框,鼠标向左右两侧边缘移动时会自动显示更多的按钮。在这里选择某个颜色以后,下方的大正方形色块中就会显示当前选中的颜色,并且根据【选择对象】的类型,与当前Excel表格中所选取的对象匹配其颜色属性。

    【调色板】使用说明

    例如,假定当前【选择对象】的选项按钮中选中了【填充色】,而当前表格中所选取的是A1单元格,那么每次选择不同的基准色块,就会改变A1单元格的背景颜色。

    【调色板】使用说明

     在这里特别需要注意的是:这个工具应用颜色的激活标志是大正方形中的颜色是否发生改变,如果前一次所选择的色块和这一次所选择的是相同颜色,大正方形中的颜色没有发生丝毫变化,这样就不会把这个颜色应用到当前选中的对象中。因此,如果要对两个不同的对象分两次应用相同的颜色,在后一次操作前,需要先更改一下所选择的颜色(也可以调节下方的滑动块),使得正方形中的颜色发生改变。

    【RGB调节】和【HSB调节】:在选项按钮中选中【RGB】的前提下,可以通过RGB滑块来自定义颜色。RGB是常用的红绿蓝三色分量模式,可以把一种颜色通过这三种分量的含量多少来表示。可以通过RGB三个分量滑块的调节来改变颜色,改变的范围在0~255之间。在调节滑块的同时,大正方形色块中会即时显示配色结果,并会直接应用在当前表格中所选中的对象上。

    【调色板】使用说明

    在RGB选项选中的时候,更改下方的HSB滑块不会产生直接变化,此时的HSB滑块是被锁定的。

    在选项按钮中选中【HSB】的前提下,才能通过HSB模式来调整自定义颜色。HSB是通过色调、饱和度和明度三种维度来描述色彩的一种方式。其中色调的数值范围在0~360之间,饱和度和明度的数值都在0~100之间,表示程度的百分比。通过HSB的调节,可以很方便地得到相邻色和深浅、明暗程度比较接近的各种不同色阶的色彩。

    【渐变色】:渐变色是本工具提供的一个智能辅助功能,可以帮助用户自动生成与当前选中的颜色相匹配的近似颜色。其中包括三种模式:相邻色、深浅色和明暗色。以及可以设置渐变强度大小的滑块(强—弱)。

    <相邻色>表示左右两侧的颜色是与中间色块在色相上处于相邻位置。例如下图所示:  

    【调色板】使用说明

     所谓色相的位置,可以参考下面的色相环图片:

    【调色板】使用说明

    <深浅色>表示通过增减饱和度分量来取得基色的不同演变色,在视觉上可以呈现不同深浅程度的效果。例如下图所示:

    【调色板】使用说明

    <明暗色>表示通过增减明度分量来取得基色的不同演变色,在视觉上可以呈现出不同明暗程度的效果。例如下图所示:

    【调色板】使用说明

    右上方的【强—弱】滑块可以调节渐变的强度,弱表示渐变的变化间隔较微弱,而强则表示渐变颜色的变化比较强烈。

    需要注意的是:在渐变色中,每点击选择一次色块,只要与前一次所选择的颜色有差别,就会改变大正方形中的显示颜色,同时影响表格中的选择对象,与此同时,渐变色色块本身也会同时发生变化,它会智能地反映当前选中颜色的相关渐变色(当前选中颜色始终位于中间第四个色块中)。因此假设你要依次选取某一个颜色的每一个相邻的色阶,你就需要每次都点击其中的第三个或第五个色块。

    如果将渐变色与下方的HSB手动调节滑块相互配合,还能玩出更多花样:

    渐变中选相邻色,下方调节饱和度或明度;渐变中选深浅色,下方调节色调或明度;渐变中选明暗色,下方调节色调或饱和度。这样就可以显现多种元素的叠加,形成更多色阶。

    【程序下载】:

    华为网盘下载:http://dl.dbank.com/s02vj21t3o

    本地下载:调色板v3.0forPPT (2221)

    【操作演示视频】:

    http://www.56.com/u25/v_NjY2NzExOTA.html

          

    作者: chrisfang | 分类: PPTVBA程序 | 阅读: 7,596 次浏览 | Tags:
  • 【调色板】使用说明

    2012-03-01

    【调色板】加载宏,是一款使用Xcelsius水晶易表结合ExcelVBA所开发的加载宏,适用于2003~2010版。可以用于Excel中的颜色自定义,可以对单元格、图形、图表等多种对象的填充色、字体颜色、线条色(边框色)进行所见即所得的即时设置,并且提供了渐变色系等强大的辅助配色功能。

    此版本为Excel版本,专为Excel所用,如需PPT版本可点击这里:《【调色板】PPT版使用说明

    【调色板】使用说明

    对比Excel系统本身自带的色板来说,这款工具的主要优势在于:

    1,操作步骤简化。

    不需要选定对象以后再去分别查找不同的菜单命令和选项,设置不同的参数。最简单的情况下只需要一个按键就可以完成不同对象的色彩设置需求。
    2,所见即所得。

    系统自带的色板中,要使用“主题颜色”和“标准颜色”以外的“其他颜色”时,需要打开配色面板,所选择的颜色不能即时反映到表格对象中。而使用本工具所有设置颜色的过程中,都可以即时反映到表格对象上。
    3,辅助配色。

    这款工具携带了高度自由的RGB和HSB两种模式的滑块式调色功能,除此以外还提供了【渐变色】体系的辅助色系供用户选择使用。用户不需要掌握更多的配色知识就能直接运用到工具中所提供的便捷的辅助配色。

    【开发特点】:

    这款工具使用了水晶易表的建模和控件所生成的Flash文件作为Excel加载宏的界面和功能载体。最后由VBA完成组装和功能调用。整个工具的大部分开发过程都是通过水晶易表中的函数公式所完成,只在最后的Excel加载调用时使用了少量的代码。并且其中的Flash模块可以分离出来作为其他软件的独立功能模块。
    这是一个水晶易表制作的Flash与Excel的完美结合,充分利用了水晶易表在交互界面上的美观优势、模块逻辑设计上的简单易行。最后再结合ExcelVBA的强大综合能力。整个设计开发过程大大降低了开发者的门槛和难度。

    【最新版本】:V3.0

    【更新历史】:
    V1.0:内部测试版本
    V2.0:发布日期2012年2月27日
    1,基准色选择
    2,RGB和HSB滑块调节
    3,填充色、文字色和线条色三种对象选择
    4,中英文菜单选择
    2.0版界面图如下:

    【调色板】使用说明

    V3.0:发布日期2012年3月1日
    1,增加【渐变色】系选择,包括相邻色、深浅色、明暗色。
    2,增加在线帮助
    3,单独制作了2007和2010版的加载宏,可以生成独立的Excel选项卡菜单

    【使用前的设置】:

    本程序是加载宏,需要在Excel程序中安装加载,具体操作方法可参考(方法不复杂,两步就完成):《加载宏(Addin)使用方法
    2007和2010版的用户可以加载使用《调色板v3.0_for2003》,也可以使用专为07和10版设计的《调色板v3.0_for2007&2010》。如果你之前使用过2.0版,建议先行卸载,以免出现冲突。

    本插件调用了Flash模块,需要系统中支持Flash,通常情况下您的系统如果能够正常显示网页动画,一般都已经包含了Flash播放器插件。但如果您的系统中没有包含这部分功能,则会影响到此工具的正常运作(无法加载显示)。如果要添加Flash播放器,可联机到Adobe的官方站点中下载安装:http://get.adobe.com/cn/flashplayer/

    由于Flash安全设置方面的原因,初次运行本插件时有可能出现错误,请关闭Excel程序后重新打开再尝试。在某些情况下,插件使用时如果提示“无法访问外部数据”的错误,可以照错误提示中的方法进行设置,也可以点击运行这个文件包当中的“Flash安全配置”批处理文件。

    【程序使用说明】:

    以Excel2010版本为例,在正确加载此插件以后,会在Excel功能区中出现【调色板】选项卡,显示如下:

    【调色板】使用说明

    在【调色板】选项卡中点击【我的调色板】命令按钮以后就会出现上图中的面板。
    在面板中主要包含这几部分功能模块:
    【菜单语言选择】:可以选择英文或中文菜单显示,流行语谓之:与国际接轨

    【调色板】使用说明

    【基准色选择】:可以在12种基准色(包括黑色和白色)当中直接选择。这12种基准色是在Excel色板中和许多其他软件中常见的标准颜色。这是一个滑动展示框,鼠标向左右两侧边缘移动时会自动显示更多的按钮。在这里选择某个颜色以后,下方的大正方形色块中就会显示当前选中的颜色,并且根据【选择对象】的类型,与当前Excel表格中所选取的对象匹配其颜色属性。

    【调色板】使用说明

    例如,假定当前【选择对象】的选项按钮中选中了【填充色】,而当前表格中所选取的是A1单元格,那么每次选择不同的基准色块,就会改变A1单元格的背景颜色。

    【调色板】使用说明

    在这里特别需要注意的是:这个工具应用颜色的激活标志是大正方形中的颜色是否发生改变,如果前一次所选择的色块和这一次所选择的是相同颜色,大正方形中的颜色没有发生丝毫变化,这样就不会把这个颜色应用到当前选中的对象中。因此,如果要对两个不同的对象分两次应用相同的颜色,在后一次操作前,需要先更改一下所选择的颜色(也可以调节下方的滑动块),使得正方形中的颜色发生改变。

    【RGB调节】和【HSB调节】:在选项按钮中选中【RGB】的前提下,可以通过RGB滑块来自定义颜色。RGB是常用的红绿蓝三色分量模式,可以把一种颜色通过这三种分量的含量多少来表示。可以通过RGB三个分量滑块的调节来改变颜色,改变的范围在0~255之间。在调节滑块的同时,大正方形色块中会即时显示配色结果,并会直接应用在当前表格中所选中的对象上。        

    【调色板】使用说明

     在RGB选项选中的时候,更改下方的HSB滑块不会产生直接变化,此时的HSB滑块是被锁定的。

    在选项按钮中选中【HSB】的前提下,才能通过HSB模式来调整自定义颜色。HSB是通过色调、饱和度和明度三种维度来描述色彩的一种方式。其中色调的数值范围在0~360之间,饱和度和明度的数值都在0~100之间,表示程度的百分比。通过HSB的调节,可以很方便地得到相邻色和深浅、明暗程度比较接近的各种不同色阶的色彩。

    【渐变色】:渐变色是本工具提供的一个智能辅助功能,可以帮助用户自动生成与当前选中的颜色相匹配的近似颜色。其中包括三种模式:相邻色、深浅色和明暗色。以及可以设置渐变强度大小的滑块(强—弱)。

    <相邻色>表示左右两侧的颜色是与中间色块在色相上处于相邻位置。例如下图所示:

    【调色板】使用说明

    所谓色相的位置,可以参考下面的色相环图片:

    【调色板】使用说明

    <深浅色>表示通过增减饱和度分量来取得基色的不同演变色,在视觉上可以呈现不同深浅程度的效果。例如下图所示:

    【调色板】使用说明

    <明暗色>表示通过增减明度分量来取得基色的不同演变色,在视觉上可以呈现出不同明暗程度的效果。例如下图所示:

    【调色板】使用说明

    右上方的【强—弱】滑块可以调节渐变的强度,弱表示渐变的变化间隔较微弱,而强则表示渐变颜色的变化比较强烈。

    需要注意的是:在渐变色中,每点击选择一次色块,只要与前一次所选择的颜色有差别,就会改变大正方形中的显示颜色,同时影响表格中的选择对象,与此同时,渐变色色块本身也会同时发生变化,它会智能地反映当前选中颜色的相关渐变色(当前选中颜色始终位于中间第四个色块中)。因此假设你要依次选取某一个颜色的每一个相邻的色阶,你就需要每次都点击其中的第三个或第五个色块。

    如果将渐变色与下方的HSB手动调节滑块相互配合,还能玩出更多花样:

    渐变中选相邻色,下方调节饱和度或明度;渐变中选深浅色,下方调节色调或明度;渐变中选明暗色,下方调节色调或饱和度。这样就可以显现多种元素的叠加,形成更多色阶。

    【程序下载】:

    新浪微盘下载:http://vdisk.weibo.com/s/2T12M/1330589639

    本地下载:调色板Excel版 (2173)

    【操作演示视频】:

    http://www.56.com/u38/v_NjY2MDI2NTE.html

           

    作者: chrisfang | 分类: ExcelVBA程序 | 阅读: 7,599 次浏览 | Tags:
  • 【中文语义分词工具】小程序

    2012-02-09

    中文语义分词工具

    效果图:

    中文分词 (Chinese Word Segmentation) 指的是将一个汉字序列切分成一个一个单独的词。分词就是将连续的字序列按照一定的规范重新组合成词序列的过程。我们知道,在英文的行文中,单词之间是以空格作为自然分界符的,而中文只是字、句和段能通过明显的分界符来简单划界,唯独词没有一个形式上的分界符,虽然英文也同样存在短语的划分问题,不过在词这一层上,中文比之英文要复杂的多、困难的多。

    阅读全文 »

    作者: chrisfang | 分类: ExcelVBA程序 | 阅读: 12,969 次浏览 | Tags:
  • VBA中实现数组排序的多种方法

    2012-01-18

    VBA里面没有现成的Sort方法可以使用,在ExcelVBA里面要对数组进行排序,现有的通常做法:
    1,通过单元格赋值以后利用工作表里的Sort方法进行排序,
    2,通过SQL实现,也需要调用单元格区域存放数据,
    3,直接写循环语句通过算法来实现。

    除了上述方法以外,借助一些其他语言工具与VBA相结合,也能利用现成的排序功能来实现数组排序,而不需要借助表格。
    例如JavaScript:

    JavaScript里面也有Sort方法,可以拿来现成使用,示例代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Sub 文本升序()
    Set js = CreateObject("msscriptcontrol.scriptcontrol")
    js.Language = "javascript"
    arr = Application.Transpose(Range("A1:A10"))
    temp = Join(arr, ",")
    js.addcode "function aa(bb){js=bb.split(',');js.sort();return js;}"
    sortarr = js.eval_r("aa('" &amp; temp &amp; "')")
    Debug.Print sortarr
    End Sub

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Sub 文本降序()
    Set js = CreateObject("msscriptcontrol.scriptcontrol")
    js.Language = "javascript"
    arr = Application.Transpose(Range("A1:A10"))
    temp = Join(arr, ",")
    js.addcode "function aa(bb){js=bb.split(',');js.sort();js.reverse();return js;}"
    sortarr = js.eval_r("aa('" &amp; temp &amp; "')")
    Debug.Print sortarr
    End Sub

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Sub 数值升序()
    Set js = CreateObject("msscriptcontrol.scriptcontrol")
    js.Language = "javascript"
    arr = Application.Transpose(Range("A1:A10"))
    temp = Join(arr, ",")
    js.addcode "function aa(bb){js=bb.split(',');js.sort(function(a,b){return a-b;});return js;}"
    sortarr = js.eval_r("aa('" &amp; temp &amp; "')")
    Debug.Print sortarr
    End Sub

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Sub 数值降序()
    Set js = CreateObject("msscriptcontrol.scriptcontrol")
    js.Language = "javascript"
    arr = Application.Transpose(Range("A1:A10"))
    temp = Join(arr, ",")
    js.addcode "function aa(bb){js=bb.split(',');js.sort(function(a,b){return a-b;});js.reverse();return js;}"
    sortarr = js.eval_r("aa('" &amp; temp &amp; "')")
    Debug.Print sortarr
    End Sub

     

    .NET里面有SortedList类也可以用来实现排序,但需要系统支持Framework

     

    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    Sub Sortlist()
    Set objSortedlist = CreateObject("System.Collections.Sortedlist")
    For i = 1 To 10
    objSortedlist.Add Range("A" &amp; i).Value, Range("A" &amp; i).Value
    Next i
    For i = 0 To objSortedlist.Count - 1
    Debug.Print objSortedlist.GetKey(i)
    Next
    End Sub

     
    除了SortedList类,还有ArrayList也可以用

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    
    Sub Arraylist()
    Set objArrayList = CreateObject("System.Collections.ArrayList")
    For i = 1 To 10
    objArrayList.Add Range("A" &amp; i).Value
    Next i
    objArrayList.Sort
    For i = 0 To objArrayList.Count - 1
    Debug.Print objArrayList(i)
    Next
    End Sub

     
    还有其他什么好方法,欢迎大家支招。

    作者: chrisfang | 分类: ExcelVBA程序 | 阅读: 10,977 次浏览 | Tags:
  • 【天气预报】小程序

    2012-01-10

    Excel版的天气预报软件,通过网络查询国内主要城市的最近两天内天气预报。用户只需要输入中文的城市名称,然后点击按钮就可以实时显示天气预报信息。天气类型会显示图标,气温会显示在温度计上,风向和风力会显示在指南针罗盘上。如果在需要输入的城市名称单元格处留空,则程序会自动判断用户所在城市,查询显示当地的天气预报。

    天气预报数据来源自中国天气网www.weather.com.cn

    此程序需要联网,需要启用宏。建议使用2007以上版本打开。

    【天气预报】小程序

     

    程序下载:

    华为网盘下载:http://dl.dbank.com/s0t7b3vike

    本地下载:天气预报工具 (2047)

    作者: chrisfang | 分类: ExcelVBA程序 | 阅读: 5,008 次浏览 | Tags:
  • 【汉字转拼音、翻译&朗读】小程序

    2012-01-10

    Excel当中没有现成的取得汉字拼音的功能,有方法可以通过一个辅助列表来用公式取得汉字的拼音首字母,如果要取得拼音全拼,就需要一张很庞大的辅助表来完成。

    现在利用网络资源,用ExcelVBA简单做了一个汉字转拼音的小程序,同时包含了汉译英和中英文朗读功能(需要计算机系统中相应语音引擎的安装),是一个适合双语教学的小工具。其中翻译结果和汉字拼音均来源于网络资源,不支持多音字的识别,仅供参考。

    此程序需要联网,需要启用宏

    【汉字转拼音、翻译&朗读】小程序

    程序下载:

    华为网盘下载:http://dl.dbank.com/s03t785p77

    本地下载:拼音翻译和朗读工具 (2024)

    作者: chrisfang | 分类: ExcelVBA程序 | 阅读: 5,157 次浏览 | Tags:
  • 【自动批量贴图】小程序

    2012-01-10

    ExcelVBA程序,自动化的贴图小程序,可以自动批量在Excel表格单元格中插入图片,并且自动适应单元格的大小。贴图后可以根据条件进行图片筛选。如果需要支持图片排序,需要修改部分代码。需要启用宏,适用2003~2010版。

    【自动批量贴图】小程序

    代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    
    Sub addpic()
    i = 2
    Do While Range("A" &amp; i) &lt;&gt; ""
    Range("B" &amp; i).Select
    Set mypic = ActiveSheet.Pictures.Insert(ThisWorkbook.Path &amp; "" &amp; Range("A" &amp; i) &amp; ".jpg")
    With mypic
    .ShapeRange.LockAspectRatio = msoFalse
    .Top = Range("B" &amp; i).Top
    .Left = Range("B" &amp; i).Left
    .Height = Range("B" &amp; i).Height
    '如果要支持排序,可改为 .Height = Range("B" &amp; i).Height - 1
    .Width = Range("B" &amp; i).Width
    '如果要支持排序,可改为 .Width = Range("B" &amp; i).Width - 1
    .Placement = xlMoveAndSize
    End With
    i = i + 1
    Loop
    Set mypic = Nothing
    End Sub

     

    有条件的可以自己改造更适合自身情况的代码。

    程序下载:

    华为网盘下载:http://dl.dbank.com/s0tebaam8u

    本地下载:批量贴图工具 (1902)

    作者: chrisfang | 分类: ExcelVBA程序 | 阅读: 6,184 次浏览 | Tags: