“为什么是细胞?”;A1";是否在VBA中的此GetValue函数中使用?

“为什么是细胞?”;A1";是否在VBA中的此GetValue函数中使用?,vba,excel,Vba,Excel,我正在使用此函数从关闭的工作簿中检索值。在这段代码的第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

我正在使用此函数从关闭的工作簿中检索值。在这段代码的第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
私有函数GetValue(路径、文件、工作表、参考)
作为字符串的Dim arg
如果正确(路径,1)“\”则路径=路径&“\”
如果Dir(路径和文件)=“”,则
GetValue=“未找到文件”
退出功能
如果结束
arg=“”&path&“[”&file&“]”&sheet&“!”&_
范围(参考)。范围(“A1”)。地址(,xlR1C1)
GetValue=ExecuteExcel4Macro(arg)
端函数
xlR1C1
是用于指定公式工作方式的。使用此样式时,公式的工作方式和外观将与您预期的大不相同。R1C1规范基本上意味着使用行和列序号而不是字母名称来不同地引用单元格。例如,当使用xlR1C1时,您可以使用
=R2C2
(第2行第2列)访问单元B2。另一个例子是,单元C10可以被称为
=R10C3

至于8号线发生了什么。。。您正在构建一个如下所示的单元格引用:(请注意,单元格引用将有所不同,因为其中包含一个文件路径)

您可以使用调试器查看
arg
变量中包含的字符串。

范围(“A1”)
添加到代码中似乎没有任何作用。在即时窗口中键入此项会导致某些。。。意外的结果

?Range("B3").Range("A1").Address
$B$3
现在,我本来希望返回
$A$1
,但这部分函数似乎将返回
范围(ref)
的地址

现在,调用参数将产生这些结果

?Range("B3").Range("A1").Address(,,xlR1C1)
R3C2
Range().Range()

当应用于
范围
对象时,该属性相对于
范围
对象。例如,如果选择是cell
C3
,则
selection.Range(“B1”)
返回cell
D3
,因为它与
selection
属性返回的
Range
对象相关。另一方面,代码
ActiveSheet.Range(“B1”)
总是返回单元格
B1


代码使用第二个
范围(“A1”)
,以确保如果
ref
范围大于一个单元格,则只返回该范围的左上角单元格。另外,您的另一个名为
ExecuteExcel4Macro()
Sub
似乎需要一个
R1C1
类型的单元格引用,因此将地址转换为该类型,以便将
arg
字符串传递到
Sub

中,但这可能不是完全确定的,但在
ref
是单元格集合的情况下,因此,它总是会返回一个值。我们需要查看
ExecuteExcel4Macro()
代码以查看它需要什么输入。但是
.Address()
之后的语法是:ExecuteExcel4Macro is->,尽管现在仍然使用Excel 4宏。。。可能是时候升级了。它对单个单元格范围没有任何作用,但对于多单元格范围(即范围(“C3:H99”)),它返回左上角的单元格。实际上,我刚刚了解到@Tmdean。
?Range("B3").Range("A1").Address(,,xlR1C1)
R3C2