财务工作常用Excel公式集锦及解析
本帖最后由 84577 于 2016-9-9 15:47 编辑

第一季 科目余额表及明细账常用公式

一、按科目级次筛选

需求背景

在财务日常工作中,经常需要将科目余额表或其他代码按层级进行筛选,比如筛选出总账科目、筛选出二级科目。

解决方案

由于科目代码的格式都是固定的,比如总账4个字符长度,二级7个字符长度。因而,这个需求实际上就是按字符个数筛选。我们通常是用LEN函数构造辅助列计算字符个数,再对辅助列进行筛选。实际上一个小技巧就可帮助我们轻松按字符个数筛选:

选中表格,然后点击自动筛选,再在筛选搜索框中输入“????”(英文半角状态下输入),即可筛选出4个字符长度的记录。要筛选其他长度的记录,以此类推。

具体操作详见操作演示

知识点解释

“?”是通配符,代表单个字符。所以在筛选搜索框里输入几个问号就代表筛选几个字符的记录,对字母、汉字、数字、字符均有效。我们将此知识点进一步拓展,可以按字符个数求和,比如对所有总账科目(字符长度为四个)进行求和的公式:

=SUMIF(A2:A22,"????",C2:C22)

二、判断科目是否为最末级

需求背景

日常工作中我们将科目余额表导出,通常包含了第一级到最后一级,要分别筛选总账科目、二级科目等可以使用前文中的技巧,那如果要筛选或标注出最末级科目,该怎么办呢?

解决方案

可以使用辅助列法。辅助列可以化繁为简。先使用公式判断是否为最末级,然后筛选出该辅助列为“最末级“的记录行,公式如下:

=IF(LEN(A2)>=LEN(A3),"最末级",“”)

知识点解释

在《“偷懒的技术:打造财务Excel达人》中说过“要设计一套功能强大的财务工作表,更需要的是表格设计过程中的逻辑思维和函数的拓展应用能力”,在编写公式前,先不要忙着琢磨用什么函数,而应该分析数据的规律,总结出规律后,再编写公式。粗一看,要判断科目是否为最末级,感觉无从下手,但是我们分析一下科目余额表就可发现,同一个总账科目下越是明细级的科目,其代码越长(废话,这个财务人都知道)。也就是说,如果用本行的科目代码字符数与下一行的相比,如果字符数与下一行相等(同级)或比它多(更明细级),它就是最末级的(前提条件是科目余额表要按科目先后顺序排列)。

说明:本案例如果使用高级筛选,在F2单元格输入筛选条件公式

=LEN(A2)>=LEN(A3),再以其为条件筛选,可筛选出大部分符合条件的记录。由于条件公式中的A3按要求应该为$A$3,但是如果写成这样,就与需求不符了,故写成A3,这样一来就不符合高级筛选“条件公式中除记录的第一行外的所有其他引用要求是绝对引用”这一条件,因而最后一行未筛选出,存在小小的瑕疵,因而不适合使用高级筛选。

三、分离科目代码和科目名称

需求背景:

某些财务软件导出的科目余额表中是“1122.01.898偷懒的技术“这样的格式,需要将代码和名称分离,或者遇到不规范的数据,如人名与手机号“龙逸凡18X12345678”,需要将数字和汉字分离为二列。

解决方案

如果科目代码长度一致,或者代码和名字中有某个固定分隔符,则可使用“分列”功能来分离科目代码和名称,如果没有,则需要使用下面的公式:

取科目代码=LEFT(A2,2*LEN(A2)-LENB(A2))

取科目名称=RIGHT(A2,LENB(A2)-LEN(A2))

这个公式不太完善,当名称中有字母或数字时,则公式结果会出错,比如B16、B17单元格,这种情况下提取科目代码需使用下面的数组公式:

=LEFT(A2,MIN(IF(MID(A2,ROW($1: $99),1)>="a",ROW($1: $99),99))-1)

输入完后需要同时按Ctrl+Shift+Enter三键输入

如果电脑上安装了Excel2013以后的版本,也可使用快速填充,具体操作详见下面的操作演示:

知识点解释

第一个公式中的Len函数:计算字符数。LENB函数:计算字节数,一个汉字为二个字节。所以可以用LENB-LEN计算字符串中汉字的个数。由于公式是根据汉字个数来分离数字和汉字,所以,当名称中包含字母或数字,以及数字和汉字相互夹杂时,公式提取的结果就不符合要求。

第二个公式的设计思路是逐个截取字符串中的每一个字符,判断其是否为字母或汉字,即是否为”a”之后的字符(在Excel里,如按升序排列,则字母在数字后,汉字在字母后,也就是1→9→a→z→吖(ā)→酢(zuò),这也是它们的大小顺序)。

公式使用ROW($1: $99)生成1到99的常量数组,写成99只是为了保证大于等于字符串的长度,根据实际情况也可改成50,30等。

MID(A2,ROW($1: $99),1)是依次截止A2单元格的第1个,第2个。。。第99个。截取出的字符如果是字母或汉字,则给其字符所在位置的顺序号,否则,给它的顺序号是99。再用MIN函数来提取第一个字母、汉字的位置。最后用LEFT来截取左边的数字和字符组成的代码。

同理,如果要提取科目名称,用下列公式即可(别忘了最后用三键输入):

=RIGHT(A2,LEN(A2)-MIN(IF(MID(A2,ROW($1: $99),1)>="a",ROW($1: $99),99))+1)

当然,使用上述公司还得有个前提,即避免分录名称的第一个字为数字,比如“1小组”、“2车间”等等,而应采用“一小组”、“二车间”的命名方式。

四、填写完整的科目名称

需求背景:

财务软件导出的科目余额表为了简洁,在科目名称列,只保留了本级科目的名称,本级之前的名称都没保留,这么做的弊端是筛选时无法根据名称来筛选本科目下某个级次科目,并且当明细科目较多,而我们记不住科目代码时,无法知晓其总账科目是什么。

解决方法

用公式写出完整科目名称。在C2单元格编制下面的公式:

=IFNA(VLOOKUP(LEFT(A2,-LOOKUP(0,1-FIND(".",A2,ROW($1: $20)))),A$1:C1,3,)&"-"&B2,B2)

然后下拉填充即可。

知识点解释:

这个公式很经典,有二个关键思路,1、找出某符号最后一个的位置。2、利用前面行公式的计算结果。

ROW($1: $20)生成1到20的常量数组(假设代码长度都在20以内)。

FIND(".",A2,ROW($1: $20))依次从第1位、第2位…第20位开始查找"."符号。如果没有查找到则出错。此公式将生成一个由错误值及"."所在位置组成的序列。

1-FIND(".",A2,ROW($1: $20))将生成错误值与0,-1,-2….组成的序列。

-LOOKUP(0,1-FIND(".",A2,ROW($1: $20)))此公式在序列中查找0,根据其查找原理将返回最后一个"."前面那个字符的位置。如果对这点还是不太理解,请阅读《深入理解LOOKUP:LOOKUP函数的查找原理》、《公式-LOOKUP(1,-LEFT(A1,ROW($1: $10)))详解》。

五、取会计科目的最末级科目名称

需求背景

财务工作中有时候需要做前面“填写完整的科目名称“的逆向操作,在完整会计科目中取最末级科目的名称,类似的需求还有取物料代码1.01.15.38189的最后一节。

解决方案

编制下面的公式

=IFNA(RIGHT(B2,LEN(B2)+LOOKUP(0,-FIND("-",B2,ROW($1: $22)))),B2)

当然,这里我们也可使用“快速填充”功能来提取最末级科目。

知识点解释

关于此公式的解释参见前文。

六、将上面行的科目代码及科目名称往下填充

需求背景

某些财务软件批量导出多个科目的明细账时,只有科目的第一行显示了科目代码和本级明细科目的名称,无法进行正确筛选,当该科目明细账较多时,也影响阅读。

解决方法

将本科目第一行的科目代码和科目名称填充到本明细科目下所有的空白单元格。

选定所有明细账的第一行到最后一行A1:B22单元格区域,按F5调出定位对话框,点击“定位条件”,然后双击“空值”选项(直接双击某选项,等同于点选后该选项再去点“确定”),即可选定A1:B22区域中所有的空白单元格。此时,请勿点击鼠标。直接键入“=A3”(或键入=号后,按一下向上的箭头),然后按住ctrl不放,敲击Enter,即可在所有空白单元格键入公式。

具体操作见下面的操作演示

知识点解释

F5功能键在Excel中是定位功能的快捷键,定位功能是精确制导的武器,它可根据单元格的属性来选择单元格。常用于选择数字单元格、公式单元格、空白单元格、没有隐藏的单元格。

公式“=A1“中A1的引用类型是相对引用,将公式填充到其他单元格时,公式中的A1会自动根据所在位置变更为相应的单元格,比如B3单元格公式会变成“=B2”,A4单元格公式会自动变动“=A3”。关于定位功能和单元格的引用类型的详细介绍及更多精彩应用请参阅《“偷懒”的技术:打造财务Excel达人》。

七、筛选包含某科目的凭证

需求背景

有时候为了操作方便,我们将凭证序时簿导出为Excel,但Excel中筛选时无法象财务软件一样根据某会计科目按凭证进行查询筛选,只能按分录筛选。

解决方案

使用辅助列,在I5单元格编制下面的公式,下拉填充,然后筛选出值为指定会计科目的行。

=IF(D7<>D6,VLOOKUP($B$1&"*",OFFSET(F7,0,0,COUNTIF(D7: $D$301,D7),1),1,0),I6)

知识点解释

首先判断本行是否为本张凭证的第一行[D7<>D6],如果是,则用VLOOKUP查找出本张凭证中[OFFSET(F5,0,0,COUNTIF(D5: $D$301,D5),1)]以B1单元格开头[$B$1&"*"]的会计科目。

如果要查找包含B1单元格会计科目的凭证,则将查找目标改为["*"&$B$1&"*"]

为了表格美观,增加一个消除错误函数IFNA(限于Excel2013及Excel2016版)或IFERROR,将上面各组成部分合并后完整的公式如下:

=IF(D5<>D4,IFNA(VLOOKUP($B$1&"*",OFFSET(F5,0,0,COUNTIF(D5: $D$301,D5),1),1,0),""),I4)


资料来源:中国会计视野

打赏 收起
参与人数 2K币 +3 理由
许兵 +2 很给力!
lyd_234 +1

查看全部打赏

举报 分享到:

    全部回复

  • 150xxxx7063 略有小成 沙发
    发表于 2016-09-12 09:24:53 显示全部楼层
    学习学习!
  • 159xxxx0013 驾轻就熟 板凳
    发表于 2016-09-12 17:13:00 显示全部楼层
    学习了......
  • 18239603252 登堂入室 地板
    发表于 2016-09-12 17:23:21 显示全部楼层
    学习学习
  • jugelizi 初来乍到 5
    发表于 2016-09-14 11:49:18 显示全部楼层
    不错
  • dzt0330 略有小成 6
    发表于 2016-09-14 12:43:44 来自手机 显示全部楼层
    实用
  • dzt0330 略有小成 7
    发表于 2016-09-14 12:43:52 来自手机 显示全部楼层
    收藏
  • 潘永红 初来乍到 8
    发表于 2016-09-23 08:39:43 显示全部楼层
    学习了,多谢!
  • 15329438615 初来乍到 9
    发表于 2016-09-28 10:11:04 显示全部楼层
    谢谢楼主,学习了!
  • gregory2006 初来乍到 10
    发表于 2016-10-13 09:52:32 显示全部楼层
    有用!不知道WPS能通用吗?
您需要登录后才可以回帖 登录 | 注册