Range("B2:B10")
该方法(准确地说:对象)用于选择单元格或获取值。通常在同一位置,他们会补充说明可以使用预定义的名称,这样也完全可以。
Range("valuesabove")
另一方面,我热爱相对定义单元格名称的强大功能。它们使编写和处理大型复合公式以及基本上引用几乎任何内容变得更加容易。
然而,相对名称在我们习惯的Range("valuesabove")方法中不起作用。
通常(在工作表上使用时),相对名称是相对于当前选定的单元格或使用它们的单元格的。
在VBA的Range()对象中,情况并非如此。默认情况下,Range相对于WorkSheet对象,通常是ActiveSheet。但是,ActiveSheet由其左上角单元格A1表示。这就是Range相对于它的原因。这就是为什么绝对名称($C$23)可以使用它,而相对名称("向左移动一列,向上移动两行")不能使用它的原因。
所以我的问题是: 那么我该如何利用VBA中相对名称的强大功能呢?
编辑:
认识到我的问题不太清楚(谢谢你们不知疲倦地评论),让我尝试以特定的形式表达并澄清术语:
在Excel工作表上,使用名称引用单元格或基于单元格值的函数定义计算值非常方便。
在Excel中,对单元格的引用可以是相对、绝对或混合的。这也适用于创建名称。因此,我们可以谈论绝对、相对或混合名称(当然是指引用)。
这里多次使用了绝对名称(使用Excel的“跟踪先驱”功能创建):
名称“名字”= $D$2
这里多次使用了相对名称:
名称为"upright24",例如当选定单元格A7时= C3(没有$符号!)。但是根据所选单元格或区域,这会不断变化。您可以在名称管理器中检查它!(Ctrl + F3)
这就是我们可以考虑的混合名称:
名称为"rel_serialnumber",例如当选择单元格C6时= $B6。其行(6)根据所选单元格或区域而不断更改。
相对名称或混合名称的创建明确基于创建名称时的活动单元格。绝对名称的创建自然不依赖于光标位置。
请注意,
绝对名称意味着相对于被引用的单元格的动态偏移量,该单元格是唯一的
相对名称意味着相对于被引用单元格的静态偏移量,因此始终会根据名称使用的位置而改变
混合名称意味着相对于被引用单元格的混合(或半动态)偏移量,其行或列因此始终会根据名称使用的位置而改变,而另一个则始终保持不变(在一个方向上的偏移量始终为零)。
好的,现在这是个问题。我有一个类似数据库的Excel表格,其中我将行处理为记录,列作为属性字段。用户使用方式如下:通过将光标放在所需记录的行中的任何单元格中来“选择记录”。然后,他按下一个大的命令按钮,启动我的VBA宏。这意味着要打开一个准备好的骨架文件,并将从所选记录中定义的一些特定单元格(顺便说一句,这些单元格由绝对名称定义)的某些值(由混合名称定义)填入其中。
由于在VBA中认为
Range("name")
可以使用(见上文),因此我认为Range("relativename")
或Range("mixedname")
也将同样有效,同时自动依赖于活动单元格。我错了。
只有
Range("absolutename")
以人们期望的方式工作!请参见上文的解释。
我需要一个函数/方法/对象,它可以像Range("absolutename")
一样方便地与"relativename"
或"mixedname"
一起使用。
D4=C3*10
,我可以使用类似这样的代码:Range("D4").FormulaR1C1 = "R[-1]C[-1]*10"
?你能举个VBA代码行的例子,说明它没有达到你想要的效果吗? - Adammy_Value = Cells(ActiveCell.Row, Range("Dogs").Column).Value
吗? - Adam