为什么在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需要一个R1C1types的单元格引用,所以地址被转换成用于将argstring传递给Sub

xlR1C1是用来指定公式如何工作的参考样式 。 使用这种风格时,您的公式将会起作用,并且看起来与您预期的完全不同。 R1C1规范基本上意味着使用行和列顺序而不是字母名称来引用单元格。 例如,使用xlR1C1时,可以使用=R2C2 (row2,column 2)访问单元格B2。 另一个例子,单元C10可以被称为=R10C3

至于在第8行发生了什么…你正在构造一个单元格引用,看起来像这样:(注意,你的单元格引用将是不同的,因为它有一个文件path)

 ='[Myfilename.xlsx]Sheet1'!R1C1 

您可以使用debugging器查看argvariables中包含的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