2017-05-26 67 views
0

例如,如果我有一個像這樣的複雜函數:=IFERROR(CELL("address",INDEX(D:D,MATCH(A2;D3:D$750;0)+ROW(A2);1;1));"")我想將它轉換爲指向由該公式返回的單元格的超鏈接。是的,我知道這可以通過用=HYPERLINK("[file_name.xlsm]" & %formula%)來包裝它,但首先,它看起來非常難看,並且難以閱讀稀疏的大數據,其次 - 在Excel之間複製這樣的數據塊是非常不方便的實例(然後替換文件名)。Excel中的自定義函數用於單元超級鏈接創建

所以我不知道 - 是有可能這樣的輸出轉換成細胞鏈接,當前文件和片材來代替「[long_file_name.xlsm] $ d $ 156」可讀的文本,如「D156」?

P.S.顯然我可以創建一個返回當前文件名的自定義函數,並將相同的公式放入HYPERLINK函數的第二個參數中,但顯然這將是反效果的,特別是當我有大量數據時。所以我想把所有這一切換成1個功能...

P.P.S.不知道這是否合適(對於這個問題它有點偏離),但如果可以使用宏而不是自定義函數完成相同的功能,那將很好。因此,宏應該在當前所選範圍內找到所有重複項,並在每個重複項的下一次出現時創建超鏈接(在具有相同偏移量的單元格中,偏移量+1,即當前活動後的下一張)。其餘的我可以自己管理。


UPD1: 獲取文件名不是一個問題,因爲我在PS中說,我可以寫這樣的功能:

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個參數(不知道這是否存在)...

回答

0

不完全確定你在問什麼,但我認爲= CELL(「文件名」)無線會幫助你。這將返回文件名和表單。只需從返回的內容中提取表單名稱和文件名稱即可。也可以切換/粘貼到其他工作簿/工作表。

+0

直到最後(至少到第一個P.S.結束)讀取問題,獲取文件名不是問題,我需要將第一個參數傳遞爲HYPERLINK函數的第二個參數。 –

0

嗯,我沒有找到一種方法來發送多個參數與其他函數的單一結果,但我發現了一種方法來做我想做的事情。它看起來像一個骯髒的黑客,但我不知道,也許這是在Excel VBA中做事情的方式......

所以首先它需要在模塊的頂部添加一個公共變量:

Public sBuff As String 

接下來,這兩個函數應公共變種聲明後說:

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())

是的,它的醜陋,但作爲魔術對我=)