为什么在VBA的GetValue函数中使用单元格“A1”?
我正在使用此函数从已closures的工作簿中检索一个值。 在这个代码的第8行中,我不明白为什么使用“A1”。 整个八号线究竟发生了什么? 我也被xlR1C1参数弄糊涂了。
Private Function GetValue(path, file, sheet, ref) Dim arg As String If Right(path, 1) <> "\" Then path = path & "\" If Dir(path & file) = "" Then GetValue = "File Not Found" Exit Function End If arg = "'" & path & "[" & file & "]" & sheet & "'!" & _ Range(ref).Range("A1").Address(, , xlR1C1) GetValue = ExecuteExcel4Macro(arg) End Function
Range().Range()
文档在这里 :
当应用于
Range
对象时,该属性是相对于Range
对象的。 例如,如果select是单元格C3
,则Selection.Range("B1")
将返回单元格D3
因为它与Selection
属性返回的Range
对象有关。 另一方面,代码ActiveSheet.Range("B1")
总是返回单元格B1
。
代码使用第二个Range("A1")
来确保如果您有一个ref
范围大于一个单元格,它只返回该范围的左上angular的单元格。 另外它会出现你的另一个叫做ExecuteExcel4Macro()
Sub
需要一个R1C1
types的单元格引用,所以地址被转换成用于将arg
string传递给Sub
。
xlR1C1
是用来指定公式如何工作的参考样式 。 使用这种风格时,您的公式将会起作用,并且看起来与您预期的完全不同。 R1C1规范基本上意味着使用行和列顺序而不是字母名称来引用单元格。 例如,使用xlR1C1时,可以使用=R2C2
(row2,column 2)访问单元格B2。 另一个例子,单元C10可以被称为=R10C3
至于在第8行发生了什么…你正在构造一个单元格引用,看起来像这样:(注意,你的单元格引用将是不同的,因为它有一个文件path)
='[Myfilename.xlsx]Sheet1'!R1C1
您可以使用debugging器查看arg
variables中包含的string。
给代码添加Range("A1")
看起来什么都不做。 将此input到即时窗口中会导致一些意想不到的结果。
?Range("B3").Range("A1").Address $B$3
现在,我会期望返回$A$1
,但看起来这个函数的这个部分将返回Range(ref)
的地址。
现在,使用ReferenceStyle参数调用Range.Address
将产生这些结果。
?Range("B3").Range("A1").Address(,,xlR1C1) R3C2