web-dev-qa-db-ja.com

= Hyperlink()数式が適用されているセルからURLを抽出します

この数式が適用されているセルから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が表示されます。

セルが数式からハイパーリンクを評価している場合、セルからハイパーリンクを取得するためにこのタスクを実行する方法を誰かが知っていますか?

3
S7H

数式によって生成されたハイパーリンクを持つセルから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番目の引数を区切るコンマの後にコンマがある場合、コードは壊れます(比較的簡単に修正できます)。
3
robinCTS