分享

Excel VBA解读(55):在VBA中使用公式1——Formula属性和FormulaR1C1属...

 L罗乐 2017-05-09

 

Excel中,我们经常使用各种各样的公式来进行数据的计算分析和处理,在VBA中也不例外。本文将介绍VBA中使用公式的相关属性。

为了更好地使用公式,让我们先看看Excel中的A1引用样式和R1C1引用样式,再来介绍VBA中与使用公式相关的属性。

 

理解A1引用样式和R1C1引用样式

Excel默认设置为A1样式引用,也就是我们熟悉的行以数字表示,列以字母表示。例如,A1表示工作表或者单元格区域左上角的单元格。

Excel还可以设置为R1C1样式引用,行列都以数字表示。例如,使用R1C1表示工作表左上角的单元格。此时,需要调出“Excel选项”对话框,勾选“R1C1引用样式”。

在下面的工作表中,我们使用了计算公式。其中,

  • E = C * D

  • F = E * 单元格I2

  • G = E – F

  • 单元格G8 = 单元格区域G2:G7之和

我们就以这张工作表来分析理解A1样式和R1样式。

 

使用A1样式公式如下图:

通常,我们在单元格中输入公式后,往下拉即可复制公式。例如,在单元格E2中输入公式=C2*D2,下拉至单元格E7Excel会自动调整单元格相对引用并快速得出列E中的结果,列F、列G中也类似。但列F中的单元格I2不变,因为我们使用了绝对引用,即在行或列前加了$符号。

 

使用R1C1样式公式如下图:

可以看出,第5列、第6列、第7列中每列的公式都是相同的。也就是说,整个区域都可以使用同样的公式。

R1C1样式中,字母R代表行,字母C代表列,字母后面的方括号代表相对引用。字母R后面的方括号中的数字代表相对于当前单元格移动的行数,负数表示向上移动,正数表示向下移动。字母C后面的方括号中的数字代表相对于当前单元格移动的列数,负数表示向左移动,正数表示向右移动。例如,如果当前单元格D5中输入=R[1]C[-1],则引用的单元格为C6

若字母RC后面就是数字,没有方括号,则表示引用为绝对单元格。例如,=R3C2引用单元格B3,不管当前单元格处在哪里。

若字母RC后面既没有方括号也没有数字,则表示引用与当前单元格相同的行或列。

 

为了更好地理解,下图演示了一些A1样式和R1C1样式的相对引用和绝对引用的例子。

 

VBA中,Range对象的Formula属性和FormulaR1C1属性可以让我们分别使用A1样式和R1C1样式的公式。

 

认识Formula属性

我们通过一些简单的示例来认识Range对象的Formula属性。

例如,对于下面的工作表,要求在单元格C1中放置单元格区域A1:A5中的数值之和。代码如下:

结果如下图所示。从编辑栏可以看出,VBA代码在单元格C1中放置了公式:=SUM($A$1:$A$5),该公式执行相应的求和并得到结果。

如果要求在单元格区域C1:C5中的每个单元格中都放置单元格区域A1:A5中的数值之和,那么只需要将上面的代码中的引用区域Range(“C1”)修改为Range(“C1:C5”)。代码如下:

结果如图下图所示:

 

认识FormulaR1C1属性

在上面的示例中,使用FormulaR1C1属性,也能达到相同的效果。例如,代码:

在单元格D1中放置对单元格区域A1:A5中的数值求和的结果,如下图所示。

我们注意到,在单元格D1中显示的公式与前面使用Formula属性显示的公式相同,这是为什么呢?因为Excel默认设置为A1引用样式。

 

但是在录制宏时,宏录制器会以R1C1样式来录制输入的公式。例如,对于上面的工作表,当前单元格为C1,并在该单元格中输入公式=SUM($A$1:$A$5)求单元格区域A1:A5中的数值之和。我们使用宏录制器录制上述操作,代码如下:

 

 

关于Formula属性和FormulaR1C1属性的官方说明

两个属性都返回或者设置对象的公式,其中Formula属性表示使用A1引用样式表示法,FormulaR1C1属性表示使用R1C1样式引用。

说明

  • 如果单元格中是常量,则返回该常量。

  • 如果单元格为空,则返回空字符串。

  • 如果单元格中是公式,那么Formula属性以字符串形式返回该公式,该字符串与公式栏中显示的格式相同(包括等号)。

  • 如果设置单元格中的值或公式为日期格式,Excel将验证单元格是否已经格式化为日期或者时间数字格式。如果不是,Excel将修改数字格式为默认的短日期数字格式。

  • 如果单元格区域是一维

  • 或二维单元格区域,那么设置该公式为相同维度的VB数组。类似地,可以将公式放置到VBA数组中。

  • 设置多单元格区域的公式,使用该公式填充该区域内的所有单元格。

 

为什么要在VBA中使用R1C1样式的公式

至少有以下三个原因:

  • 使用R1C1样式的公式,代码更简洁有效。

  • R1C1样式的公式更稳定,通用性强,不会因为单元格的变化而修改公式。

  • VBA中的数组公式需要使用R1C1样式的公式。

下面举例说明。

 

在本文开头的工作表中,我们使用Excel公式计算相应的数据。现在,我们理解了A1引用样式和R1C1引用样式,以及Formula属性和FormulaR1C1属性后,使用VBA程序来计算表中的数据(见下图中红色阴影部分)。


使用A1样式的公式,程序代码如下:

使用R1C1样式的公式,程序代码如下:

 

下面是两段程序的执行过程视频:


 

可以看出,在某一区域中使用R1C1样式的公式,只需一个公式,即可对其进行全部计算,非常灵活,代码也更简洁。

再看下面的例子,我们需要在第11行计算合计分。

使用R1C1样式的公式,只需一句代码即可完成:


 

如果您对本文介绍的内容还有什么好的示例,欢迎发送邮件给我:xhdsxfjy@163.com

也可以在本文下方留言,提出您的看法或建议。

本文属原创文章,转载请联系我或者注明出处。

 

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多