为什么在VBA中的GetValue函数中使用单元格“A1”?

时间:2015-01-07 19:43:48

标签: excel vba excel-vba

我使用此功能从已关闭的工作簿中检索值。在本代码的第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

3 个答案:

答案 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)

xlR1C1reference 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