【问题标题】:UDF - How to turn a string that contains a path, workbook name, worksheet name and cell reference into a formula? [duplicate]UDF - 如何将包含路径、工作簿名称、工作表名称和单元格引用的字符串转换为公式? [复制]
【发布时间】:2019-09-23 04:41:39
【问题描述】:

我正在尝试编写一个 UDF,它将包含路径、工作簿名称、工作表名称和单元格引用的字符串转换为公式,以便我可以轻松地从其他工作簿返回值。例如,我的字符串如下所示:

='C:\FolderAlfa\SubfolderBeta\[Book1.xlsx]Sheet2'!$D$4

我尝试了Application.Evaluate(string)ExecuteExcel4Macro(string) 方法,但它们都不起作用。

我将不胜感激!

【问题讨论】:

  • 你的意思是Range("A1").Formula = "='C:\FolderAlfa\SubfolderBeta\[Book1.xlsx]Sheet2'!$D$4"
  • 不确定为什么要使用 UDF ...您总是可以在公式中使用邪恶的 INDIRECT 函数。请注意,当外部工作簿关闭时,这些方法都不起作用
  • 是的,但我希望这是一个 UDF,所以我不确定如何使用 Range 对象,因为它需要引用(如“A1”)
  • 是的,这就是问题所在。 Evaluate 方法在其他工作簿打开时完美运行,但我正在寻找在其他工作簿关闭时可以工作的解决方案。
  • @Storax:但 UDF 不能将公式插入范围。

标签: excel vba


【解决方案1】:

根据我发现的here,可以使用 UDF 更改单元格并插入公式。

这有点麻烦(也许有人可以改进它)但它确实有效。您还需要重新计算无法从函数 getValue 和子 addFormula 触发的内容。你必须把它放在别的地方。参数 rg 是要放置公式的单元格。确保 is 不是您放置 getValue 的单元格。

Function getValue(rg As Range, path As String, file As String, sheet As String, ref As String)
    Evaluate "addFormula( " & Chr(34) & rg.Address & Chr(34) & "," & Chr(34) & "'" & path & "[" & file & "]" & sheet & "'!" & ref & Chr(34) & ")"
    getValue = ""
End Function

Sub addFormula(trgAddress As String, myFormula As String)
    Dim trgRg As Range

    Set trgRg = Range(trgAddress)
    trgRg.Formula = "=" & myFormula

End Sub

在工作表选择更改中,我添加了计算方法。这肯定不是最好的方法,但它表明这是可能的。

Private Sub Worksheet_SelectionChange(ByVal Target As Range)
    Me.Calculate
End Sub

以及如何使用它:函数在 D5 中,结果在 E5 中

【讨论】:

  • 这看起来很棒!谢谢你:)
  • 不客气!我了解到,尽管 MS 文档另有说明,但可以使用工作表中的 UDF 单元格进行更改。
【解决方案2】:

您不能使用 UDF 插入公式。恐怕您必须使用 XLM 宏来引用已关闭文件中的范围。我找到了这个信息HERE

所以在实践中:

我的测试文件值:

稍加修改的代码:

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

Sub TestGetValue()

With ActiveWorkbook.Sheets(1)
    path = .Cells(1, 3)
    file = .Cells(2, 3)
    sheet = .Cells(3, 3)
    ref = .Cells(4, 3)
    .Cells(1, 1) = GetValue(path, file, sheet, ref)
End With

End Sub

使用按钮并分配宏以在点击时运行

【讨论】:

  • 但是为什么 OP 应该使用这个更复杂的解决方案而不是我在我的 cmets 中建议的解决方案。他想要一个 UDF,正如您绝对正确地指出的那样,您不能插入带有 UDF 的公式。
  • @Storax,你是对的!你的方法也应该有效。顺便说一句,我从来没有说过他应该使用这个解决方案而不是你的;)。如果他可以像他的问题那样构建字符串,那么您建议的方法可能会更加优雅。
  • 对不起,我不想暗示任何东西(不确定是否暗示是正确的词)。
  • @JvdV:感谢您的解决方案。但是,我需要一个普通的 UDF :)
  • @Storax:你能举个简单的例子吗?因为我仍然对如何在 UDF 中使用 Range 感到困惑。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-20
  • 2020-08-16
相关资源
最近更新 更多