この数式が適用されているセルからURLを取得したいのですが。
_=HYPERLINK(CONCATENATE("https://loremipsum.com/#/Advertiser/",[@[Customer CID]],"/.html"), "View")
_
数式には、シートの列の1つである「顧客CID」への構造化された参照があります。
このマクロをシートに適用しようとすると、数式が正しいURLを評価している場合でも、default_valueが返されます。
_Function GetURL(cell As Range, Optional default_value As Variant)
If (cell.Range("A1").Hyperlinks.Count <> 1) Then
GetURL = default_value
Else
GetURL = cell.Range("A1").Hyperlinks(1).Address
End If
End Function
_
しかし、数式を適用せず、セルを右クリックしてハイパーリンクをセルに追加すると、マクロ関数=GetUrl([@[Customer CID]], "")
が機能し、URLが表示されます。
セルが数式からハイパーリンクを評価している場合、セルからハイパーリンクを取得するためにこのタスクを実行する方法を誰かが知っていますか?
数式によって生成されたハイパーリンクを持つセルからURLを取得する直接方法はありません。 HYPERLINK()
関数から最初の引数を抽出し、手動で評価する必要があります。
これは、これを行うコードの修正バージョンです。
Function GetURL(cell As Range, Optional default_value As Variant)
With cell.Range("A1")
If .Hyperlinks.Count = 1 Then
GetURL = .Hyperlinks(1).Address
Else
If Left$(Replace(Replace(Replace(.Formula, " ", ""), vbCr, ""), vbLf, ""), 11) = "=HYPERLINK(" Then
Dim idxFirstArgument As Long: idxFirstArgument = InStr(.Formula, "(") + 1
GetURL = Evaluate(Mid$(.Formula, idxFirstArgument, InStrRev(.Formula, ",") - idxFirstArgument))
Else
GetURL = default_value
End If
End If
End With
End Function
余分なスペースや数式に追加された改行は適切に考慮されることに注意してください。
警告:
HYPERLINK()
関数を持つ数式でのみ機能します。 (ただし、HYPERLINK()
が最も外側になるようにすべての数式をリファクタリングできますが、わずかな欠点があります。あるいは、すべての数式を=IF(…,…,HYPERLINK())
または=HYPERLINK()
のいずれかの形式にリファクタリングできます。欠点はなく、コードにわずかな変更を加えるだけで済みます。最後に、かなりの労力を費やして、HYPERLINK()
関数があります。);HYPERLINK()
関数の最初と2番目の引数を区切るコンマの後にコンマがある場合、コードは壊れます(比較的簡単に修正できます)。