阅读视图

发现新文章,点击刷新页面。

VBA里搞数据透视表

当年今日

因为我知道我要实现的那个功能,SQL可以做,数据透视表也可以做。就写代码的熟练程度来说,SQL我肯定更熟悉,VBA的数据透视表有很多参数,我搞不懂到底是什么,反正要实现那个功能,通常是录制一个宏,然后看着办,有需要的数据保留下来,不需要的数据直接删掉。录制的宏通常都很啰嗦,里面有非常多没有必要存在的东西。在不了解数据透视表在VBA里的参数的前提下,先进行一个录制显然是比较靠谱的步骤。但有些东西靠录制是录制不出来的,比如某些字段我需要进行筛选,我只知道有些东西是不能出现的,但我没办法确定可以出现的是什么,所以那一堆不能出现的东西都是反参数。在录制宏的时候,你只能看到什么就反选什么,但关键是这个数据源跟那个数据源的那些参数是不一样的。不一样我只能设定一堆反参数,只要它们是其中一个,就不能显示,但实际上这样的反参数让VBA的数据透视默认不出现你就得兜一个大圈,套上好几层公式实现。最终,在我调试的时候发现的确那些嵌套的公式能把那些反参数都排除在外,但如果数据源里所有数据都是反参数的一部分,那么就会报错,于是我又得在外面加一层捕捉错误的判断。真的是非常折腾。为什么之前我考虑的是SQL而不是数据透视表,反参数是其中一个点,另外一个点是排序。在SQL里,使用自定义序列排序是非常简单的事情,但是数据透视表的字段该如何排序呢?兜了一大圈我发现也就只能真的在Excel里面增加自定义序列,但如果我想用即弃呢,于是还得出了一招VBA先增加自定义序列,排序完以后再把自定义序列删除掉。这个操作在ExcelHome的教程里有,他们教的是在VBA里面,对单元格或者数组排序,不是针对数据透视表的,但实际上原理一样。

这个增自定义序列和减自定义序列到底是怎么确认呢?原来Excel还会对自定义序列给一个序号,所以在增自定义序列的时候,你就得把这个序号记下来,在减的时候把那个序号写上去。我不知道为什么其他人说数据透视表的自定义序列好像怎么排都不是自己想要的效果,但就我个人的经验来说,只要你在Excel里增加了自定义序列,当你刷新数据,默认对某个已经自定义过的字段进行升序,那就是你定义的那个顺序,不需要在设置里面搞一大通。但实际上我也搞不懂,手动设置里很麻烦的东西到底是什么。为什么数据透视表里面的排序就不能像普通表格排序那样那么的直观。我要以什么字段排序、以什么标准排序是系统默认的还是自定义序列。当然,数据透视表里还得考虑一个问题,就是有可能是套叠了多个汇总条件的,如果你自定义的是最后一层条件,首先限制你的是前面的那些所有条件,所以你想最后的那个自定义序列完全按照你的想法排列,你只能把它放到最前面。数据透视表跟SQL比起来,我感觉运行速度会慢一点,可能因为我里面判断设置的东西比较多,所以需要闪那么一下才能结束,但是SQL虽然我已经有意识地关注结尾这个问题,但测试频繁以后,SQL是会出现一些莫名其妙的事故,当你把所有东西关掉再打开就正常了。相比之下,数据透视表不会这么神经。

用不同的方法实现同样的事情,得出一样的结果,这种感觉很好。在探索这个的过程中,会让我体会到二者的优劣,以后选择的时候,我就可以更有底气地数出1234。

谈中英文字间距

对比中西方产品设计就会发现,西方设计会更简约、清爽,留白更多,好像他们并不苛刻于空间的利用效率。

人们试图解释这种差异,譬如归结到环境因素,说亚洲人生活压力比欧洲人大,个人拥有的空间更小,这种空间上的局促也反应到了日常使用的产品、文字上。

也有人谈到基因层次,说亚洲人比欧洲人更能接受复杂的信息。

但这两种说法都很难站住脚,ArvinNing 在中英文排版差异时提到:

生活环境更拥挤,你就更喜欢拥挤的界面吗?

很显然是站不住脚的,而关于人种差异的理论也有问题。人类的神经系统是高度可塑性的,有可能并不是神经系统的差异导致人们喜欢不同的产品,而是不同的习惯导致了不同的神经系统结构。

ArvinNing 认为差异的真正源头在于文字的展示效率,由于英文的展示效率不如中文高,所以英文的简洁只是一种「妥协」,不能在移动端产品上利用有限的空间展示等量的中文信息。

而我在这里,想对 ArvinNing 从中英文组成结构及间距空间方面做个补充,微谈一下两种语言产生这种差异的更深层原因。

在此之前,需要先对中英文组成结构做个剖析及对比。

一、中英文组成对比

文字就像一串可以承载信息的编码,我们对文字解码(阅读)之前,需要先编码(书写),编码之前我们要先知道,都有哪些原材料(最小单位)可以让我们编码,他们之间的层级又是怎样构成的。

1. 字母 VS 笔画

英文中,26个字母为最小组成单位,理论上这些字母可以自由组合。

而在中文中,笔画是最小组成单位,从落笔到提笔,笔尖运动所留下的痕迹就是笔画。

简单来说,笔画由不间断的点和线组成,如横(一)、竖(丨)、撇(丿)、点(丶)、折(乛)等。

2. 词根 VS 独体字

有了字母之后,组成单词还需要遵循一定的规律,这种规律就是以大量拉丁词源为代表的英文词根。

古希腊、罗马作为西方乃至整个人类文明的起源,无论从哲学、文学、数理都对当今产生了巨大影响,而文字作为思想的载体,这种影响更为强烈。

对比英国的英文及罗马的拉丁文可以发现,二者之间存在数量庞大的同源词(词根前身)。

拉丁词源

这些同源词(词根)作为英文的基础词,提纲挈领地指挥着字母间的排列组合。

中文的词根则是独体字:

独体字指汉字的一个字只有一个单个的形体,不是由两个或两个以上的形体组成的。这种字大都是一些简单的象形字和指事字。因为这类字是从图画演变而成的,所以每一个字都是一个整体。

譬如日、月、 山、水是象形独体字,天,立,上、下是指事独体字。

这些独体字占汉字总体比例很小,当代《汉语大字典》(2010年版)收字60370个,独体字不超过5%。除了作为单字出现,独体字大多时作为合体字的组成部件——偏旁出现。

比如:私——禾、厶 兵——丘、八

独体字占比不高,但作为整字的「可复用组件」,重要意义不言而喻。

值得一提的是,在这一阶段,英文词根虽然已经有了基础含义,但未完全成为书写的正式单词,而独体字则已进入日常写作范畴。

3. 整字/ VS 单词

大部分词根需演变成单词才能正式使用,而中文此时已经从独体字演变成更复杂的整字,即我们最常使用的方块字。

整字多由二到三个「部件」组成,这些部件就是上一步提到过的独体字。

独体字:一、人、及、册、事

整字(合体字):倍、街、衷、国、麟

最后,中英文组成结构如下:

英文:字母(均不具语义,使用性)=>词根(具有语义,低使用性)=>单词(具有语义,具有使用性)

中文:笔画(均不具语义,使用性)=>独体字(具有语义,完整使用性)=>整字(具有语义,具有使用性)

至此,中西文组成对比告一段落。

有了这些书写工具之后,下一步需要考虑如何更好地阅读这些字。

二、文字之间的间隔

人很难掌握高复杂度的东西,阅读大段密集文字同样不是一件易事。

1. 标点、段落与空格

软件工程思维中,可以将复杂逻辑进行拆分,稀释成多个可复用组件,逐个击破,阅读文字也是如此。

有了字母之后组成单词还需要遵循一定的规律这种规律就是以大量拉丁词源为代表的英文词根古希腊罗马作为西方乃至整个人类文明的起源无论是从哲学文学数理领域都为当今留下了巨大影响而文字作为思想的载体这种影响更为突出随着英国的古英文以及罗马的拉丁文相互交融英文和拉丁文之间有着数量庞大的同源词

无论何种文字,都大多会引入标点/段落这种可将长文字拆分成小段的「模块化」解决方案。

有了字母之后,组成单词还需要遵循一定的规律,这种规律就是以大量拉丁词源为代表的英文词根。

古希腊、罗马作为西方乃至整个人类文明的起源,无论是从哲学、文学、数理领域都为当今留下了巨大影响,而文字作为思想的载体,这种影响更为突出。

随着英国的古英文以及罗马的拉丁文相互交融,英文和拉丁文之间有着数量庞大的同源词。

对于英文来说,还需引入空格来分割单词。

iwillgohomeandgotobed

而空格是中文所不需要的。

i will go home and go to bed

2. 为什么中文不需要空格

之所以英文需要空格,原因在于英文字母的粘连性非常严重:

iw ill goho me andg otobed

假设上段英文各个间隔单词都有正确含义,很明显这样的排列组合和最初的意思截然不同,字母间的组合顺序很容易改变单词及句子的意思。

为什么中文不需要空格?

有了字母之后组成单词还需要遵循一定的规律这种规律就是以大量拉丁词源为代表的英文词根古希腊罗马作为西方乃至整个人类文明的起源无论是从哲学文学数理领域都为当今留下了巨大影响而文字作为思想的载体这种影响更为突出随着英国的古英文以及罗马的拉丁文相互交融英文和拉丁文之间有着数量庞大的同源词

上面这段中文,人们从左向右阅读,其实可以借助字的语义切分长文字

中文根据语义切分长文字

这里的关键点在于中文在组成句子的过程中,人阅读时识别的最小单位已不是笔画而是独体字,这些独体字或整字在句子中出现时,人们会自动向左/右找寻有语义的词组,自动组合,从而解析出整个句子的含义。

而英文组成句子的过程中,人能识别的最小单位仍是字母:

iwillgohomeandgotobed

字母本身不具备语义,人们无法为其做语义化分割,也就无法推断句子的意思。

三、为什么字母不具有语义

现在我们再进一步,问个问题,作为有着类似字组成结构的中英文,为何空格的作用对英文如此大?

1. 李约瑟难题

这个问题类似于李约瑟之问:为什么近代科学在欧洲出现,而不是历史悠久的中国?

对于李约瑟之问,正确的回答从来不是某些看似合理的分析,从而落入以西方为叙述中心的陷阱。

正确的回答应该是作出反问,为什么近代科学出现在西方?

别人都行,你为什么不行?别人都不行,就你行?

上面两个问题,后者更容易得出「行」的背景与原因,而不是分析不行的原因,因为正如托尔斯泰所说,行的人大同小异,不行的人各有各的不行:)

所以,我们现在换个问题,为什么中文不需要空格?

我们仔细观察后可以发现,英语是一维的文字,无论是书写(构造)还是解读上都是按照从左到右的顺序。

英文四线格

英文四线格和中文田字格最大的不同在于中文多了垂直维度的约束条件。

中文田字格

多一个维度的约束条件也很容易理解,毕竟中文整字的组成结构要比英文复杂多了。

中文整字结构:

  • 左右结构:挣、伟、休
  • 上下结构:志、苗、字
  • 左中右结构:湖、脚、溅
  • 上中下结构:奚、髻、禀
  • 半包围结构:
    • 右上包围:句、可、司
    • 左上包围:庙、病、房
    • 上三包围:同、问、闹
    • 下三包围:击、凶、函
    • 左三包围:区、巨、匝
  • 全包围结构:囚、团、因
  • 镶嵌结构:坐、爽、夹

整字的组成涉及上、中、下、左、右方位,自然需要从「口」字格再分四份,分成「田」字格才够用。

由此可以看出,中文之所以不需要空格和标点,也能勉强识义,是因为独体字/整字比字母多了垂直和水平两到三个维度。

比如,「挣」虽是一个字,但其左右结构,真正对应英文的应该是「to」。

上下结构的「志」,可以对应成翻转90度的「to」。

左中右结构的「湖」,可以对应「and」。

无论是「to」还是「and」,他们在英文中都已具有语义和使用性。

2. 中英文在计算机中的存储方式

有意思的是,这种组合方式还体现在计算机对中英文的存储方式上。

ASCII码中,一个英文字母(不分大小写)占一个字节的空间,一个中文汉字占两个字节的空间。

即:

英文:to=2字节

英文用的半角标点(空格、逗号、句号)=1字节

中文:「到」=2字节

中文用的全角空格(空格、逗号、句号)=2字节

英文:I am going to be home soon, please don’t worry.=35+12=47字节

中文:我马上就要到家了,请你不要担心。=16*2=32字节

无论在书写还是存储上,中文确实要比英文效率高。

四、高效率的背后

中文的高效率,不如说是压缩更多信息量,对相对空间的绝对压榨

1. 成功的人一定付出很多

假设我们定义1个笔画可以存储1字节信息量。

「懂」有19笔画,也就是有19字节的信息量;

「understand」有18笔画18字节的信息量。

我们再定义字节效率比=总信息量/所占字节数。

「懂」占2字节,效率比=19/2=9.5

「understand」占10字节,效率比=18/10=1.8

二者效率比相差5倍左右。

我们现在可以得出结论:

中文在书写和存储上的高效率更多是由于中文笔画有很强的压缩性。

这种强压缩性的笔画,由于汉字间架结构的高复杂度,可以在单位空间内尽可能地二次压缩信息量。

中文复杂的间架结构

2. 高效率的担忧

尽管中文在展示上有很高的效率,但却远远没有英文易传播。

原因除了英国当时的殖民扩张之外,还有中文相比英文较高的学习成本。

对于一个非英语,非中文语系的人来说,看懂中文要比英文难的多。

中文太紧凑了,各种间架结构十分复杂,书写也更加多维,对新人来说,读和学都要比英文困难。

中文紧凑排版

五、利用字间距稀释文字

探讨完中英文的组成结构,我们或许可以试着从字间距这一角度去理解中文互联网排版上的诸多流行实践。

排版作为「形式」而言,第一要义是服务于功能,即如何让读者更容易接受作者的观点。除去内容质量以及文笔这些内在要素之外,排版能起到的作用在于对中文的高信息密度进行「稀释」,降低人们的阅读压力。

1. 垂直方向的稀释

分段

最简单直接的稀释方式莫过于分段,长文字按照语义逻辑进行分块,每一块就是一段。

自媒体常用的一句一段稀释的太重了,在移动页面,比较让人容易接受的一个段落最好不要超过屏幕的三分之二。

还有一种段之间比较常用的方式是插图,图片作为与文字截然不同的信息展示载体,自然可以充当人们的阅读「缓冲带」。

但很多情况下,图作为更高信息密度载体的身份总是被弱化,「一图胜千言」的效果被弱化,很对文章配图配不上它的高信息密度,止步于「缓冲带」。

标题上下间距

人们喜欢看提纲挈领的东西,原因在于这些承上启下的语句充当了人们的「路牌」。

譬如常用的小标题(H2、H3),它们作为段落的综述,是对下文的高度提炼,人们可以通过这些「路牌」快速领会下文大义,它们很友好。如果将阅读一篇文章比作在高速上开车,那路上的「路牌」就是我们必须高亮注意的信息点。

所以,「路牌」和下文之间的间距关系也同样不可忽略。

简单来说,「路牌」的启下性决定了其与后文的联系要更紧密一些,所以比较流行的实践是将小标题的上间距(margin-top)设置成下间距(margin-bottom)的二到三倍。

同时,小标题下间距最好和段落间距保持一致,这样给人感觉小标题和下文更有整体性。

2. 水平方向的稀释

两端缩进

没有人喜欢杂乱,而在排版中,由于人们的阅读顺序是从上到下,左右方向如果留出空白,可以减轻人们的阅读紧迫感。

比如可以利用两端缩进将正文向中间挤压,呈现文字居中感。

六、字间距只是 Typography 的冰山一角

字体排版能聊的还有很多,合理地控制字间距(广义)只是冰山一角,其思路还是从源头上将中文天生的高信息密度结构进行合理稀释,降低人的阅读压力,而之所以中文不像英文需要词间空格,也是因为高密度结构所带来的高信息量而让独体字/整字在句子中具有可识别性。

Typography(字体排印学)被誉为 Two-dimensional building (二维的建筑),说明其不仅仅止步于对字号、字体、栏宽、行高的调整,而更着力于通过排版让文字更容易辨认,增强可读性,它是技术与美学构成的二维建筑学。

英文的字体排印,比较领先,值得推荐的例子是 The OutlineThe Padding,前者牺牲了一定的阅读体验来追求极致的网页端排版设计,后者则是交互性上给人留下深刻印象,都值得国内排版爱好者关注。

中文环境下的优秀案例较少, Type Is Beautiful作为其中的活跃分子,也经常通过文章与播客的形式分享中文排版的经验心得。

中文互联网字体排印还处在初级发展阶段,但也因如此,很有可能会出现一些打破常规的亮眼设计,带给我们惊喜。

本文首发WEB VIEW ,同步少数派,任何人未经许可不得转载。

❌