请上传宽度大于 1200px,高度大于 164px 的封面图片
    调整图片尺寸与位置
    滚轮可以放大缩小图片尺寸,按住图片拖动可调整位置,多余的会自动被裁剪掉
取消
数据砖工(uid:186979)
让数据成为生产力!!! 职业资格认证:FCA-FineBI | FCP-报表开发工程师 | FCP-FineBI | FCA-简道云 | FCA-业务分析理论 | FCA-九数云
【气泡连线图】月度销售额气泡连线图
一、明确需求及目的 使用现有的数据库销售明细表及品牌维度表,建立数据看板并进行 月度销售额 气泡连线 。   二、工具使用 工具:使用BI中的组合图(折线图+气泡图<点>)进行展示走势分析图。   三、梳理分析思路 第1步:数据准备——增加组件——获取数据集 第2步:创建组件——选择组合类型——查看所有数据 第3步:设计组合图表——折线图+气泡图<点>——指标 第4步:设置轴——左值轴,万元显示并20万间隔值;分类轴,年月显示;设置最大值5个类型 第5步:折线图——颜色——连线 第6步:气泡图——颜色——标签   四、开始制作,并分享截图步骤 第1步:数据准备——增加组件——获取数据集 第2步:创建组件——选择组合类型——查看所有数据 第3步:设计组合图表——折线图<线>+气泡图<点>——指标 第4步:设置轴——左值轴,万元显示并20万间隔值;分类轴,年月显示;设置最大值5个类型 1、虽然选择的是点的品牌描述进行过滤,但是 其实设置的条件却又是销售合计的前五个值的类型 2、间隔20万的刻度 第5步:折线图——颜色——连线 1、设置连线,用垂直,而且没有用标记点 第6步:气泡图——颜色——标签 五、反思制作过程中的注意点 1、工具的熟悉度不够,对于图形属性,组合图型,还是觉得比较棘手,可能会拼凑起来,但是不知道用途; 2、目前只是简单的数据展示,在实际的工作上,不知道这个的实际价值输出场景。            
【矩形块实践应用】月度品牌描述销售额和毛利图展示
一、明确需求及目的 使用现有的数据库销售明细表及品牌维度表,建立数据看板并进行 品牌销售额和毛利 分析。 根据图示并实现几个明细需求: 1、销售额映射颜色,毛利映射大小。   二、工具使用 工具:使用BI中的 矩形块 进行展示   品牌销售额和毛利 分析图。   三、梳理分析思路 第1步:数据准备——复制组件——获取同一个数据集 第2步:创建组件——选择组合类型——查看所有数据 第3步:设计图表——矩形块——指标 第4步:轴设置——左值轴,品牌描述;分类轴,销售年份/月份 第5步:图形属性——颜色(热力图1)、大小——整体微调排序   四、开始制作,并分享截图步骤 第1步:数据准备——复制组件——获取同一个数据集 第2步:创建组件——选择组合类型——查看所有数据 第3步:设计图表——矩形块——指标 第4步:轴设置——左值轴,品牌描述;分类轴,销售年份/月份 1、设置横轴,销售年份、销售月份,选择需要的展示格式,并重命名横轴名称 第5步:图形属性——颜色(热力图1)、大小——整体微调排序   1、销售额映射颜色,毛利映射大小 2、设置排序   五、反思制作过程中的注意点 1、工具的熟悉度不够,对于图形属性,矩形块的使用有待进步使用,本以为很难很复杂,其实很简单,容易被不熟悉的东西惊吓退; 2、有点像旭日图跟堆积图,如果将毛利去掉之后,就可以比较明显看到不同月度的销售情况,颜色一眼可以看出。  
【玫瑰饼图实践应用】月度销售额和毛利玫瑰饼图
一、明确需求及目的 使用现有的数据库销售明细表及品牌维度表,建立数据看板并进行销售额和毛利玫瑰饼图展示。 根据图示并实现1个明细需求: 1、数据提示 除了销售日期/销售额之外,还要显示毛利。   二、工具使用 工具:使用BI中的饼图,进行展示 玫瑰饼图。   三、梳理分析思路 第1步:数据准备——复制组件——获取同一个数据集 第2步:创建组件——选择图形类型——查看所有数据 第3步:设计玫瑰图——玫瑰图——指标 第4步:玫瑰图——颜色、半径、角度、标签、提示   四、开始制作,并分享截图步骤 第1步:数据准备——复制组件——获取同一个数据集 第2步:创建组件——选择图形类型——查看所有数据 第3步:设计玫瑰图——玫瑰图——指标(指标为空) 第4步:玫瑰图——颜色、半径、角度、标签、提示 1、设置颜色及时间展示格式 2、这是重点:共用半径,否。才能实现玫瑰饼图的效果,否则就是一个环形图。 3、设置标签 4、设置提示,注意区分提示跟标签的区别。 五、反思制作过程中的注意点 1、工具的熟悉度不够,对于图形属性,玫瑰图中的共用半径,不熟悉,导致一直无法设置出玫瑰图的效果,只是展示了一个圆形图; 2、目前只是简单的数据展示,但是 对于玫瑰图在实际业务中真正的使用场景目前尚未想到。    
【组合图实践应用】月度毛利销售额对比走势分析图
   一、明确需求及目的 使用现有的数据库销售明细表及品牌维度表,建立数据看板并进行销售额和毛利趋势分析。 根据图示并实现几个明细需求: 1、使用折线图展示销售额;使用柱形图展示毛利; 2、轴设置,左值轴,万元显示,分类轴,年月显示; 3、折线图,注意点:折线粗细大小、颜色、标签; 4、柱形图,注意点:颜色、大小。   二、工具使用 工具:使用BI中的组合图(折线图+柱形图)进行展示走势分析图。   三、梳理分析思路 第1步:数据准备——复制组件——获取同一个数据集 第2步:创建组件——选择组合类型——查看所有数据 第3步:设计组合图表——折线图+柱形图——指标 第4步:轴设置——左值轴,万元显示;分类轴,年月显示 第5步:折线图——折线粗细大小、颜色、标签 第6步:柱形图——颜色、标签   四、开始制作,并分享截图步骤 第1步:数据准备——创建自助数据集——关联数据——调整数据格式 1、复制组件获取同一个数据集 2、编辑组件,获取同一个数据集 第2步:创建组件——选择组合类型——查看所有数据 第3步:设计组合图表——折线图+柱形图——指标 第4步:轴设置——左值轴,万元显示;分类轴,年月显示 1、设置数据格式 2、数量单位:万 3、设置分类轴:年月 4、设置横轴的年月格式显示方式 第5步:折线图——折线粗细大小、颜色、连线、标签 1、选择折线图,并设置颜色 2、设置大小,线宽根据大小的属性进行 3、设置连线,经常被容易忽略的地方 4、设置标签,展示销售额 第6步:柱形图——颜色、标签 1、设置颜色 2、设置标签 五、反思制作过程中的注意点 1、工具的熟悉度不够,对于图形属性,折线图中的连线与大小,有待进一步巩固加强; 2、目前只是简单的数据展示,只是单个数轴的使用,如何使用两个数轴呢?这个是自己尚未学到的地方。      
【交叉表实践应用】品牌销售额和毛利统计
一、明确需求及目的 使用现有的数据库销售明细表及品牌维度表,建立数据看板并进行品牌销售额和毛利统计。 并实现三个明细需求:   1.毛利大于50,000指标颜色为绿色,小于50,000为红色;销售额大于200,000为绿点形状标记,否则为红点标记; 2.表格的分页列数为3; 3.合计行和合计列都要显示。   二、工具使用 工具:使用BI中的交叉表进行汇总统计。   三、梳理分析思路 第1步:数据准备——创建自助数据集——关联数据——调整数据格式 第2步:创建组件——选择交叉表——查看所有数据 第3步:设计交叉表——行列维度——指标 第4步:表格属性——指标颜色——指标形状 第5步:组件样式——格式分页——合并行列     四、开始制作,并分享截图步骤 第1步:数据准备——创建自助数据集——关联数据——调整数据格式 1、通过增加DB数据库——增加 销售明细表、品牌维度表 2、创建自助数据集 3、通过左右合并,实现数据的关联 4、调整数据格式 第2步:创建组件——选择交叉表————所有数据 1、点击该自助数据集下的右上角:创建组件 2、选择交叉表类型,并勾选查看所有数据 第3步:设计交叉表——行列维度——指标 1、拖拽行维度、列维度,并设置相应的属性 2、设置指标,默认情况下:求和。 第4步:表格属性——颜色——形状 1、根据需求(毛利大于50,000指标颜色为绿色,小于50,000为红色),设置表格属性中的颜色。 2、根据需求(销售额大于200,000为绿点形状标记,否则为红点标记),设置表格属性中的形状。 第5步:组件样式——格式分页——合并行列 1、查看组件样式 2、根据需求(表格的分页列数为3),设置格式分页列数 3、根据需求(合计列都要显示),设置合并行列   五、反思制作过程中的注意点 1、工具的熟悉度不够,对于组件样式及表格属性,有待进一步学习; 2、目前只是简单的数据展示,尚未结合实际业务场景,分析业务问题,脱离实际应用(这个才是最终数据的价值)。
【数据砖工】FineBI新版本db数据库连接方式
现状描述:报名了BI的培训课程,但是每次的作业都是一个单独的db后缀的数据库,每次都要创建连接。这次因本人的BI版本更换,导致历史的db连接需要重建,查看了很多官方材料,才找到相关比较具体的步骤、数据库文件存放的路径。   目标明确:好记性不如烂笔头,做好笔记及分享,坚持每天输出!输出就是强化输入的过程!   筹备工作:将db数据库文件放在指定的目录下:FineBI5.1\webapps\webroot   第1步:登陆后台,并新建数据连接; 第2步:选择Sqlite; 第3步:修改数据库连接名称,并修改数据库URL,测试成功连接,最后一步别忘记了,右上角保存,否则功亏一篑! jdbc:sqlite://${ENV_HOME}/../exercises1.db
嘿,终于,中奖了!!!
嘿,终于,中奖了!!! 链接:https://bbs.fanruan.com/plugin.php?id=levaward:award&doingid=18
【持续更新】Report入门到精通——只有干货分享
不忘初心,方能始终 1、最好的学习,就是坚持不断的输出!乐于分享,永不止步! 2、首先,非常感谢朵拉老师的鼓励!自己也趁着这样子的机会,刚好来做一个全面的梳理与总结!从2018年接触帆软至今,老司机一枚! 3、每个人的成长路线可能不尽相同,自身的需求也是五花八门,期待我的分享可以给大家带来一些启发或避免踩坑! 4、文章总结分享,会尽量每天坚持更新!   出发吧,少年! 梦想不会发光,发光的是追寻梦想的你!   一、大致学习路线总结 主要分为两条路线: 1、功能模块: 1、1:熟悉report设计器(数据库搭建)与后台管理【了解大致框架、搭建平台】                  1、2:开发第一张查询报表(从基础到多条件过滤与各类控件使用)【实现数据自助下载,摆脱提数工具人】                  1、3:SQL学习(查询、汇总、分类)【夯实基础,提升查询效率,快速效应】推荐插件                  1、4:开发第一张查询图表(各类图表使用及图表联动下钻,条件属性等)【不满单纯数据展示,实现领导酷爱的图表趋势图】 1、5:配合SQL实现后台管理角色权限设置【数据安全,权限隔离,实现一张模板全司复用,降低维护成本】 1、6:实践之路:报表指标体系搭建,平台上线搭建等 2、展示模块:         2、1:PC端(报表查询、报表录入、大屏展示组件复用)                 2、2:手机端(市场模板等)   二、功能模块分享 1、熟悉report设计器(数据库搭建)与后台管理     持续更新,未完待续!!!  
超级好用插件——高级数据库查询
  高级数据库查询 1、主要是排查SQL错误原因非常友好的提示,可以查看SQL运行后的结果,针对排除错误非常的棒!!!强烈推荐噢~~~ https://market.fanruan.com/plugin/eddba555-72f9-45c2-b220-62ff4af70678 select strftime('%Y-%m-%d',datetime(订购日期,'localtime','-1 year')) from 订单     编辑于 2021-9-22 22:15
【少年出品必属精品】动态列、自由纬度组合=实现任意纬度数据下钻功能
第一、痛点 一、实现面临的问题: 1、业务部门抱怨:提不完的数据报表需求,响应速度满足不了业务分析; 2、数据部门吐槽:处理不完的报表需求,需求一直在路上,看不到尽头。 二、具体问题分析:          举例:地区——销售员——产品类型——产品——销量 1、现状:每个人关注的业务点不同 A、区域领导:既想看区域的汇总情况,又想看各产品类型、各销售员的总销量; B、产品经理:却关心各产品类型的汇总销量情况,同时想看细分下各产品、各销售员的总销量,及各销售员下,每个人的各产品销售情况; C、销售员:只想看自身的销售汇总情况,及自身向下的各类产品类别及产品的销量;          2、问题:需求大同小异,又无法不处理                  A、针对 区域领导,就需要制作至少3个页面的报表汇总情况表;                  B、针对 产品经理,同样的至少需要3个页面的报表汇总情况表;                  C、销售员:同样的至少需要3个页面的报表汇总情况表;                  综上所述,平时至少需要开发 9张报表才能满足大家的需求。   第二、反思实践及成果展示 一、有思考,才有出路        1、针对以上所列举到的问题,其实可以用BI优先来处理,但现实不允许,分公司目前尚未推广BI项目,业务需求又迫在眉睫;        2、针对 所列举到的问题,需求大同小异,汇总的维度(列)及顺序发生了变化,比如如果有N个维度(列),那么汇总的方式就有N二次方排序及组合方式;             那么,未来的需求,永远是做不完的,因为业务总想知道到底哪里的业务做得不够好,总想着再往下再下钻一级看看业务问题的所在。        3、细思极恐,那么用现有的工具:report是否可以实现自由排序及组合方式?以后,开发一张报表,解决全部的数据汇总问题。 二、思考不够,还要敢于实践        1、信心不足:起初自己也没啥信心,所以,在技术求问贴,发布了问题,非常感谢小伙伴(flyingsnake)的回复:让我重拾信心,让我真正的去尝试!        2、重新出发:同时也在饭团老师的鼓励下,不断翻阅帮助文档,想要寻找到相关的答案,很可惜,以往并没有这块的知识讲解!        3、勇于实践:在最终经过多次的曲折突破,进过一周多的时间,终于实现:多维度动态列(钻取功能)自助组合数据汇总。 三、展示一下最终的实现效果图:       1、正常的顺序列(3列维度)展示:               2、根据选择的顺序列(3列维度)展示:                    3、根据选择的顺序列(4列维度)展示:               第三、实践之路,总有荆棘 一、使用if判断语句搭配单选框        1、代码展示: SELECT  地区 ${if((trim(销售员))=="是"," ,销售员 "," ")} ${if((trim(产品类型))=="是"," ,产品类型 "," ")} ${if((trim(产品))=="是"," ,产品 "," ")} ,sum(销量) 总销量        FROM 销量 group by  地区 ${if((trim(销售员))=="是"," ,销售员 "," ")} ${if((trim(产品类型))=="是"," ,产品类型 "," ")} ${if((trim(产品))=="是"," ,产品 "," ")}                                        2、展示结果:                             3、总结:             不足之处:A、参数面板设置非常麻烦,使用单选框,每个纬度都要设置一个控件;B、必须要固定第一个纬度(地区或其它纬度);                              C、选择否的情况下,空列还存在,影响美观;             可取之处:勇敢踏出一大步,虽然现在回头看来,好像很傻很傻!             001使用if判断语句搭配单选框.zip (2.32 K) 二、使用inarry数组函数搭配复选框          鉴于以上不足之处第一点:使用inarry数组,利用 函数属性,如果字符不在数组内则返回0,可减少控件的设置;         1、代码展示:              SELECT  地区 ${if(inarray("销售员",自由组合纬度)!=0," ,销售员"," ")} ${if(inarray("产品类型",自由组合纬度)!=0," ,产品类型"," ")} ${if(inarray("产品",自由组合纬度)!=0," ,产品"," ")} ,sum(销量) 总销量       FROM 销量 group by  地区 ${if(inarray("销售员",自由组合纬度)!=0," ,销售员"," ")} ${if(inarray("产品类型",自由组合纬度)!=0," ,产品类型"," ")} ${if(inarray("产品",自由组合纬度)!=0," ,产品"," ")}                      2、展示结果:                     3、总结:             不足之处:A、必须要固定第一个纬度(地区或其它纬度);B、复选框不选择的情况下,空列还存在,影响美观;             可取之处:使用复选框,实现了去除繁琐的多个控件设置,也算是一个大的进步;        002使用inarry数组函数搭配复选框.zip (2.21 K) 三、搭配使用(单选框-必选1个纬度、复选框-非必填项)         鉴于以上不足之处第一点:使用if函数,选择第一维度(考虑到字符串拼接问题),让第一个维度也动起来。         1、代码展示:                     2、展示结果:                   3、总结:             不足之处:A、复选框不选择的情况下,空列还存在,影响美观;             可取之处:通过组件的配合,已经实现第一维度可选择,多种维度下好像可以自由组合的情况了。             003搭配使用(单选框-必选1个纬度、复选框-非必填项).zip (2.37 K) 四、实现列隐藏(条件属性)         1、代码展示:通过条件属性的设置,若是数据为空,则隐藏该列:len($$$)=0,实现多余列的隐藏作用。         2、展示结果:         3、总结:             不足之处:在第一阶段,本以为是完美的状况了!!!             可取之处:通过条件属性,实现多余列的隐藏作用。          004实现列隐藏(条件属性).zip (2.43 K)   第四、越挫越勇,方法总比困难多 一、问题的彻底暴露        1、案例展示问题(第一维度无法做到真正的固定):                  2、案例展示问题(自由组合维度无法实现自由的组合):             二、再次踏上征程       鉴于以上暴露的两种情况,其实,与自己起初的想法差距还是十万八千里!!!       那么,是否仍有解决方案???走到了这一步,是否选择放弃???       不,我并没有,我咨询了相关的社区老师及互助的群,还有寻求帆软官方的技术支持!       在多方力量的支援下,并帮助文档的学习下,摸索到了原来还可以通过 indexofarray 进行列字段名的展示及#5列的信息展示。       但是,当时的想法也是比较粗糙,可以实现立马做了一个简单的demo,分享给大家。         20210910-动态列自由组合.zip (2.29 K)        虽然,当时demo是实现了,但是并没有比较好的方式,可以实现回写到SQL,也不敢完全确定 indexofarray 可以在SQL内使用。        经过一段时间的思考,今天白天终于在多次实践后,终于实现了最终的效果。        1、代码展示:                      2、展示结果:                 3、总结:             不足之处:虽然已实现起初的想法,但未能实现多层级钻取下,显示上级及上上级的汇总数据。             可取之处:经过一周多的时间,时间并没有白费,也取得了一定的成果! 一张动态列报表-最终版本.zip (2.55 K)   第五、分享总结      一、很开心可以跟大家一起共同成长!有社区的小伙伴们、有互助群、有饭团老师、朵拉老师等多位老师的支持鼓励!      二、坚持分享,就是最好的学习方式,虽然今天真的熬夜了!很久没有写这么长的分享材料了,但在回溯的时候,自己又有很多不一样的感受与巩固!      三、欢迎大家,留言多交流,有问题随时喊我!!!谢谢~   编辑于 2021-9-15 01:41 编辑于 2021-9-16 15:49
一张动态列报表——如何实现不同纬度的汇总,满足各部门各层级数据需求?
一、痛点 管理条线——部门——科室——科员——渠道——分类标签——产品类别——经销商——客户——销售额、等等 A、部门总,既想看部门的汇总情况,又想看各科室、各个渠道的总体数据; B、科长,却只想看自身科室的汇总情况,又想看各科员、各个渠道的总体数据; C、科员,只想看自身的汇总情况,在各个渠道的总体数据; 目前,已实现权限的隔离,每个人根据职务(部门总、科长、科员)的不同,获取的基础数据源SQL会进行过滤,部门总拥有查阅下级科室及科员的所有信息; 现实中的痛点: 少年,在处理需求的时候,遇到这种情况如下: 上周,需求开发了一张:部门——渠道——产品类别,销售额 汇总报表,满足了部门总的需求; 前天,又收到一个需求:科员——渠道——分类标签,销售额 汇总报表,满足了部门总的需求; 但是,昨天又收到需求,科室——科员——经销商   ,销售额 汇总报表,满足了部门总的需求; 但是,今天又收到需求,分类标签——产品类别——经销商——客户,销售额 汇总报表,满足了部门总的需求。 这种情况下,少年 觉得很无奈,部门总也觉得很崩溃,一个天天提需求,一个天天处理需求。 其实,这就是数据的多层级钻取功能,根据不同的纬度,查阅各项异常指标。   二、思考与实践 毕竟,少年也曾经是一名程序员,如果从程序员的角度出发,其实是可以实现多种纬度自由组合的想法,代码的编程也是可以实现的(其实用BI也可以的); 但是,目前公司借助帆软report工具,是否可以实现呢??? 这个要不断的进行尝试了!!!! 但是,起初自己也没啥信心,所以,在技术求问贴,发布了问题。 非常感谢小伙伴(flyingsnake)的回复:让我重拾信心,让我真正的去尝试! 当然,后来也有请教了饭团老师,来自他的讲解跟支持!!!叩谢~ 最终:解决痛点在于:实现多维度的数据动态列(钻取功能)各种层级的自助组合数据汇总。   三、实现的步骤 1、使用if判断语句搭配单选框 select  部门名称 ${if((trim(科室名称))=="是"," ,科室名称 "," ")} ${if((trim(科员))=="是"," ,科员 "," ")} ,sum(销售额)  总销售额 from 销售表 group by  部门名称 ${if((trim(科室名称))=="是"," ,科室名称 "," ")} ${if((trim(科员))=="是"," ,科员 "," ")} 存在不足之处:1、必须要固定第一个纬度(部门或其它纬度);2、参数面板设置比较麻烦,使用单选框,变成每个纬度都要设置一个控件; 2、使用inarry数组函数搭配复选框(inarry数组,利用 函数属性 如果字符不在数组内则返回0) select  部门名称 ${if(inarray("科室名称",纬度)!=0," ,科室名称"," ")} ${if(inarray("科员",纬度)!=0," ,科员"," ")} ,sum(销售额)  总销售额 from 销售表 group by  部门名称 ${if(inarray("科室名称",纬度)!=0," ,科室名称"," ")} ${if(inarray("科员",纬度)!=0," ,科员"," ")} 存在不足之处:1、必须要固定第一个纬度(部门或其它纬度); 3、搭配使用(单选框-必选1个纬度、复选框-非必填项) select  ${if((trim(第一纬度))=="部门名称"," 部门名称 "," ")} ${if((trim(第一纬度))=="科室名称"," 科室名称 "," ")} ${if(inarray("科室名称",纬度)!=0," ,科室名称"," ")} ${if(inarray("科员",纬度)!=0," ,科员"," ")} ,sum(销售额)  总销售额 from 销售表 group by  ${if((trim(第一纬度))=="部门名称"," 部门名称 "," ")} ${if((trim(第一纬度))=="科室名称"," 科室名称 "," ")} ${if(inarray("科室名称",纬度)!=0," ,科室名称"," ")} ${if(inarray("科员",纬度)!=0," ,科员"," ")} 存在不足之处:1、本以为是完美了,结果发现,存在多余的空列数据; 4、实现列隐藏(条件属性) 比如:数据表有这么多列数据:管理条线——部门——科室——科员——渠道——分类标签——产品类别——经销商——客户——销售额 使用原始的单元格属性,条线属性进行判断,设置列宽:len($$$)=0 ,则实现多余列的隐藏作用。   四、总结回顾 昨天已实现相应的功能,今天花了时间进行梳理,主要是让各位小伙伴们少走一些弯路! 能够把同质化的报表,进行归整,将个人或团队的效率提升,所做的报表也更加灵活,适应更多的场景需求。 坚持不断的学习!   五、突发状况 本以为一切皆完美,在正式部署后,通过实践才发现其实还是存在瑕疵!!! 因为模板的格式,其实默认情况下已写好,只是通过动态列进行的隐藏操作,无法真正的实现维度间随意的组合及调整顺序。 那么,应该如何操作呢? 最终可实现,跟随选择的顺序不同,调整列的位置! 先上线分享一个demo~ 20210910-动态列自由组合.zip (2.29 K) 输出与分享,就是最好的巩固跟学习的方式!!! 有任何问题,欢迎留言交流,看到就会答复噢! 编辑于 2021-9-10 07:35 编辑于 2021-9-10 09:43
【持续更新中】VBA学习之旅
第1节:初始 系统设置  '关闭屏幕更新 【作用:去除不必要闪屏】Excel.Application.ScreenUpdating = False '关闭屏幕提示:删除提示等【作用:因涉及多个提示框操作,必须开启,导致程序暂停】Excel.Application.DisplayAlerts = False -------此处忽略10万行代码------- '重启屏幕提示:删除提示等Excel.Application.DisplayAlerts = True '重启屏幕更新Excel.Application.ScreenUpdating = True   第2节:定义变量 Dim 变量名 as 数据类型:例  Dim i As Integer Const 常量名 as  数据类型:例 Const p As Single = 3.14 Range("B"& i ) Cells 什么时候使用?牵扯到行和列都要循环的时候,建议使用Cells。   第3节:条件判断及循环体 1、IF条件判断 If  条件表达式   Then             表达式返回True时要执行的代码 ElseIf  条件表达式    Then            表达式返回True时要执行的代码 Else           表达式返回Flase时要执行的代码 End If 2、For循环语句  For 循环变量=初值 To 终值 【step 步长值】【删除行的时候,使用负数】        循环体        Exit for        循环体 Next  3、Do While ... Loop 循环 Do  While 条件表达式        表达式返回True时要执行的代码        -------此处忽略10万行代码-------        j=j+1  【正常情况下,会有一个变量作为参数】 Loop  4、For Each ...In ... 循环 For Each  变量或对象  In  数组       要执行的代码 Next     第4节:工作表 1、对象                   对象说明 Application      Excel应用程序 Workbook       工作薄 WorkSheet      工作表 Range              单元格 2、选择工作表 Sheets("指定工作表名").Select     选中表格 Sheets("指定工作表名").name="数据少年"     重命名 3、新建工作表 Sheets.Add before:=Sheets("sheet1")                    在sheet1前面加一张工作表 Sheets.Add after:=Sheets("sheet1")                       在sheet1后面加一张工作表 Sheets.Add before:=Sheets("sheet1"), Count:=3   在sheet1前面加3张工作表 Sheets.Add after:=Sheets(Sheets.count)           在最后一张工作表后面插入工作表,先计算文件中有几张工作表   第5节:对象 Set 变量名称 = 要存储的对象名称 Dim sht As Worksheet    定义一个工作表对象 Set sht= ActiveSheet   将活动工作表赋给变量sht MsgBox 对话框显示结果值,调试必备 Call 函数 调用方法,可以将方法分开步骤,再进行调用。 Sub 合并() Call 总分 Call 汇总 End Sub   第6节:函数 1、随机数 Excel随机数函数:Randbetween(1,100)  表示1-100的内的随机数 Funtion 随机数() '无参函数 随机数=Int(Rnd()*10)+1 End Funtion 2、有参函数 Funtion 计算器(x)         y=x+1  '则返回y的值 End Funtion 3、自定义函数 定义函数:f(x)=x+12 调用函数:y=f(x)=f(2)=2+12=14 4、常用函数 Len(x) :获取字符长度 Trim(x):去除头尾空格 Replace(x,y,z):x 代表字符串本身,y代表被替换的字符,z代表结果字符 UCase(x):大写转换 LCase(x):小写转换 Left(x,y):x 代表字符串本身,y代表 数字,要截取的字符串长度,方向从左边截取 Right(x,y):x 代表字符串本身,y代表 数字,要截取的字符串长度,方向从右边截取 Mid(x,y,z):x 代表字符串本身,y代表 数字 从第几位开始截取,z代表 数字,要截取的字符串长度,方向从左边截取 InStr(x,y):x 代表字符串本身,y代表 要查找的字符,如果不存在则返回0,如果存在则返回第一个查找到的位置。 案例: Sub text() Dim s Set s = Range("A2") 城市 = InStr(s, "市") 区县 = InStr(s, "区") Range("E2") = Left(s, 城市) Range("F2") = Mid(s, 城市 + 1, 区县 - 城市) Range("G2") = Right(s, Len(s) - 区县) End Sub Split(x,y)(z):x 代表字符串本身,y代表 分割的字符,z代表从零开始数组 DateSerial(x,y,z):x 代表:字符串年,y代表:字符串月,z代表:字符串日   第7节:循环遍历 1、For Each ...In ... 循环 For Each  变量或对象  In  数组       要执行的代码 Next 2、WorkSheets 工作表 For Each  K  In  WorkSheets  '相当于: For i to Sheets.count   Set w=Sheets(i)           Range("A2")=K.name Next    第8节:工作薄 1、Workbook:代表一个工作薄 Workbooks :代表 当前打开的所有工作薄 2、正确引用工作簿: Workbooks("x") : x代表 工作薄的名称 Workbooks("x") .Activate 激活工作薄 ActivateWorkbook 是对活动工作薄的引用 3、ThisWorkbook 是代码所在的工作薄对象 ThisWorkbook.Name  获取工作薄名称 ThisWorkbook.Path     获取工作薄文件所在路径 ThisWorkbook.FullName  获取带路径的工作薄名称 4、工作薄创建、打开、关闭 Workbooks.Add   新建一张空白工作薄 Workbooks.Add “C:\User\Desktop\测试.xlsx” 根据指定文件,创建一张一模一样的工作薄,类似于复制 Workbooks.Open “C:\User\Desktop\测试.xlsx” 根据指定文件,打开文件 Workbooks.Close  关闭当前打开的所有工作薄 Workbooks("x").Close  关闭当前打开的x工作薄 Workbooks("x").Close True  保存关闭 Workbooks("x").Close False 不保存关闭 5、工作薄保存及关闭 ThisWorkbook.Save   保存当前工作薄 ThisWorkbook.SaveAs  Filename:="C:\User\Desktop\备份.xlsx"      另存为功能 6、案例,将一个工作薄内每个工作表,拆开成多个独立的工作薄 Dim w1    ’定义工作表对象 For Each w1 in WorkSheets        w1.Copy   '先进行复制       ActivateWorkbook.SaveAs Filename:="C:\User\Desktop\"& w1.name &".xlsx"        ActivateWorkbook.Close Next   第9节:单元格 一、Range属性引用 1、引用单个固定的单元格区域 Range("A1:A10") 2、引用多个不连续的单元格区域 Range("A1:A10,A4:E6,C3:D9") Union(Range("A1:A10"), Range("C1:C10")) 3、引用多个区域的公共区域(相交) Range("B1:B10 A4:D6") 4、引用两个区域围成的矩形区域 Range("B6:B10", "D2:D8") 5、整行或整列 Range("a6").EntireRow.Select 选择A6单元格所在的那一整行 Range("a6").EntireColumn.Select 选择A6单元格所在的那一整列 二、Cells属性引用 1、引用工作表中指定行列交叉的单元格 工作表对象.Cells(行,列) ActiveSheet.Cells(3,4) 2、引用单元格区域中某个单元格 Range("B3:F9").Cells(2,3) 3、将Cells属性的返回结果设置为Range属性的参数 Set r = Range(Cells(x, y) , Cells(i, j)) 等效于 range(Ai,Bj) 三、引用整行单元格 1、活动工作表第3行 ActivSheet.Rows("3:3") ActivSheet.Rows(3) 2、活动工作表第3到5行 ActivSheet.Rows("3:5") 3、活动工作所有行 ActivSheet.Rows 4、3到10行区域中的第1行 Rows("3:10").Rows("1:1") 四、引用整列单元格 1、活动工作表F到G列 ActiveSheet.Colunms("F:G") 2、活动工作表中第6列 ActiveSheet.Colunms(6) 3、活动工作表所有列 ActiveSheet.Colunms 4、B:G列区域中的第2列 Colunms("B:G").Colunms("B:B") 五、清除 六、字体、背景色 r.Font.Clolr=RGB(255,0,0) 文字颜色 r.Font.Size =24 文字大小 r.Font.Italic = True 是否斜体 r.Font.Bold = True 是否粗体 r.Interior.Color=RGB(255,0,0)  单元格背景色 案例:使用With精简代码 Dim r Set r = Range("A1:A10") With r.Font .Clolr = RGB(255, 0, 0) .Size = 24 .Italic = True .Bold = True End With 七、单元格合并取消 r.Merge 合并单元格 r.UnMerge 取消合并单元格 案例: Sub a() Dim r Set r = Range("D1:E2") r.Merge End Sub 八、常用对象、属性 1、Range对象的offset(下移行,右移列) 2、Range对象的CurrentRegion连续区域,例如:Range("E7").CurrentRegion.Select 3、Worksheet对象的UsedRange使用区域,例如:ActiveSheet.UsedRange.Select  注意:Usedrange属性并不是单元格的属性,它是工作表的属性,是返回工作表中已经使用了的单元格区域 4、Range对象的End属性 Range("a65536").End(xlUp).Select '选中A列最后一个被使用的单元格 Range("a65536").End(xlUp).Row 'Row是行号,返回数值 (xlToLeft、xlToRight、xlUp、xlDown) 例如:For i = 2 to Range("a1048576").End(xlup).Row ’获取最后一行的行数           irow = Range("a1048576").End(xlup).Row    For i = 2 to irow 5、访问Count属性,获得区域中包含单元格的个数 指定区域中单元格的个数 MsgBox Range("B4:F10").Count 活动工作表中已使用区域的行数 ActiveSheet.UsedRange.Rows.Count 活动工作表中已使用区域的列数 ActiveSheet.UsedRange.Columns.Count 6、用Copy方法复制单元格区域 Range(“A7”).EntireRow.Copy Range(“A23”) ‘将A7那一整行拷贝到A23 Range("A1").CurrentRegion.Copy Range("H1")  ‘将A1连续区域内的数据进行拷贝 7、用Cut方法剪切单元格 Range("A1").Cut Range("C1") 8、用Delete方法删除指定单元格 九、单元格案例 1、复制行 '将“二班”这一行复制到“二班”工作表数据的下一行 irow = Sheets(“二班”).Range("A1048576").End(xlUp).Row + 1 Sheet1.Range("B" & i).EntireRow.Copy Sheets("二班").Range("A" & irow)  2、清空表 Sheets(i).UsedRange.Clear 3、通过模拟筛选进行复制数据 For i = 2 To Sheets.Count Sheet1.UsedRange.AutoFilter field:=2, Criteria1:=Sheets(i).Name   '选择第二个列,为筛选条件,并且根据Name进行过滤 Sheet1.UsedRange.Copy Sheets(i).Range("A1")                                '复制过滤后的数据 Next Sheet1.UsedRange.AutoFilter                                                                    '恢复到 未设置 筛选条件 4、根据某列数据进行创建表名 Do While Sheet1.Range("A" & i) <> "" k = 0 '如果有重名K=1就不继续了,每次K=0开始 For Each s1 In Sheets If s1.Name = Sheet1.Range("B" & i) Then k = 1 End If Next If k = 0 Then Sheets.Add after:=Sheets(Sheets.Count) Sheets(Sheets.Count).Name = Sheet1.Range("B" &i) End If i = i + 1 Loop 5、MsgBox与InputBox(输入框、对话框) Dim i i = InputBox("请输入您的姓名:") MsgBox "您好" & i & "欢迎回来!" 6、根据指定列,进行拆分数据表 20210901-指定列拆数据-学生基础数据.zip (18.61 K)   第10节:数据类型与日期函数 一、数据类型 1、案例:对内存的消耗时间差不多 Dim 开始时间 开始时间 = Time() MsgBox "运行时间" & DateDiff("s", 开始时间, Time()) & "秒" 2、案例:&符号放在数字后面时,就把这个数字看成是Long类型 Sub a() Dim a a = 30000& * 2 MsgBox a End Sub 3、案例:使用下划线换行               A:Range("J" & i) = Range("B" & i) _ + Range("C" & i) + Range("D" & i) _ + Range("E" & i) + Range("F" & i)                B:拆分字符串,则 & _  增加一个连接符才可以。 4、数据类型: 二、日期函数 1、#之间表示它是一个日期 a = #7/30/2020 8:08:08 AM# 2、Date日期、Time时间、Now日期+时间 3、函数: 4、案例:HR生日提醒 Dim i i = 2: j = 1 Do While Range("A" & i) <> "" If Month(Range("C" & i)) = Month(Date) And Day(Range("C" & i)) = Day(Date) Then MsgBox "今天是" & Range("A" & i) & "的生日" Sheets("生日名单").Range("A" & j) = Range("A" & i) j = j + 1 End If i = i + 1 Loop 5、DateDiff函数 6、DateAdd函数   第11节:错误处理方式及判断函数、Excel公式 一、逻辑 1、案例:隔人变色 2、GoTo语句: Dim a, i i = 1 '设置x为标签,相当于打了一个标记 x: a = a + i i = i + 1 If i <= 100 Then GoTo x '当条件满足的时候,则返回到标记的位置 MsgBox "从1到100的累加和是:" & a 3、On Error GoTo 标签 Sub 测试() On Error GoTo a Sheets("测试").Select Exit Sub a: MsgBox "没有这张工作表!" End Sub 4、On Error Resume Next:开始忽略错误问题 Resume Next告诉VBA如果发生错误,就忽略错误代码的存在,接着执行错误行之后的代码。假设你在程序开始的时候加入这个 语句,即使VBA程序在运行中出错,VBA也不会中断程序,而是忽略所有存在错误的语句,继续执行出错语句后的代码。 5、On Error GoTo 0 :结束忽略错误问题,搭配 On Error Resume Next 使用。 二、判断函数 IsDate 判断是否为日期、IsNumeric判断是否为数字、TypeName查看变量的数据类型 1、案例:计算保质期 二、Excel公式 1、四舍五入 Dim i, j i = 3.1415926 j = Excel.Application.WorksheetFunction.Round(i, 2) MsgBox j 2、统计非空行数量:CountA,扣除标题行 Dim a a = Excel.Application.WorksheetFunction.CountA(Range("A:A")) - 1 MsgBox a 3、条件计数:CountIf Excel.Application.WorksheetFunction .CountIf(Range("C:C"), "男") 4、VLookup:从多张表中匹配数据 On Error Resume Next '必须要增加这句话 Dim j, i j = 2 Do While Range("A" & j) <> 0 For i = 2 To Sheets.Count Range("B" & j) = Excel.Application.WorksheetFunction.VLookup(Range("A" & j),Sheets(i).Range("A:B"), 2, 0) Next j = j + 1 Loop 5、考生成绩统计&查询系统 Sub 查询() On Error Resume Next Dim i, a, b, c Sheets("汇总").Range("D14").ClearContents For i = 2 To Sheets.Count With Excel.Application.WorksheetFunction Set a = Sheets("汇总").Range("D9") Set b = Sheets(i).Range("A:H") Set c = Sheets("汇总") c.Range("D14") = .VLookup(a, b, 5, 0) '姓名 c.Range("D16") = .VLookup(a, b, 6, 0) '性别 c.Range("D18") = .VLookup(a, b, 3, 0) '专业类 c.Range("D20") = .VLookup(a, b, 8, 0) '总分 '在哪张表上找到数据就显示他的表名 c.Range("D22") = Sheets(i).Name '如果汇总表的D14姓名不为空时就停止循环 If c.Range("D14") <> "" Then Exit For End If End With Next End Sub Sub 统计() Dim i, a, b For i = 2 To Sheets.Count With Excel.Application.WorksheetFunction Set a = Sheets("汇总") Set b = Sheets(i) a.Range("D26") = .CountA(b.Range("A:A")) - 1 a.Range("D27") = .CountIf(b.Range("F:F"), "男") a.Range("D28") = .CountIf(b.Range("F:F"), "女") End With Next End Sub   第12节:数组 一、数组定义 1、一维数组,定义格式:Dim 数组名称(a To b) As 数据类型 Dim arr(99) As Byte '等同于 Dim arr(0 To 99) As Byte 注意:如果使用一个自然数确定数组大小,默认起始索引号为0,数组共有100个元素 一维数组 【最大索引减最小索引加1】 Ubound(数组名称)-Lbound(数组名称)+1 2、数组的维度:二维数组        3、多维数组声明: Dim 数组名称 (a To b) As 数据类型 Dim arr(1 To 3, 1 To 5) As Integer '定义了一个3行5列,类型为Integer的二维数组 Dim arr(2,4) As Integer ‘等同于Dim arr(0 To 1,0 To3) As Integer 4、声明动态数组: 动态数组:就是维数不确定或可存储的数据个数不确定。 将数组定义为动态数组以后,可以用ReDim语句重新定义它的大小,ReDim就可以用变量定义了 案例: Sub test() Dim a, i a = Excel.Application.WorksheetFunction.CountA(Range("A:A")) Dim arr() ReDim arr(1 To a) For i = 1 To a arr(i) = Range("A" & i) Range("G" & i) = arr(i) Next End Sub 5、使用Array函数创建数组 Dim arr arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) MsgBox "数组第3个元素为" & arr(2) 6、使用Split函数创建数组 Dim arr arr = Split("你好,你在,哪里", ",") MsgBox "数组第2个元素为" & arr(1) 7、使用单元格区域赋值 Dim arr arr = Range("A1:C3") Range("E1:G3") = arr 8、使用Join函数连接数组内容   语法:Join(数组名称,连接符号) Dim arr, a arr = Array(0, 1, 2, 3, 4, 5, 6, 7, 8, 9) a = Join(arr, "#") MsgBox a 9、UBound函数求数组最大索引号,LBound最小索引号 Dim arr arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) MsgBox "数组最大索引号是:" & UBound(arr) 10、多维数组的最大和最小索引号 Dim arr(1 To 3, 1 To 5), a, b a = UBound(arr, 1) '求一维数组最大索引,注意1参数代表的意思是第一维度 b = UBound(arr, 2) '求二维数组最大索引,注意2参数代表的意思是第二维度 MsgBox "第一维的最大索引号是:" & a & Chr(13) & _ "第二维的最大索引号是:" & b 11、Transpose将数组中的数据写入单元格区域 Dim arr arr = Array(1, 2, 3, 4, 5, 6, 7, 8, 9, 10) Range("A1:A8") = Excel.Application.WorksheetFunction.Transpose(arr) 12、案例:A列有1至100这些数字,计算他的累积之和 Sub test() Dim arr(99), i, j j = 0 For i = LBound(arr) To UBound(arr) arr(i) = Range("A" & i + 1) j = j + arr(i) Next MsgBox "数组相加累积之和:" & j End Sub 13、使用Match获取下标 '记住两个方法,1.求数组最大值Max(arr),2.求数组最大值的下标Match(Max(arr),arr) With Excel.Application.WorksheetFunction Range("H3") = .Max(arr) '因为下标从0开始,所以找到商品名称的单元格要数组最大值下标数+1 k = .Match(Range("H3"), arr) + 1 Range("H2") = Range("A" & k)   第13节:操作TXT文本 一、读取TXT文件 1、步骤: 1、打开文本文件,找到指定文件并调入内容 2、读取一行内容,将每一行当成一个字符串 3、判断是否已到末尾?如果是末尾不再读取 4、关闭文本文件,保存文件【格式调整为:ANSI】,清空内容 2、打开文件 语法:Open 路径和文件名 For 模式 As #文件代号 其中access、lock、reclength为可选参数,一般不用。 模式 指定打开文件的方式。有5种: Input:以输入方式打开,即读取方式。 Output:以输出方式打开,即写入方式。 Append:以追加方式打开,即添加内容到文件末尾。 Binary:以二进制方式打开。 Random:以随机方式打开,如果未指定方式,则以 Random 方式打开文件。 文件代号,范围在 1 到 511 之间。如果你同时打开多个文件时,指定文件代号的优点是方便调用。也可使用 FreeFile 函数可得到下一个可用的文件号。 说明:如果 pathname 指定的文件不存在,那么,在用 Append、Binary、Output、或 Random 方式打开文件时,可以建立这一文件。 3、读取文件 4、使用EOF判断是否已经到文件末尾 5、关闭文本文件,保存文件,清空内容 二、写入TXT文件 1、步骤: 1、打开文件 2、写入一行 3、关闭文件 Sub test() Dim i '写入用output,追加用append Open "c:\Users\Desktop\李小龙.txt" For Output As #1 i = 2 Do While Range("A" & i) <> "" Print #1, Trim(Range("A" & i));      '使用 Print 写入,在后面增加 ;分号,则表示追加,不需要换行 Print #1, Trim(Range("B" & i)) i = i + 1 Loop Close #1 End Sub 2、多张工作表同时写入一个文件 Sub test() Dim i, s1 Open "c:\Users\Desktop\李小龙.txt" For Output As #1 For Each s1 In Sheets '每张工作表从第2行开始扫描每一行 i = 2 Do While s1.Range("A" & i) <> "" Print #1, s1.Range("A" & i); ","; s1.Range("B" & i) i = i + 1 Loop Next Close #1 End Sub 3、多文件的读取与写入 Sub a() Dim i Open "C:\Users\Desktop\多文件打开写入\姓名.txt" For Input As #1 Open "C:\Users\Desktop\多文件打开写入\功夫.txt" For Input As #2 i = 1 Do While Not EOF(1) Or Not EOF(2) If Not EOF(1) Then Line Input #1, s Range("A" & i) = s i = i + 1 End If If Not EOF(2) Then Line Input #2, s Range("A" & i) = s i = i + 1 End If Loop Close #1: Close #2 Open "C:\Users\Desktop\多文件打开写入\合并.txt" For Output As #3 i = 1 Do While Range("A" & i) <> "" Print #3, Range("A" & i) i = i + 1 Loop Close #3 End Sub   第14节:使用Dir函数合并多个文件的数据 一、写参数与不写参数的区别:  Dir(文件夹):重新返回该文件夹的第一个文件名,不论之前已经找到过多少文件          Dir():接着前一次,继续在同一文件夹中viral下一个文件名 二、注意:Dir函数只能返回文件的名字,他不能返回路径,但是Open语句必须写上盘符和文件名 当Dir函数返回空字符串时,代表所有文件名都已经被找到,本次查找结束。 Sub a() Dim 文件 文件 = Dir("C:\Users\Desktop\dir\") '返回意大利 文件 = Dir '返回美国 文件 = Dir '返回西班牙 文件 = Dir '返回空 文件 = Dir '报错 MsgBox 文件 End Sub 三、【通用】遍历文件夹下所有的txt文件 Sub 遍历所有txt文件() Dim 文件 '运行Dir函数得到第1个文件的名字 文件 = Dir("C:\Users\Desktop\多文件打开写入\") '如果读到的文件不是空字符串,就证明这是一个有效文件 Do While 文件 <> "" '这里可以对文件进行打开和读取操作 文件 = Dir '再次运行Dir就读到下一个文件名 Loop End Sub 案例:利用【通用】壳子操作txt Sub 遍历所有txt文件() Dim 文件 '运行Dir函数得到第1个文件的名字 文件 = Dir("C:\Users\Desktop\txt\") '如果读到的文件不是空字符串,就证明这是一个有效文件 Do While 文件 <> "" '这里可以对文件进行打开和读取操作 Call 读取多个txt文件("C:\Users\Desktop\txt\" & 文件) 文件 = Dir '再次运行Dir就读到下一个文件名 Loop End Sub   '读取【带路径的文件名】变量中存储的文件 '取出每行国家名称和确诊人数,写入工作表 Sub 读取多个txt文件(带路径的文件名) Dim i, w1, x Set w1 = Worksheets.Add '关于InStrRev函数详见笔记6.3.8 w1.Name = Mid(带路径的文件名, InStrRev(带路径的文件名, "\") + 1) Open 带路径的文件名 For Input As #1 i = 1 Do While Not EOF(1) Line Input #1, x 'Split函数详见笔记6.3.10 w1.Range("A" & i) = Split w1.Range("A" & i) = Split(x, ",")(0) w1.Range("B" & i) = Split(x, ",")(1) w1.Range("C" & i) = Split(x, ",")(2) i = i + 1 Loop Close #1 End Sub 4、【通用】遍历文件夹下所有的Excel文件 Sub 遍历文件夹下Excel文件() Dim w1 文件 = Dir("C:\Users\Desktop\excel\") Do While 文件 <> "" Set w1 = Workbooks.Open("C:\Users\Desktop\excel\" & 文件) '此处可以处理当前打开的工作簿 w1.Close 文件 = Dir Loop End Sub 5、利用【通用】壳子操作Excel 【工作簿里仅1张表】 Sub 遍历文件夹下Excel文件() Excel.Application.ScreenUpdating = False Dim w1 文件 = Dir("C:\Users\Desktop\excel\") Do While 文件 <> "" Set w1 = Workbooks.Open("C:\Users\Desktop\excel\" & 文件) '打开文件并复制第1张表,放在我这个写代码的工作簿里,有几张表就在表后面粘贴 w1.Sheets(1).Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) '刚复制的这张表的表名就是w1那个变量的文件名(不要后缀) ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Split(w1.Name, ".")(0) w1.Close 文件 = Dir Loop Excel.Application.ScreenUpdating = True End Sub 6、利用【通用】壳子操作Excel 【工作簿里多张表】 '工作表名 = 文件名+工作表名 Sub 遍历文件夹下Excel文件() Excel.Application.ScreenUpdating = False Dim w1 文件 = Dir("C:\Users\Desktop\多表excel\") Do While 文件 <> "" Set w1 = Workbooks.Open("C:\Users\Desktop\多表excel\" & 文件) For Each s1 In w1.Sheets '复制s1放到工作表最后面 s1.Copy after:=ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count) '刚复制的这张表的表名就是w1那个变量的文件名(不要后缀) ThisWorkbook.Sheets(ThisWorkbook.Sheets.Count).Name = Split(w1.Name, ".")(0) & "." & s1.Name Next w1.Close 文件 = Dir Loop Sheet1.Select Excel.Application.ScreenUpdating = True End Sub 7、遍历文件夹下不只是Excel时,但是你只要合并所有Excel文件,有两种方法,各有利弊 方法一: Sub 遍历文件夹下Excel文件() Dim w1 文件 = Dir("C:\Users\Desktop\excel\") Do While 文件 <> "" '判断是否以xlsx或xls结尾的文件,英文要考虑大小写一致 If LCase(Right(文件, 5)) = ".xlsx" Or LCase(Right(文件, 4)) = ".xls" Then Set w1 = Workbooks.Open("C:\Users\Desktop\excel" & 文件) '此处可以处理当前打开的工作簿 w1.Close End If 文件 = Dir Loop End Sub 方法二: Sub 遍历文件夹下Excel文件() Dim w1 文件 = Dir("C:\Users\Desktop\excel\*.xlsx") Do While 文件 <> "" Set w1 = Workbooks.Open("C:\Users\Desktop\excel" & 文件) '此处可以处理当前打开的工作簿 w1.Close 文件 = Dir Loop End Sub   第15节:Range高阶应用 一、与Range对象位置有关的属性 Range.Rows 单元格行号 Range.Clounms 单元格列号 Range.Address 各对角顶点的绝对引用地址 Range.Count 单元格数量 二、Cells与UsedRange 1、代表工作表中全部单元格的Range对象 【Cells】 Sub a() Dim i i=2 i=i+1 Do while range("A"& i)<>"" and i < ActiveSheet.Cells.Rows.Count loop End sub 2、涵盖工作表中全部使用过的单元格的Range对象 【UsedRange】 Sub a() Dim r1, i '当前工作表所使用的区域 Set r1 = ActiveSheet.UsedRange 'Row从第几行开始+总计多少行-1就得到最后一行的位置了 i = r1.Row + r1.Rows.Count - 1 MsgBox "最后一行是" & i End Sub 3、【推荐】取得最后一个非空单元格 可设置的参数  参数说明 xlToLeft          End+左方向键 xlToRight        End+右方向键 xlUp                End+上方向键 xlDown           End+下方向键 案例:取某列中最后一个非空单元格() Sub 取某列中最后一个非空单元格() Dim r 'Range("A" & Rows.Count)获取工作表第一列最后一个单元格 '通过End属性获得A列最后一个非空单元格 Set r = Range("A" & Rows.Count).End(xlUp) MsgBox r.Row End Sub 案例:取某行中最后个非空单元格() Sub 取某行中最后个非空单元格() Dim r Set r = Cells(1, Columns.Count).End(xlToLeft) MsgBox r.Column End Sub 4、往单元格里写数据,建议配合数组 Sub 配合数组使用() Dim arr(), i arr = Range("A1:A1048576") For i = 1 To 1048576 arr(i, 1) = 1 Next Range("A1:A1048576") = arr MsgBox "已经完成" End Sub 5、选择性粘贴 案例一:Copy单元格保证列宽不变 Sub 单元格拷贝() Range("B2").CurrentRegion.Copy With Sheets("Sheet2").Range("A1") '使用Range对象的PasteSpecial方法选择性粘贴剪贴板中Range对象的列宽 .PasteSpecial xlPasteColumnWidths '粘贴剪贴板中Range对象全部内容 .PasteSpecial xlPasteAll End With '取消应用程序复制模式,如果没有关闭,则会存在选中的状态 Application.CutCopyMode = False End Sub 6、【选择性粘贴参数】PasteSpecial 方法 PasteSpecial(Paste, Operation, SkipBlanks, Transpose) 参数1:Paste XlPasteType 类型,可选。指定要粘贴的区域部分 参数2:Operation XlPasteSpecialOperation 类型,可选。指定粘贴操作 参数3:SkipBlanks 指示是否跳过空单元格,默认值为Flase,若参数值为True,则不将剪贴板上区域中的空白单元格粘贴到目标区域中 参数4:Transpose 指示是否进行转置,默认值为False,若参数值为True,则粘贴区域时转置行和列 7、直接赋值,速度快 【但是无法保留原数据格式】 以前我们直接赋值,需要写清楚单元格区域和目标单元格区域,先不说你有多累,如果这个区域不固定怎么办? Sub 直接赋值() With Range("B2").CurrentRegion Sheets("Sheet2").Range("A1").Resize(.Rows.Count, .Columns.Count).Value = .Value End With End Sub 8、Intersect获取单元格交叉区域 【通用壳子】 Sub Intersect交叉区域(r1, r2) Dim 单元格对象 'Intersect方法至少指定两个参数,最多30个,必须是Range对象 Set 单元格对象 = Excel.Application.Intersect(r1, r2) '如果单元格对象什么都没有(Nothing) If 单元格对象 Is Nothing Then MsgBox "不存在交叉区域" Else MsgBox "交叉区域地址为:" & 单元格对象.Address End If '释放单元格对象占用的内存,不写不会报错,但是数据大了以后会卡死 Set 单元格对象 = Nothing End Sub   Sub 调用() Call Intersect交叉区域(Range("C3:G14"), Range("E7:I20")) End Sub 9、Union单元格多选:Application.Union方法:把多个Range联合在一起,作为一个新的Range对象返回 【通用壳子】 Sub 多选单元格() '因为省去了set,所以这里要定义成单元格对象 Dim r1 As Range, r2 As Range For Each r1 In Range("A1:G7") If r1.Value = "少年" Then '如果r2对象变为Nothing If r2 Is Nothing Then '就指定r2为range对象r1 Set r2 = r1 Else '否则r2单元格区域与r1对象多选联合后区域重新为r2赋值 Set r2 = Excel.Application.Union(r2, r1) End If End If Next If Not r2 Is Nothing Then r2.Select r2.Interior.Color = vbRed End If Set r1 = No Set r1 = Nothing Set r2 = Nothing End Sub 10、单元格边框 案例一:添加边框 Sub 添加边框() Dim r1 As Range Set r1 = Range("A1:G7") With r1.Borders '边框线条样式 .LineStyle = xlContinuous '边框线条粗细 .Weight = xlThin '边框线条颜色 .ColorIndex = 5 End With '使用BorderAround方法为单元格区域添加一个加粗外框 r1.BorderAround xlContinuous, xlMedium, 5 Set r1 = Nothing End Sub 案例二:外实内虚 Sub 外实内虚() Dim r1 As Range Set r1 = Range("A1:G7") With r1.Borders(xlInsideHorizontal) ‘内部水平 .LineStyle = xlDot .Weight = xlThin .ColorIndex = 5 End With With r1.Borders(xlInsideVertical) ‘内部垂直 .LineStyle = xlContinuous .Weight = xlThin .ColorIndex = 5 End With r1.BorderAround xlContinuous, xlMedium, 5 Set r1 = Nothing End Sub 案例三:清除线条 Sub 清除线条() Columns("A:G").Borders.LineStyle = xlNone End Sub ColorIndex颜色表 VBA边框的两个属性LineStyle和Weight 11、数据排序 1、语法 Range对象的Sort方法对区域进行排序,其语法格式如下: Sort(Key1, Order1, Key2, Type, Order2, Key3, Order3, Header, OrderCustom, MatchCase, Orientation, SortMethod, DataOption1, DataOption2, DataOption3) 其中Key1、Key2、Key3是可选的,分别代表第1排序字段,第2排序字段,第3排序字段(Range的Sort方法就支持3个字段) Order1, Order2,Order3是可选的,指的是排序方式(升序或降序),值见下表 xlAscending  升序(默认) xlDescending   降序 Header是可选的,指定第1行是否包含标题 xlGuess Excel  确定是否有标题,如果有,确定标题位于何处 xlNo   不包含标题(默认) xlYes   包含标题 2、案例:根据总分排序 Sub 数据排序1() Range("A1").Sort "总成绩", xlDescending, Header:=xlYes End Sub 3、案例:支持最多三个字段排序 Sub 数据排序2() Range("A1").Sort key1:="总成绩", order1:=xlDescending, _ key2:="数学", order2:=xlDescending, _ key3:="语文", order3:=xlDescending, _ Header:=xlYes End Sub 4、案例:支持三个以上字段排序 Sub 多关键字排序_不推荐() With Range("A1") .Sort Key1:="英语", order1:=xlDescending, Header:=xlYes .Sort Key1:="语文", order1:=xlDescending, Header:=xlYes .Sort Key1:="数学", order1:=xlDescending, Header:=xlYes .Sort Key1:="总成绩", order1:=xlDescending, Header:=xlYes End With End Sub 5、自定义序列排序 Sub SortByLists() Dim arr, 序号 arr = Range("E2:E6") '通过AddCustomList方法为数组添加自定义序列 Excel.Application.AddCustomList arr '返回数组在自定义序列中的序列号,保存在序号这个变量中 序号 = Application.GetCustomListNum(arr) '因为OrderCustom从1开始,如果有一行表头我们就要加1 Range("A1").Sort Key1:="部门", Order1:=xlAscending, Header:=xlYes, OrderCustom:=序号 + 1 '使用DeleteCustomList删除新添加的自定义序列 Application.DeleteCustomList 序号 End Sub   第16节:事件编程 一、工作薄事件与工作表事件 1、名称实例:对象名称+事件名称 2、【重要】Workbook事件 3、【重要】Worksheet事件 4、案例:激活工作表,实现透视表刷新功能 Private Sub Worksheet_Activate() ActiveWorkbook.RefreshAll '刷新透视表 End Sub 二、工作表事件 1、Worksheet_Change(单元格的值变了去执行宏) 1、写一个筛选程序:存在不足之处,会导致死循环 Sub 筛选() '笔记9.6和笔记9.2 Range("K1").CurrentRegion.Clear '筛选这个区域内第2列,等于H2单元格的名字 Range("A1").CurrentRegion.AutoFilter field:=2, Criteria1:=Range("H2") '将这个区域复制到K1单元格 Range("A1").CurrentRegion.Copy Range("K1") '取消自动筛选 Range("A1").CurrentRegion.AutoFilter End Sub 2、禁用事件,让事件过程不再自动执行,解决死循环的问题 Private Sub Worksheet_Change(ByVal Target As Range) '关闭事件 Excel.Application.EnableEvents = False '因为筛选本身就是修改单元格 Call 筛选 '打开事件 Excel.Application.EnableEvents = True End Sub 3、第二种解决方案:只要部分单元格被更改时才执行指定的代码 例如只要让某列发生变化时,才执行指定代码 Private Sub Worksheet_Change(ByVal Target As Range) '判断单元格列号是否为8,也就是H列 If Target.Column = 8 Then Call 筛选 End If End Sub 或者 Private Sub Worksheet_Change(ByVal Target As Range) '判断单元格列号是否为8,也就是H列 If Target.Column <> 8 Then Exit Sub Call 筛选 End Sub 4、第三种解决方案:例如只要让某单元格发生变化时,才执行指定代码 Private Sub Worksheet_Change(ByVal Target As Range) '笔记9.10 If Target.Address <> "$H$2" Then Exit Sub Call 筛选 End Sub 2、Worksheet_SelectionChange (选区发生变化去执行宏) Private Sub Worksheet_SelectionChange(ByVal Target As Range) '改颜色前需要将工作表的背景色改为透明色(xlNone) Cells.Interior.Color = xlNone '选中的单元格整行改颜色 Target.EntireRow.Interior.Color = RGB(255, 0, 0) '选中的单元格整列改颜色 Target.EntireColumn.Interior.Color = RGB(255, 0, 0) End Sub 3、用批注记录单元格修改情况 '在所有过程之前用Dim语句定义的变量r1是模块级变量,应模块中所有的过程都可以使用它 Dim r1 '定义一个模块给变量,用户保存单元格的数据 '第一个事件过程,用于记录被更改前单元格中保存的数据 Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Cells.Count <> 1 Then Exit Sub '选中多个单元格时退出程序 If Target.Formula = "" Then '根据选中单元格中保存的数据,确定给变量r1赋什么值 r1 = "空" Else r1 = Target.Text End If End Sub '第二个事件过程,用于批注记录单元格修改前后的信息 Private Sub Worksheet_Change(ByVal Target As Range) If Target.Cells.Count <> 1 Then Exit Sub '定义变量保存单元格修改后的内容 Dim r2 '判断单元格是否被修改为空单元格 If Target.Formula = "" Then r2 = "空" Else r2 = Target.Formula End If '如果单元格修改前后的内容一样则退出程序 If r1 = r2 Then Exit Sub '定义一个批注变量 Dim r3 '定义一个变量保存批注内容 Dim r4 '将被修改单元格的批注赋给变量r3 Set r3 = Target.Comment '如果单元格中没有批注则新建批注 If r3 Is Nothing Then Target.AddComment '将批注的内容保存到变量r4中 r4 = Target.Comment.Text '重新修改批注的内容=原批注内容+当前日期和时间+原内容+修改后的新内容 Target.Comment.Text Text:=r4 & Chr(10) & Format(Now(), "yyyy-mm-dd hh:mm") & "原内容:" & r1 & "修改为:" & r2 '根据批注内容自动调整批注大小 Target.Comment.Shape.TextFrame.AutoSize = True End Sub 4、【进阶】用Change事件模仿收银机 Private Sub Worksheet_Change(ByVal Target As Range) '同时更改多个单元格时结束执行程序,CountLarge和count功能一样 'CountLarge不会溢出,但是count会,xlsx单元格太多了,容易发生数据类型溢出 If Target.CountLarge <> 1 Then Exit Sub '输入数据为空时退出 If Target.Value = "" Then Exit Sub '输入行号是第1行时退出 If Target.Row = 1 Then Exit Sub 'i代表商品表的行数 Dim i '当输入等于第2列时 If Target.Column = 2 Then '如果出错了,就是没找到,跳转到标签a On Error GoTo a 'Excel基础课函数篇06和07,match返回输入的商品名称来自参照表第几行 i = Excel.Application.WorksheetFunction.Match(UCase(Target.Value), Range("H:H"), 0) '禁止事件,防止将字母改为商品名称时,再次执行程序 Excel.Application.EnableEvents = False With Target .Value = Range("I" & i).Value '笔记9.4 下移行,右移列 .Offset(0, -1).Value = Now .Offset(0, 1) = Range("J" & i).Value .Offset(0, 2) = Range("K" & i).Value '输入商品名称后,选中销售数量的单元格 .Offset(0, 3).Select End With Excel.Application.EnableEvents = True Exit Sub a: MsgBox "没有该商品,请联系维护人员" Target.Value = "" Else If Target.Column = 5 Then Application.EnableEvents = False Target.Offset(0, 1) = Target * Target.Offset(0, -1) Cells(Target.Row + 1, 2).Select Application.EnableEvents = True End If End If End Sub 三、工作薄事件 1、Open事件,实现自动选中首页的功能 Private Sub Workbook_Open() Sheets("首页").Select End Sub 2、BeforeClose事件:在关闭工作簿之前发生 'Cancel是过程参数,用来确定是否响应关闭操作,值为F关闭,值为T不能关闭 Private Sub Workbook_BeforeClose(Cancel As Boolean) If MsgBox("你确定要关闭工作簿吗?", vbYesNo) = vbNo Then Cancel = True End If End Sub 恶作剧:永远无法关闭的工作簿 Private Sub Workbook_BeforeClose(Cancel As Boolean) MsgBox "有本事你把我关闭!" Cancel = True End Sub 3、 SheetChange事件:更新任意工作表中的单元格时发生 与工作表中的Change事件不同的是,工作表事件针对 一张工作表,如果你所有工作表都要执行这个事情,就可以用工作簿事件中的SheetChange 当工作簿中任意一张工作表单元格被更改时,都自动执行该事件编写的事件过程 比如那个十字修改颜色的代码就可以写在这里 'sh代表被更改单元格所在的工作表,Target代表被更改的单元格 Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) MsgBox "您正在修改的是:" & Sh.Name & "工作表中的" & Target.Address & "单元格" Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) End Sub 例如:如果只想让更改名称Sheet1之外的工作表中的单元格,才执行事件过程 'sh代表被更改单元格所在的工作表,Target代表被更改的单元格         Private Sub Workbook_SheetChange(ByVal Sh As Object, ByVal Target As Range) If Sh.Name <> "Sheet1" Then MsgBox "您正在修改的是:" & Sh.Name & "工作表中的" & Target.Address & "单元格" End If End Sub 4、BeforeSave 保存之前执行事件 Private Sub Workbook_BeforeSave(ByVal SaveAsUI As Boolean, Cancel As Boolean) ThisWorkbook.SaveCopyAs "c:\" & Format(Now(), "yyyymmddhhmmss") & ".xlsx" End Sub 注:format相当于Excel函数中的Txet(转成文本函数),Now()返回现在日期时间函数,yyyymmddhhmmss指的是年月日时分秒的格式。 如果你想知道谁喜欢偷看你电脑上的文件,你可以在打开工作簿事件中,写上这行代码,当你发现具体日期和时间被人查看过文件后,去调监控吧 5、NewSheet创建新表时,复制一张新的模板 Private Sub Workbook_NewSheet(ByVal Sh As Object) Sheets("表1").UsedRange.Copy Sh.Range("A1") Sh.Range("A2:F11").Value = "" End Sub 6、让文件自动保存 Sub otime() '10秒后自动运行WbSave过程 Application.OnTime Now() + TimeValue("00:00:10"), "WbSave" End Sub Sub WbSave() ThisWorkbook.Save '保存本工作簿 Call otime '再次运行otime过程 End Sub 为了让工作簿打开就自动运行: Private Sub Workbook_Open() Call otime End Sub 7、【重要资料】MsgBox语法和参数 第17节:用户信息交互 一、InputBox函数 1、参数定义: InputBox函数共有5个参数: prompt:用于设置在对话框中显示的提示信息 Title:用于设置对话框的标题 Default:是对话框中默认的输入值 xpos:用于设置对话框左端与屏幕左端的距离 ypos:是对话框的顶端与屏幕顶端的距离 2、案例: Sub a() Dim i i = InputBox(prompt:="我是提示信息", Title:="我是标题", Default:="默认输入值", xpos:=2000, ypos:=2500) Range("A1") = i End Sub 可以简写:但是位置不能变,只有prompt必选,其它都是可选,如果中间的参数省略一定要用逗号隔开 Sub a() Dim i i = InputBox("我是提示信息", "我是标题", "默认输入值", 2000, 2500) Range("A1") = i End Sub 二、InputBox方法 1、Inputbox方法Type参数的可设置项及说明 2、案例: Sub a() Dim i i = Excel.Application.InputBox(prompt:="我是提示信息", Title:="我是标题", Default:="默认输入值", Left:=2000, Top:=2500, Type:=1) Range("A1") = i End Sub 三、MsgBox语法和参数 1、语法与参数 四、【获取路径+文件名】 GetOpenFilename方法 1、定义及参数 GetOpenFilename方法:获得在对话框中选中的文件的文件名称(包含路径) 如果你希望程序在运行过程中,手动选择文件,再根据文件路径及名称进行其它操作,就使用GetOpenFilename方法 例如:多个工作簿合并其内容,运行中可以让用户手工选择文件进行合并。 参数: GetOpenFilename (文件类型,优先类型(1或2),对话框标题,按钮文字,是否支持多选) GetOpenFilename(FileFilter, FilterIndex, Title, ButtonText, MultiSelect) 2、案例1:让对话框显示所有类型的文件 Sub a() Dim i i = Excel.Application.GetOpenFilename If i = False Then MsgBox "没有选择任何文件!" Exit Sub Else Range("A1") = i End If End Sub 3、案例2:只在对话框中显示指定类型的文件 Sub a() Dim i i = Excel.Application.GetOpenFilename("图片文件,*.jpg") If i = False Then MsgBox "没有选择任何文件!" Exit Sub Else Range("A1") = i End If End Sub 4、案例3:让对话框同时显示同一类型的多种扩展名的文件 Sub a() Dim i i = Excel.Application.GetOpenFilename("Excel文件,*.xls;*.xlsx;*.xlsm") '注意:后缀是分号 If i = False Then MsgBox "没有选择任何文件!" Exit Sub Else Range("A1") = i End If End Sub 5、案例4:让对话框选择显示多种类型的文件 Sub a() Dim i i = Excel.Application.GetOpenFilename("Excel文件,*.xls;*.xlsx;*.xlsm,Word文件,*.doc;*.docx;*.docm") If i = False Then MsgBox "没有选择任何文件!" Exit Sub Else Range("A1") = i End If End Sub 6、案例5:通过FilterIndex参数设置默认显示的文件类型 Sub a() Dim i i = Excel.Application.GetOpenFilename("Excel文件,*.xls;*.xlsx;*.xlsm,Word文件,*.doc;*.docx;*.docm", FilterIndex:=2) If i = False Then MsgBox "没有选择任何文件!" Exit Sub Else Range("A1") = i End If End Sub 7、案例6:设置允许同时选择多个文件 Sub a() Dim i i = Excel.Application.GetOpenFilename("Excel文件,*.xls;*.xlsx;*.xlsm", MultiSelect:=True) If IsArray(i) Then Range("A1").Resize(UBound(i), 1) = Excel.Application.WorksheetFunction.Transpose(i) Else MsgBox "已取消操作!" End If End Sub 五、【另存为】对话框 GetSaveAsFilename方法 Sub a() Dim i 文件名 = "孙兴华" 文件类型 = "Excel文件,*.xls;*.xlsx;*.xlsm,word文件,*.doc;*.docx;*.docm" 标题 = "我是标题" i = Excel.Application.GetSaveAsFilename(InitialFileName:=文件名, filefilter:=文件类型, FilterIndex:=2, Title:=标题) Range("A1") = i End Sub 六、【获取路径】FileDialog属性【用处不大】 1、定义: 只需要获取路径,不要文件名 Excel.Application.FileDialog(filedialogtype:=参数) 参数见下表 msoFileDialogFilePicker 允许选择一个文件 msoFileDialogFolderPicker 允许选择一个文件夹 msoFileDialogOpen 允许打开一个文件 msoFileDialogSaveAs 允许保存一个文件 Sub test1() '选择文件 Dim dig Set dig = Application.FileDialog(msoFileDialogFilePicker) '定义对象,指定参数 With dig .AllowMultiSelect = True '允许多选 .Filters.Add "Excel文件", "*.xls*", 1 '默认文件类型 .InitialFileName = ThisWorkbook.FullName ''d:\' '默认路径 .InitialView = msoFileDialogViewDetails '文件显示方式 .Title = "对话框测试" '对话框标题 If .Show = 0 Then 'show显示对话框,判断返回值 MsgBox "你点了取消" Else MsgBox dig.SelectedItems(1) '取得选择的文件名 End If End With End Sub 注:这里显示对话框用到的是show方法,而show方法是可以返回值的,返回0代表点了取消,否则返回-1。选择的文件名称是保存在SelectedItems数组中,通过该数组来调用相应的文件名,选了一个可以单独调用,多个就循 环调用。 Sub test2() '选择文件夹 Dim dig   Set dig = Application.FileDialog(msoFileDialogFolderPicker) '选择文件夹 With dig .AllowMultiSelect = True .InitialFileName = "D:\" .Title = "对话框测试" If .Show = 0 Then MsgBox "你点了取消" Else MsgBox dig.SelectedItems(1) End If End With End Sub Sub test3() '打开文件 Dim dig Set dig = Application.FileDialog(msoFileDialogOpen) With dig .AllowMultiSelect = True .Filters.Add "Excel文件", "*.xls*", 1 .InitialFileName = "D:\" .Title = "对话框测试"   If .Show = 0 Then '判断是否点了取消 MsgBox "你点了取消" Else .Execute '执行打开命令 MsgBox "文件已打开" End If End With End Sub 注:执行打开命令需要在Show方法之后调用Execute方法,而之前的两个代码是没有Execute方法的,如果在Show之后不执行Execute那这个代码也可以用来返回文件名,和前两个代码没有区别。 Sub test4() '另存文件 Dim dig Set dig = Application.FileDialog(msoFileDialogSaveAs) With dig .AllowMultiSelect = True .InitialFileName = ThisWorkbook.FullName .Title = "对话框测试" If .Show = 0 Then '判断是否点了取消 MsgBox "你点了取消" Else .Execute '执行打开命令 MsgBox "文件已保存" End If End With End Sub 2、【通用】文件选择对话框 '选择单个文件对话框 Sub SelectSingleFileDialog() '通过对话框选择文件 With Application.FileDialog(msoFileDialogFilePicker) .Title = "Select A File" '选择窗口的标题 .InitialFileName = "D:\TestFolder\TestFile.txt" '初次打开窗口的路径以及默认名称 .AllowMultiSelect = False '是否允许选择多个文件 .Filters.Clear '清除现有规则 .Filters.Add "Text File", "*.txt" '增加规则 .Filters.Add "EXCEL File", "*.xlsx; *.xls", 1 '增加规则到第一位 .Filters.Add "All File", "*.*", 1 '增加规则到第一位 If .Show Then '显示文件选择对话框 .ButtonName = "Select Me" Set ipath = .SelectedItems '获取选择项,无论是否选择一项还是多项,返回的选项都是多项 End If End With If IsEmpty(ipath) Then Exit Sub '如果按取消键,退出 ipath = ipath(1) '获取第一项选择 Debug.Print ipath '输出选择文件名   End Sub 3、【通用】文件夹选择对话框 '选择一个文件夹 Sub SelectFolderDialog() '通过对话框选择文件夹 With Application.FileDialog(msoFileDialogFolderPicker) .Title = "Select Folders" If .Show Then ipath = .SelectedItems End If End With If IsEmpty(ipath) Then Exit Sub '如果按取消键,退出 Debug.Print ipath(1) '输出文件夹路径 End Sub 七、实战1:打开一个或多个文件并写入数据【多选】 Sub a() Dim i, w1, arr arr = Excel.Application.GetOpenFilename("Excel文件,*.xls*", MultiSelect:=True) If IsArray(arr) Then For i = LBound(arr) To UBound(arr) Set w1 = Workbooks.Open(arr(i)) w1.Sheets(1).Range("A1") = 520 w1.Save w1.Close Next Else MsgBox "已取消操作!" End If End Sub 八、实战2:多个Excel文件合并 Sub a() Dim i, w1, arr Set w2 = ActiveWorkbook Set s2 = ActiveSheet arr = Excel.Application.GetOpenFilename("Excel文件,*.xls*", MultiSelect:=True) If IsArray(arr) Then For i = LBound(arr) To UBound(arr) Set w1 = Workbooks.Open(arr(i)) For Each s1 In w1.Sheets s1.Copy after:=w2.Sheets(w2.Sheets.Count) w2.Sheets(w2.Sheets.Count).Name = Split(w1.Name, ".")(0) & s1.Name w1.Close Next Next End If End Sub   第18节:图形界面设计   一、在工作中使用 1、表单控件 2、ActiveX控件 表单控件与ActiveX控件区别: 表单控件:只能用来指定宏,只能用在工作表中 ActiveX控件:有很多属性和事件,不仅可以用在工作表中,也可以使用在窗体中 二、窗体对象设计交互界面   1、VBE-【插入】-【用户窗体】   2、在插入模块那里,选择用户窗体 3、常用窗体属性 三、增加和设置控件 1、【用户输入】TextBox文本框 2、【选择菜单】ComboBox复合文本框 3、【显示内容】 Lable标签 4、【命令按钮】CommandButton 5、案例: Private Sub 确定_Click() Dim r1 As Range, i As Long Set r1 = Worksheets(1).UsedRange 'i代表当前表格最后一行数据的下一行 '起始行+使用区域一共多少行 i = r1.Row + r1.Rows.Count Range("A" & i) = txt姓名.Value Range("B" & i) = txt性别.Value Range("C" & i) = txt成绩.Value '将窗体中输入的数据清除,等待下次输入 txt姓名.Value = "" txt性别.Value = "" txt成绩.Value = "" End Sub 6、窗体的显示位置 默认情况下,显示一个窗体时,Excel会将其显示在Excel窗口的中心位置,但可以通过设置属性来定义其显示的位置。 在模块里面写: Sub 显示窗口() With UserForm1 '属性为0时,可以设置窗体初次显示时的位置由用户定义 .StartUpPosition = 0 '设置窗体顶端离屏幕窗口顶端的距离 .Top = 100 '设置窗体左商离屏幕窗口左端的距离 .Left = 200 .Show End With End Sub 也可以在属性里设置: 7、文件打开时就自动显示窗体 8、操作窗体之外的内容 9、【显示/隐藏】窗体 UserForm1.Show : 显示窗体 UserForm1.Hide : 隐藏窗体 10、【关闭】窗体 关闭窗体方法:Unload 窗体名称 关闭代码所在的窗体:Unload Me 二者区别: 使用【Unload 窗体名称】可以关闭任意的窗体 使用【Unload Me】只能关闭代码所在的窗体 如果是要关闭代码所在的窗体,使用【Unload Me】关闭会更安全。 因为:如果用【Unload 窗体名称】依赖于窗体名称,如果窗体名称改变了,你就要回来改代码。如果用 【Unload Me】无论你的窗体名称怎么变,都不用关心代码问题。 那么【关闭】和【隐藏】有什么区别呢? 关闭:不但会从屏幕上删除,还会将其从内存中卸载,当窗体从内存中卸载后,窗体及窗体中的控件都将还原成 最初的值,代码将不能操作或访问窗体及其中的控件,也不能再访问保存在窗体中的变量。 隐藏:只是从屏幕上消失,等候你再次使用。 就好比一个你输入了很多文字的Word文档,你没保存到硬盘上,它就保存在内存中,你关闭了,就没有了,你 最小化,就叫隐藏。 双击【取消】按钮 Private Sub 取消_Click() Unload Me End Sub 11、【禁止关闭窗体】利用Queryclose事件 12、给控件设置快捷键 13、更改控件的Tab顺序:视图——Tab键顺序 14、在表格上双击某一行数据自动弹出窗体 15、多行文本的相关参数 16、【选择题】ListBox列表框        Private Sub UserForm_Initialize()            数据列表.List = Array("张三", "李四", "王五")        End Sub 1、向列表框中添加项目: 列表.AddItem "新的项目" 2、从列表框中删除项目: 列表.RemoveItem num num(从0开始计数) 3、被用户选中的项目序号 列表.listindex 从0开始计数,用户未做任何选择,则为-1   Private Sub 删除_Click() If 列表.ListIndex <> -1 Then 列表.RemoveItem 列表.ListIndex End If End Sub   Private Sub 添加_Click() If 文本.Value <> "" Then 列表.AddItem 文本.Value 文本.Value = "" End If End Sub   Private Sub 显示人名_Click() '避免用户没有选择就点了按钮 If Not IsNull(列表.Value) Then MsgBox 列表.Value End If End Sub 【补充】常用属性和方法 17、选项按钮和复选框:他们的Value被选中时为True,否则为False Private Sub 确定_Click() Dim 变量1, 变量2 '因为返回值都是T或F If 男.Value Then 变量1 = 男.Caption    '如果想让值等于按钮或选框名字的时候,例如: 按钮.Caption ElseIf 女.Value Then 变量1 = 女.Caption End If Range("A2") = 变量1 '注意复选框不要用Elseif因为是多选 If 协议.Value Then 变量2 = 变量2 & 协议.Caption If 体验.Value Then 变量2 = 变量2 & 体验.Caption Range("B2") = 变量2 End Sub 18、可用性Ebable和可见性Visible 可用性Ebable :值为F,按钮为灰色不可用 可见性Visible:值为F,按钮被隐藏 启用.Enable=True 禁用.Enable=False 显示.Visible=True 隐藏.Visible=False 19、【旋转按钮】SpinButton 除了可见性,可用性 和 标题之外还多了两个属性 MIN最小值 和 MAX最大值 它的事件中没有单击,只有改变 20、常用窗体事件 UserForm.Activate 激活 UserForm.QueryClose 退出 第19节:登录页面案例         编辑于 2021-10-5 06:39
帆软管理平台的权限(部门、职务、角色)与数据权限问题的思考总结
  第一阶段:结合实际业务场景的迫切需求,先用起来: 1、优先满足:以往可能就是单纯的满足各机构及机构部门总、数据分析岗的同事,下载及查阅相关数据; 2、存在风险:对于数据的权限管理也算是比较开放式的管理,科长也可以查阅整个部门的权限; 3、难以拓展:因之前涉及的权限体系,就单纯的1种模式,以部门进行限制,根据帆软设置后台的部门,进行限制; 4、维护麻烦:因之前设置的权限以部门为限制条件,不仅无法做到数据更小粒度化,甚至因业务机构经常调整部门及变更部门名称,导致后期维护成本高。 这当中,主要是使用到了模版后台设置的参数,如下图:参数 GETUSERDEPARTMENTS()【这个就是帆软系统自带的部门字段】,一定要记得选择公式。 则在DS1数据集中,即可使用bm这个参数,在数据集中进行过滤数据,当时这样子就实现了部门数据的过滤。 第二阶段:关注数据风险问题,解决数据权限; 1、针对这个问题,当时思考也是考了很多针对不同的角色跟职务等使用者进行归类:大致分为: 业务条线、管理条线、总经理、条线总、渠道总、部门总、科长、科员、数据分析岗等等 2、职务及角色的交叉,缺乏专业指导的教程及实践模块; 因为这个问题,我还特意请教了 帆软官方的服务,结果他扔给我了文档说明,毕竟是偏向于开发或运维方向的,我也是可以理解的; 说他自己也不是很懂后台管理权限这些模块,只能我自个研究了,然后呢,我自己慢慢琢磨~ 3、当时的设想,也用SQL进行实现了效果: 使用系统参数 GETUSERJOBTITLES()【这个就是帆软系统自带的职务字段】、GETUSERDEPARTMENTS()【这个就是帆软系统自带的部门字段】 权限角色设置:系统功能模块相关 设置可以查阅的板块:管理系统——权限管理——角色——选择具体模块 权限职务设置:跟岗位相关 设置权限查阅数据范围,数据限制:用户管理——机构部门——部门列表——职务列表——用户列表 职务: 业务承保部门:业务总、业务数据、科室、业务员工(限制自身部门查阅) 承保管理部门:管理总、管理数据(可查阅全司数据)、管理员工 where 1=1 ${if(len(trim(GETUSERJOBTITLES()))==0," and 1<>1 ","")} ${if(len(trim(GETUSERJOBTITLES()))>," and b.ks = '"+GETUSERJOBTITLES()+"'","")} ${if((trim(GETUSERJOBTITLES()))='业务总'," and b.bm = '"+GETUSERDEPARTMENTS()+"'"),""} ${if((trim(GETUSERJOBTITLES()))='业务数据'," and b.bm = '"+GETUSERDEPARTMENTS()+"'"),""} ${if((trim(GETUSERJOBTITLES()))='业务员工'," and b.ks = '"+GETUSERJOBTITLES()+"'","")} ${if((trim(GETUSERJOBTITLES()))='管理总'," and 1=1 ","")} ${if((trim(GETUSERJOBTITLES()))='管理数据'," and 1=1 ","")} ${if((trim(GETUSERJOBTITLES()))='管理员工'," and b.ks = '"+GETUSERJOBTITLES()+"'"),""} 结合以上存在的数据风险问题,确实解决了! 4、不足之处: 太麻烦了,特别的乱,而且 当时科室也是要一个一个创建在 帆软管理后台,导致业务结构经常的调整,维护这个也是头疼!维护成本过高! 而且因第一个版本,并不是我亲自参与设计,当时 留下来不少的bug,部门用简称,而且非业务部门竟然没有数据,把非业务部门 归类到了其它部门。 导致,非业务机构,比如财务部人员无法查询自身的业务及相关数据情况;   第三阶段:思考,解决之路! 1、根据以往的经验,也翻阅了很多帮助文档的材料,看到了很多用户管理同步的情况; 但是结合我司实际业务场景,比较不适用,而且比较麻烦,容易将原有的数据覆盖,为了保证数据稳定性,也不敢随意覆盖; 2、今天很认真的思考了一下,为了降低维护后台的成本,需尽量使用本地数据库的结构,随着数据库的更新而权限自动调整; 所以,也重新梳理了俩个模块: 模块一:业务机构,结合公司内部的部门管理,并在帆软后台设置职务:部门总、数据岗、科长、科员,根据本地数据库自带的权限,进行过滤即可; 【主要是解决了,任何人登录系统,根据本身的职务,都可以查阅自身权限内的部门、科室、经办的业务情况,更不会与所做的工作内容冲突】 with dc_bm as(select b.* from v_tb_bm bwhere b.经办代码='${fine_username}')select distinct b.经办姓名 from v_tb_bm bwhere 1=1 and b.部门代码 in(select 部门代码 from dc_bm ) ${if(len(trim(GETUSERJOBTITLES()))==0," and 1<>1 ","")}${if((trim(GETUSERJOBTITLES()))='部门总'," and b.部门代码 in(select 部门代码 from dc_bm ) ","")}${if((trim(GETUSERJOBTITLES()))='数据岗'," and b.部门代码 in(select 部门代码 from dc_bm ) ","")}${if((trim(GETUSERJOBTITLES()))='科长'," and b.科室代码 in(select 科室代码 from dc_bm ) ","")}${if((trim(GETUSERJOBTITLES()))='科员'," and b.经办代码 in(select 经办代码 from dc_bm ) ","")} 在设置模块的时候,遇到一个问题,寻求了朵拉老师的帮助,使用插件SQL完整的提示,才得以解决该问题: 这是未安装插件前的提示,其实并不知原因; 这个是安装插件后的效果,明显的知道原因,进行改进即可。 更加更重要的是有智能提示,对书写SQL提高了很多的效率,简单来说,谁用谁爽! 附上:高级数据库查询下载链接:https://market.fanruan.com/plugin/eddba555-72f9-45c2-b220-62ff4af70678     模块二:管理渠道,结合公司内部的管理渠道,设置不一样的角色,用角色定位,授予不一样的权限范围; 【针对渠道管理,这个问题主要是针对不同的管理部门,并不是以机构或科室为权限范围的情况下,而设置的角色定位】 未完待续!!!!   编辑于 2021-7-20 19:02
目标越明确,行动越利索
首先,今天跟大家分享的是:朵拉老师分享的任务:【FineReport模板制作第一期】玩透人资场景,可点击领取任务!你在平时的工作中,也会碰到哪些难处呢?是否也可以考虑通过做任务,提升个人能力的同时,也赚点F币!!!第一步:下载数据源,并配置数据1、下载数据源,HumanResources.db,并将文件存放在:Fine\FineReport_10.0\webapps\webroot\help 目录下1479932、打开帆软设计器,并配置数据连接,测试数据库连接成功1479943、查阅数据库内表的字段及数据内容,为接下来的要做任务,做好铺垫147995第二步:认真查阅 本次任务的目的或要求:根据个人理解围绕人力资源主题发挥创造,根据任务的要求,其实可以理解为 在原有的模板中(就是到模板市场下载相关主题的模板),进行调整并结合数据库即可。第三步:到模板市场进行下载主题相关的模板147996https://bbs.fanruan.com/task-337-0.htmlhttps://market.fanruan.com/template/20000176147997直接点击下载模板,下载后是一个压缩包,进行解压即可,里面附带很详细的使用说明,附带图片素材及frm源文件【完美,此处应当有掌声】。147998147999第四步:准备开始改造!!!制作属于自己的frm 首先,我们先将模板复制到我们的开发目录下,并打开查阅已有的模板数据源、模板、及目前展示的效果情况。 修改超链接,让三个模块可以互动起来,且三张模板内的链接都要统一修改。 通过这三张的模板,我们也可以看到人力资源部,平时重点跟踪的指标,主要在于三个方面:结构、利润、流量。虽然,本人对于人力资源部的内部情况,他们的业务机构及逻辑不熟悉,但通过学习该套模板,确实从中了解到很多实用的指标。 任何的技术都是为了服务业务,不懂得业务,学的技术再好也是白搭。 所有,要使用模板前,要结合实际自身业务的场景及展示效果,是否可以直接复制并使用呢? 假设 人才利润表、人才机构表,这两张模板符合实际业务场景,那么直接使用即可。 现在针对人才流量表,进行改造。 主要针对展示的图表样式,用其它图表来进行展示,及设置展示的样式等等。 在实际的报告中,正常来说,最差的正常可以用红色来表示,那么就需要进行调整。 针对离职率,其实可以使用 折线图进行展示会更加的看到趋势,进行设置 最终,展示的样式如下: 从折线图中,我们可以看到每年的11月份是离职率最高的点,同时今年同比去年,整体都是比较高,在12月份得到了一定的改善。 那么,要结合实际的业务场景才能知道追究其中的真正原因。 其实,当模板做的这么好的时候,大部分情况下,我们直接复制使用即可,除非需求有特别的要求,否则这么做就很完美了! 既快速高效,又美观完美!   最终,特别感谢一下,各位老师 制作的模板,让我们受益匪浅,自己也可以从中学习如何自己设置模板组件。 学到的一点,那么就是:耐心+细致。 目标越明确,行动越利索。 编辑于 2021-7-20 07:08
走出第一步,就是突破的开始
虽然说,使用帆软官方的手机APP数据分析,已有一年多的时间,但对于某些特定的使用场景还是不够熟悉! 记得上次,业务部门的需求,想根据后台数据的推送,今天刚好看到 咱们可爱的最热情激情的 朵拉老师,就在群里马上咨询了解了一下。 关于消息智能推送这块,确实需要提升能力,自身关于定时任务的理解也可能不够深入。 【FineReport模板制作第一期】玩透人资场景的活动,小伙伴们有时间就认真进来拜读了一下。 再附上,模版市场,我认真看了很多模版,真的非常实用,平时自己都不知道的点~~~ https://bbs.fanruan.com/task-337-0.html 人力资源的模版: https://market.fanruan.com/template/20000176 147366 平时,工作太忙了,真的很难抽空有时间来接触更多的东西,这次是真的要迈出自己勇敢地第一步,不断的尝试新的东西! 收拾一下,下班后,晚上在家再折腾一下! 兄弟们,一起加油搞!!! 编辑于 2021-7-13 18:36
数据追梦人——永不止步
本来定了5月份要考FCRP证书,结果工作上的安排负责帮忙协助总部项目,外加出差没办法顾及到,只能再延期一个月。 其实,从去年学习了《报表工程师从入门到精通·实战班》后,就一直想把学习的内容进行归纳总结并分享给大家,一起共同进步。 最好的学习方式,往往就是不断的总结分享。为了更好的输入,学习跟成长,其实不断的持续的输出是最佳的方式。 当你要把所学习的知识点,给别人讲清楚,说明白,你就要不断的去理清这里面的思路。 帆软虽然在公司已经用了一段时间,但我们之前也并没有受过比较系统的学习,很多人都是一上来就要有设计的能力。 往往也是蜻蜓点水,并未能有时间跟精力去更加深入的了解内部的运行机制及优化。当然,大家平时也是非常忙碌,完全来不及安静的学习。 如果说要给点建议的话: 1、每个人的时间都是24小时,你花了1个小时刷手机玩游戏,那你就少了学习一个小时。时间的非常公平的! 2、态度往往比能力更加重要,很多人可能刚开始不强,但有永不止步的心,他有一天就会 厚积薄发! 3、如果是在同一家公司,同一个岗位,其实每一个人的起点都一样,真正的差距在于 下班后的时间,你如何利用。 考了这个证书,也算是对自己的一个肯定,也非常认可帆软的证书,希望可以在未来数据追梦人的道路上,与帆软一起齐头并进。 提个建议,其实对于付费考证的小伙伴们,还是非常认可帆软的企业,希望 帆软对认证通过的小伙伴们,可以组织起来,一起探讨跟学习。 算是一个社群的构建,将帆软的品牌,越做越好,越做越大! 147166
近朱者赤近墨者黑——FCBA考证经历
当你有明确的目标的时候,全世界都会为你让路! 把时间跟精力,放在学习跟成长的路上! 一、抵触状态 之前,接触report的时间更长久一点,对于BI的后台的管理及分析真的不太熟。 人总是有惰性,对自己不够熟悉跟掌握的东西,都是排斥在外。就是时间跟精力也不够! 就像是,之前领导分享的,有些人呢,是忙着半死,有些人呢,是闲着半死。 正确的事情是 要把时间跟精力,放在学习跟成长的路上! 二、面对现实 BI的接触其实是从今年总公司,向各级分公司推广BI的使用,很多的业务机构不得不学习。 甚至也有开展了几次的培训,我有幸参加了一次,总公司层面对BI的使用会更加广泛。 所有,不得不开始筹备自身,抓紧学习BI的步伐,希望可以在这次总部系统的使用上,也可以用得上。 三、安排行动 刚好在任务的时候,发现了苏瑞老师发布的任务,关于学习BI的指导课程(https://bbs.fanruan.com/task-193.html)是非常的棒! 在上周末,特意安排了一天的时间,开始系统的接触与学习! 虽然说,课程仅仅是一个入门级别的课程,但也重新打开了,我之前对BI的认识,发现了不一样的新大陆! 无论是从数据来源的获取、数据清单的汇总处理、数据的关联、数据的分析展示、图表的钻取、还有 炫酷的特效。 深深的爱上了它,爱不释手啊! 四、总结考证 针对此事的学习,也是做了一些详细的笔记,自己对教学视频中不懂的地方,及存在疑问的地方, 也是可以通过学习文档查阅详细的知识点进行学习(https://help.fanruan.com/finebi/)。 144360 为了检验学习的成效,在前天上午就认证了一下:FCBA。 简单晒下学习的成果! 144359 心中有数,未来可据! 让我们一起成为数据追梦人,让数据成为生产力,让科技引领未来!
心动不如行动,终身学习成长
如果说,何时开始接触帆软,那么可能有点久远了!应该是2018年年底,在总公司参加培训! 一、初次接触 2018年年底培训结束后,回归到分公司。当时作为一名新兵蛋子,那时候还没完全接触到分公司层面的数据展示形式! 回来后,跟领导进行汇报,也分享了两次的帆软工具及展示形式。大家都表示非常的不错,但就是一个比较现实的问题,并没有服务器可以部署! 所以,慢慢的这个事情,就被领导们淡忘了! 二、克服困难 而我还在默默的坚持中,当时也是非常认真的看帮助文档及教学视频,不过当时也是比较头疼,没有比较系统的学习,都是东西拼凑起来的! 不像现在的好环境啊,还有很多的教学指导(FineReport入门学习任务:https://bbs.fanruan.com/task-315.html)跟专业全面的培训班(https://bbs.fanruan.com/course/report/standard?sqtj)。 虽然,没有条件,但自己也慢慢玩起来了!因为我自己主要是针对业务机构的某个部门,就跟他们配合,一起先搞。 这边就要说到,帆软配置的过程也是非常的棒!一键安装,服务器自动部署! 我将自己电脑变成了临时公司内网的服务器,变成我要一直开着电脑,否则他们无法访问!我的电脑还能带得动,但也是比较经常卡顿! 也就比较简单的数据填报,毕竟以往我这还要写python去跑excel的表,插入值班人员到值班表中,非常的麻烦,而且经常有人开着excel表格,导致数据无法正常读取与插入。也是基本上实现了,这些简单的功能! 三、系统学习 过了两年,作为一名,资深数据行业的员工,却无法很好的掌握,新型的报表工具,表示非常的惭愧! 2020年下半年,突然在论坛上看到了饭团老师的官方全方位的教学班,虽然当时还在上海总部出差,每次听课跟做作业也没有落下,说句实话,忙到凌晨2-3点都是很正常的事情。功夫不负有心人,终于,在老师的教导下,终于把帆软这个工具学习的基本上比较透彻。 在今年三月份,课程结束后,自己就考了一个:FCRA。 之后,因为工作上的变动,确实有点忙,5月开始已在慢慢复习之前的课程,也在筹备6月份可以拿下FCRP。 144279 四、总结 心动不如行动,当时就是觉得太难了,一直不敢迈入学习的行列! 鼓励想要学习,甚至已在学习的你们,还有我自己,继续前行! 工具就是这么一回事,永久,用多,就熟了!
如何进行数据的批量增加或更新避免踩坑
一、问题的产生:事虽小,但又不得不做 今日刚好是月底的最后一天,公司某业务部门,又开始使用excel筹备收集值班表。 该值班情况,正常情况下是每月更新一次,但经常有人请假,故导致值班表的更新非常的频繁,导致需要经常删除当月值班表再进行插入。 某业务部门数据岗也觉得每次都要他发邮件,再抄送领导报备,事情一波三折,太过麻烦。虽然此事不是特别着急,但当天内又必须要更新,有时候经常被打断做事节奏。 二、针对问题,如何实现业务自助更新? A、如果根据以往的经验,针对此问题,还真的麻烦,只能找IT开发一个系统,进行批量导入数据。 IT的需求,大家懂的。这个需求并不是必须,而且领导们并不关心,能解决就好了,导致肯定排期遥遥无期。 B、所以,我们数据中心,根据以往的经验,只能通过写自动化程序(python),每次去共享网盘读取指定的EXCEL表的。 但是因为每个月要更新,如果没有提前创建EXCEL表文件,则会导致数据为空,也没办法很好的处理数据。导致每次都要去提醒业务机构, 也是挺麻烦的,而且每次自动化程序,导致电脑的耗损也不少。 三、帆软工具派上用场。 因为通过学习了帆软的课程,帆软工具可以直接对接数据库,而且可以实现填报的功能。尤其是可以进行数据批量的更新; 接下来,进行截屏分享: 1、编写好sql语句 144142 2、设置好模版及参数模版 144144 3、设置报表填报属性,记得设置主键、勾选提高效率 144145 4、设置web属性,及填报背景,刚开始吓我一跳,怎么都变黑了,其实是设置背景的问题。 144147 期间,还特意求助了一下我们的饭团君老师~ 144146 四、突发状况,完美解决 感觉自己太较真了,谨慎了,然后 还是错了,说明啊,人的思维很固定,错了还是没办法意识到自己错了啊。 144149 不知道自己修改了哪里,导致预览填报数据的时候,参数面板消失不见了! 自己折腾了好久,也咨询了群里的小伙伴们,也仍然没有解决! 之后,不得不请教饭团君老师:老师给我了一些方案参考: 隐藏参数面板的方法-https://help.fanruan.com/finereport/doc-view-3229.html 才知道,原来还能自己隐藏的~发现自己还是有很多不了解的地方! 虽然有参考了一些文档,但发现自己的文件参数是正确的,好像也没有出错啊! 自我的认知不够,以为是软件的问题啊~以为是一个bug了! 此时,老师建议我联系技术支持进行解决: 最后,终于在技术老师远程的支持下,完美解决了问题: 144148 最终,定位到问题:写的to_day() 应该是today() 哎 感觉自己就是一个小丑了! 搞半天,原来就是自己犯下的低级错误!!! 四、避免踩坑,分享共赢兄弟们,我自己踩坑了,为了避免后面的兄弟们踩坑,分享出来,希望你们可以完美的避开雷区。 首先,非常感谢饭团君老师的支持,平时有问题确实没办法解决,我就咨询会老师,老师也非常积极给我解决方案!感恩! 其次,深刻的意识到自己的固有思维,很多时候的理所当然,越是觉得没有问题的,越容易出错!还是要扎实的学好基础的函数! 也可以尝试,使用一些新的插件!【增强公式编辑器插件-https://help.fanruan.com/finereport/doc-view-2276.html 可以用这个插件 可以实时计算公式值】 最后,如果大家有什么问题,想咨询或帮助的,欢迎私信~ 编辑于 2021-5-31 18:54 编辑于 2021-6-1 06:34 编辑于 2021-6-1 06:35
超级菜鸟怎么学习数据分析?
本人,曾经一枚大学老师,当了三年计算老师兼就业创业的老师,其中毕业生无数! 让自己头痛的莫过于,毕业季要出必要报告,其实这就是用到从 数据收集、整理加工、数据分析、数据展示,最终上报给领导。 所以,基本上也就这四个步骤:根据这四个步骤,掌握相应的技能就OK了!超简单实用! 1、数据收集: 正常来说,公司如果有自身的系统,有自己的服务器数据库,那么收集数据这块,你就可以省略了,但是 如果没有的话。那么可以建议你,学习 问卷星、或 帆软公司的 简道云,用来做流程设计系统、或管理系统、或信息收集的一个端口跟工具,基础数据是最根本的,没有数据何来分析; 当然,最基本的工具:EXCEL 肯定是必要的(无论是收集还是加工数据都必不可少); 2、整理加工: 数据加工,无论是很规范的数据库,还是自身设计的流程或系统或信息收集表,因为会产生一些对我们来说,没用甚至是影响结果的数据,比如:你想计算毕业生的平均月薪多少,你设计了问题,问毕业生月薪,发给对方填写,对方却填了一个月薪10亿,那么数据这么大,肯定会影响整体的数据结果,那么对这些异常甚至是没有填写的学生,就应该进行二次加工处理。 简单来说,并不是所有的数据都有用。 所以,在第一步设计收集数据的时候,进行数据的简单校验是非常有必要的。 在这个步骤中,如果有数据库的企业,工具推荐:SQL 这是数据的神兵利器! 3、数据分析: 数据的分析,其实更重要的是多看,多了解实际的业务场景,深入了解业务,才能更好的做好充足的分析,比如:领导更关注哪些指标,哪些指标是领导的绩效挂钩,哪些指标是跟自身挂钩。 简单来说,领导认为重点的,那么做就对了!其实,就是一个方向的问题! 4、数据展示: 最终数据的呈现的展示,才是最终你表现的机会。前面看你花了好几周的时间,就是为了拿出一份满意的PPT。 推荐使用:think-cell 工具,虽然是正版要收钱,但是公司可以采购或者自己网上找下很多试用版的,也不收钱的,还好用! 工具:EXCEL、SQL、think-cell 这些是必要的; 不过,现在我们公司是有引进了一家叫做 帆软公司企业 的产品(FineReport、FineBi); FineReport是操作简单却功能极其强大的工具,只要你能想到的,没有它实现不了的。(个人版本免费) 可以满足以上,从 数据收集、整理加工、数据分析、数据展示,更加重要的是,也可以实现手机端、PC端,省去系统的开发,而且丰富的图表展示。 建议你可以多了解看看,而且也有专业的老师跟论坛,有任何问题都可以到这里学习跟提问噢! 随着时代的潮流,把握住 新型工具的使用也是非常必要的!毕竟,现在企业讲究的也是高效与美观,一看就是高大上的那种!花同样的时间学习,当然是学习最好的是最佳的选择!加油!只要肯努力,没有不会的数据分析!如果有任何问题,欢迎留言,谢谢~心中有数,未来有据!让我们一起做一枚数据追梦人! 手机端展示: 143940
12下一页
个人成就
内容被浏览82,791
加入社区5年171天
返回顶部