我使用此功能从已关闭的工作簿中检索值。在本代码的第8行中,我不明白为什么" A1"正在使用。整个第8行究竟发生了什么?我也对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
答案 0 :(得分:4)
Range().Range()
Documentation here:
当应用于
Range
对象时,该属性与Range
对象相关。例如,如果选择是单元格C3
,则Selection.Range("B1")
将返回单元格D3
,因为它相对于Range
属性返回的Selection
对象。另一方面,代码ActiveSheet.Range("B1")
始终返回单元格B1
。
代码正在使用第二个Range("A1")
来确保如果您的ref
范围大于一个单元格,则只返回该范围的左上角单元格。此外,您的另一个名为Sub
的{{1}}需要ExecuteExcel4Macro()
类型的单元格引用,因此地址正在转换为该类型,以便将R1C1
字符串传递到{{1} }}
答案 1 :(得分:1)
xlR1C1
是reference style,用于指定公式的工作方式。使用此样式时,您的公式将起作用,并且看起来与您期望的完全不同。 R1C1规范基本上意味着使用行和放大器来不同地引用单元。列序号而不是字母名称。例如,使用xlR1C1时,您可以使用=R2C2
(第2行,第2列)访问单元格B2。另一个例子,单元格C10可以称为=R10C3
至于第8行发生了什么...你正在构建一个如下所示的单元格引用:(注意你的单元格引用会有所不同,因为它有一个文件路径)
='[Myfilename.xlsx]Sheet1'!R1C1
您可以使用调试器查看arg
变量中包含的字符串。
答案 2 :(得分:1)
在代码中添加Range("A1")
似乎根本不做任何事情。将此键入到即时窗口会导致一些......意外结果。
?Range("B3").Range("A1").Address
$B$3
现在,我原本希望返回$A$1
,但似乎函数的这一部分将返回Range(ref)
的地址。
现在,使用Range.Address
参数调用ReferenceStyle会产生这些结果。
?Range("B3").Range("A1").Address(,,xlR1C1)
R3C2