Excel中的自定义函数,用于创建单元格超链接

时间:2017-05-26 19:00:57

标签: excel vba excel-vba

例如,如果我有像这样的复杂函数:=IFERROR(CELL("address",INDEX(D:D,MATCH(A2;D3:D$750;0)+ROW(A2);1;1));"")我想将其转换为指向该公式返回的单元格的超链接。是的,我知道它可以通过=HYPERLINK("[file_name.xlsm]" & %formula%)包裹它来完成,但首先,它看起来非常难看并且不舒服地读取大的稀疏数据,其次 - 复制这些数据非常不方便 - Excel实例之间的块(然后替换文件名)。

所以我想知道 - 是否可以将此类输出转换为当前文件和工作表的单元格链接,并使用“ D156 ”等可读文本代替“ [long_file_name.xlsm] $ D $ 156 “?

P.S。显然我可以创建一个自定义函数,返回当前文件名并将相同的公式放入HYPERLINK函数的第二个参数中,但显然它会有效,特别是当我有大量的数据时。所以我想将所有这些包装成1个函数......

P.P.S。不确定这是否合适(这个问题有点离谱),但如果使用宏而不是自定义函数可以完成相同的功能,那就没问题了。因此,宏应该找到当前所选范围内的所有重复项,并在每个副本的下一次出现时创建超链接(在具有偏移+1的不同工作表上具有相同偏移的单元格中,当前处于活动状态之后的下一个工作表)。其余的我可以自己管理。

UPD1: 获取文件名不是问题,正如我在P.S.中所说,我可以写一个这样的函数:

Function GetCurFilename()
    GetCurFilename= "[" & ActiveWorkbook.Name & "]"
End Function

但我仍然需要以某种方式将第一个HYPERLINK的第一部分论点作为第二个发送!

UPD2: 我想应该这样做:

Function MakeLinkArgs(cAdrs) As SomeType_interpreted_as_2_arguments
    If (cAdrs = "") Then
        MakeLinkArgs(1) = ""
        MakeLinkArgs(2) = ""
    Else
        MakeLinkArgs(1) = "[" & ActiveWorkbook.Name & "]" & cAdrs
        MakeLinkArgs(2) = Replace(cAdrs, "$", "")
    End If
End Function

所以这个函数可以像这样使用:=HYPERLINK( MakeLinkArgs( IFERROR(CELL("address",INDEX(D:D,MATCH(A2;D3:D$750;0)+ROW(A2);1;1));"") ) )

但仍然没有运气找到可以解释为2个参数的类型(不确定是否存在这样的...)

2 个答案:

答案 0 :(得分:0)

不完全确定你在问什么,但我认为= CELL(“filename”)会对你有帮助。这将返回文件名和工作表。只需从返回的内容中提取工作表名称和文件名即可。也适用于剪切/粘贴到其他工作簿/工作表。

答案 1 :(得分:0)

好吧,我没有找到一种方法来发送多个参数与其他函数的单个结果,但我找到了一种方法来做我想要的。它看起来像是一个肮脏的黑客,但我不确定,也许这是在Excel VBA中做事的方式......

首先,需要在模块顶部添加一个公共变量:

Public sBuff As String

接下来,应在public var声明后添加这两个函数:

Function MakeCLink(cAdrs)
    If (cAdrs = "") Then
        MakeCLink = ""
        sBuff = ""
    Else
        MakeCLink = "[" & ActiveWorkbook.Name & "]" & cAdrs
        sBuff = Replace(cAdrs, "$", "")
    End If
End Function

Function sBuf() As String
    sBuf = "" & sBuff
End Function

编译后,它可以在公式中使用:=HYPERLINK( MakeCLink(IFERROR(CELL("address",INDEX(D:D,MATCH(A2,D3:D$750,0)+ROW(A2),1,1)),"")), sBuf() )

是的,它很难看,但对我来说却是神奇的=)