ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

EH搜索     
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 Excel Home精品图文教程库
Excel不给力? 何不试试FoxTable! Excel 2016函数公式学习大典 Office知识技巧免费学 打造核心竞争力的职场宝典
300集Office 2010微视频教程 Tableau-数据可视化工具 精品推荐-800套精选PPT模板,点击获取 ExcelHome出品 - VBA代码宝免费下载
你的Excel 2010实战技巧学习锦囊 欲罢不能, 过目难忘的 Office 新界面 Excel VBA经典代码实践指南
楼主: 缘之绘

[求助] 生成报表的样式

[复制链接]

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-17 19:45 | 显示全部楼层
fanyoulin 发表于 2020-6-17 15:35
1、没有生成新的工作簿,而是直接在本工作簿生成新的价格表。因为我先要调试,就先在本工作簿来反复调整 ...

在生成的表格中,有个问题,当在下面2个的时候发生重复

TA的精华主题

TA的得分主题

发表于 2020-6-17 20:28 | 显示全部楼层
zpy2 发表于 2020-6-17 14:56
并排的还真搞不来,搞个这样的。。

老师,您好:如何去除不需要的工作表,只对其他工作表的做保护

TA的精华主题

TA的得分主题

发表于 2020-6-18 08:18 | 显示全部楼层
缘之绘 发表于 2020-6-17 19:45
在生成的表格中,有个问题,当在下面2个的时候发生重复

没看明白,你举个例子我检查下

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-18 09:03 | 显示全部楼层

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-18 09:06 | 显示全部楼层
就是刚好一个类别完了,又是1-3行没有办法写的时候,换例的时候都会重复上一个类别的品种

TA的精华主题

TA的得分主题

 楼主| 发表于 2020-6-18 14:47 | 显示全部楼层

TA的精华主题

TA的得分主题

发表于 2020-6-18 15:31 | 显示全部楼层
缘之绘 发表于 2020-6-18 09:06
就是刚好一个类别完了,又是1-3行没有办法写的时候,换例的时候都会重复上一个类别的品种

你的范本文件无法得出你截图的那个例子,我只能再去查看代码的逻辑。你尝试修改下面的代码:
把:
            If Len(arr3(i + 1, 1)) > 0 And Len(arr3(i + 1, 2)) = 0 And j > s - 3 Then
                Exit For
            Else
                i = i + 1
            End If

改成:
            If Len(arr3(i + 1, 1)) > 0 And Len(arr3(i + 1, 2)) = 0 And j > s - 3 Then
                i=i+1                            '在这里插入一行
                Exit For
            Else
                i = i + 1
            End If



这里的 if 就是来 排除在底部 2 行显示类别的条件,s为40行,s-3就是37行,大于37行就不再继续显示类别了,需要切换到下一栏;
Len(arr3(i + 1, 1)) > 0 And Len(arr3(i + 1, 2)) = 0 是指数组第1位有内容,第2位为空,如果不是类别,则arr的第1位到第4位都是非空;

不管是哪种情况,i=i+1我感觉都是需要的,它表示数组要往后前进 1 位;
如果还不行,你再把你有问题的文件上传,如果数据需要保密,可用乱七八糟的随机字符替换;

TA的精华主题

TA的得分主题

发表于 2020-6-18 16:00 | 显示全部楼层

我刚回复了,需要审核,你稍等一下。另外,我稍微讲下思路,便于你灵活修改:1、前半段是数组生成,生成的结果都在数组 arr3 中。arr3定义为1000行,但实际的使用由参数 hs 决定;
     有个不合理的设定:hs起始是1 ,我觉得起始为 0 比较好。实际数据是hs-1行,后来循环都是用的hs-1,容易产生迷惑;
2、生成数据用了字典+数组的反复循环,只是为了维持类别的排列顺序,字典是多余的,直接去读参数表的类别顺序就可以了,当时没想好这点;
3、类别需要字体放大,为了维持与模板的协调,每个类别需要占用两行,arr3数组的数据格式如下:
     类别   单位  价格  备注
     青菜1  空     空     空
     空       空     空     空
     白菜   斤     2.0    空
     ...
     类别占用两行的好处是可以合并单元格,用于显示大字体,如果只是用行高来调整,那么同行次的其他栏会很不协调,模板也不好定义;
     为了产生类别占用2行的效果,有代码:
           If Not bz Then      'bz初始值是false,表示是个新类别
              bz = True          '类别只能写入一次,然后改变标志
              arr3(hs, 1) = s   '写入类别名称
              hs = hs + 2       '行数+2,这就是占两行的效果

           每个类别都会产生一次上面的判断,因此每个类别都会被写入一次,而且只会写入一次,这里的代码是个双循环;
4、然后接下来就是对arr的输出,不管输出结果正确不正确,arr数据本身应该是不会错的,容易出错的就是对类别的排除算法,可能会导致数组没有正常进位;
    你可以在代码:
       s = Worksheets("模板").Range("q2")      '读取模板参数每页行数
    设置断点,然后查看arr3数组的内容,总行数是hs-1。这样可以让你核对显示结果是否与 arr3 一致,如果有误差,那就是后面的显示算法有问题;

评分

参与人数 1鲜花 +2 收起 理由
缘之绘 + 2 优秀作品

查看全部评分

TA的精华主题

TA的得分主题

发表于 2020-6-18 16:02 | 显示全部楼层

我回复了两个贴,都在审核,你稍等;
两个回复的内容是不一样的;

TA的精华主题

TA的得分主题

发表于 2020-6-18 16:16 | 显示全部楼层
本帖最后由 fanyoulin 于 2020-6-18 16:21 编辑

关于模板,你再补充说下:
1、标题和正文字体、大小都是模板来定义的,只有类别的大小和每个栏目之间的浅灰色线是代码直接指定的,你如果觉得字体和字号不合适,去调整模板即可,比如你想用楷体,把模板单元格的字体改掉;
2、除了标题,模板内容是空白的,如果你要改字体,该去改哪里呢?
     生成报表的时候,是先把模板表复制一份,然后再写入数据的。假如你把模板表的a10单元格改成了楷体20号字体,而a11单元格用行书9点,那么生成的所有表,a10单元格都会是楷体20,a11也都是行书9;
3、由于有每页行数的定义,所以模板表设置格式的区域起码要有 每页行数+3 行,其中标题占3行;
     我预设的格式实际是到a100为止,再后面的区域就没管它了;     区域设置过多在打印时也要注意下,由于是先复制模板表,已经设置格式但未写入数据的区域,系统也会自动识别为数据区域,在打印预览会把这些没数据的区域也计算进来,所以需要设定打印区域才保险;



您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

关注官方微信,高效办公专列,每天发车

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2020-9-21 20:29 , Processed in 0.082542 second(s), 17 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2021 Wooffice Inc.

   

沪公网安备 31011702000001号 沪ICP备11019229号

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:徐怀玉律师 李志群律师

快速回复 返回顶部 返回列表