2017-12-14 18 views
0

私は、カラーガイドと呼ばれるリファレンスシートを持っており、ペイントの色とそれらのペイントカラーへのリンクを追跡しています。それは次のようになります。VLOOKUPとHYPERLINKが機能しない

paint guide example

私は約85枚を持って、別の部屋のために許容される塗料の色の選択肢を持つ各建物と建物を表す各1。それは次のようになります。私が何を探しています何

building sheet example

はこれです:私はカラーガイドシート(​​最初の画像)上の私の外部のハイパーリンクを更新するとき、私は同じハイパーリンクが各建物に更新することを必要としますシート。私はVLOOKUPでこれを達成しようとしていますが、ハイパーリンクは引き継ぎません。オンラインで、VLOOKUP式とHYPERLINK式を連鎖させることができます。これは、それは私が画像2からのハイパーリンクをクリックしたときに私が取得エラーを含め、次のようになります。

formula plus error

私は何をすべきでしょうか?私は数日間このプロジェクトに取り組んできましたが、それを働かせることはできません。私がここで見た他の答えは、この問題を解決していないようです。

+0

注:ハイパーリンクは、ワークブック内ではなく外部リンクです。 – LadyStensberg

答えて

0

私のソリューション:

問題がHYPERLINKが正しいハイパーリンクを構築することができなかったということでしたVLOOKUPを使用することに加えて。

カラーガイドで2列作成することで解決しました。最初の色の名前が格納されます。 2番目はハイパーリンクを保存しました。私はに名前やハイパーリンクを引っ張ってみたかったセカンドシート、で、私は次の式を使用:

=HYPERLINK(VLOOKUP(C3, 'Color Guide'!$A:$D, 4), VLOOKUP(C3, 'Color Guide'!$A:$D, 3)) 

最初のVLOOKUPは、リンク先を引っ張っ、二VLOOKUPは「フレンドリ名」を引っ張りました。これは、カラーガイドで変更されたときに素晴らしいリンクを自動的に更新します!

+0

これは確かに簡単です! – QHarr

+0

はい、そうでした。あなたのご意見をありがとうございました! – LadyStensberg

1

オプション1:シートにおいてUDF

あなたはユーザ定義関数(UDF)GetUrlを介してURLを更新するワークシートベースの方法のような標準的なモジュールに(わずかに変更)Igorによって次のコードを使用することができ、 HYPERLINK関数内にラップして、クリック可能なリンクがあることを確認します。標準モジュールで

UDFコード:

Option Explicit 

Function GetURL(cell As Range, Optional default_value As Variant) as hyperlink 
'Lists the Hyperlink Address for a Given Cell 

'If cell does not contain a hyperlink, return default_value 
     If (cell.Hyperlinks.Count <> 1) Then 
      GetURL = default_value 
     Else 
      GetURL = cell.Hyperlinks(1).Address 
     End If 
End Function 

あなたは、例えば、シート2のセルに持つことによって展開

=HYPERLINK(GetURL(Sheet1!A1)) 

そして、シート1つのセルA1次は、ハイパーリンクビーイングを持っています更新しました。

イベントにUDF(計算)をリフレッシュして、ハイパーリンクのテキストが確実に更新されるようにする必要があります。

たとえば、UDFを含むシートでは、再計算を強制するためにGreg Glynnを次のように使用できます。確かにこれを行うための効率的な方法を見つけることができます。上記のコードのために議論したように

Private Sub Worksheet_Activate() 

    Cells.Replace What:="=", Replacement:="=", LookAt:=xlPart, SearchOrder _ 
     :=xlByRows, MatchCase:=False, SearchFormat:=False, ReplaceFormat:=False 

End Sub 

:更新されたハイパーリンクを有するA1

細胞

細胞A3(異なるシート内のセルである可能性がある)関数GetURLは、内部に包まれていますHYPERLINKファンクションは、A1を指します。

Using the UDF in the sheet

機能コードは標準モジュールに行くだろう:

押しAltキー + F11 VBEを開き、プロジェクトエクスプローラウィンドウで、右クリックInsert Moduleをクリックしてコードを入力します表示されるモジュールに

Entering code for User Defined Function into standard module

例えば機能を含む各シートのためのワークシート・コード・ウィンドウに行くだろうトリガ・コード(SOハイパーテキスト更新)シート4がでGetUrl機能を持っていた場合は、次のようにシートのコードウィンドウに入力します。

Adding code into code window for a sheet

私がコメントで言ったように、これは各シートがアクティブになったときに呼び出される関数に入れることができます。

オプション2:マクロに関連付けられているワークシートにボタン、古いURLと新しいURL

あるいは、最適化されたが、私は他の人のように更新して幸せされていない以下を含む範囲を選択を促しますチップでコメントします。

Option Explicit 

Public Sub ReplaceLinks() 

    Dim linksArr() 

    Application.ScreenUpdating = False 

    Dim myRange As Range 

    Set myRange = Application.InputBox("Please select both columns containing range of hyperlinks to update", Type:=8) 

    If Not myRange Is Nothing And myRange.Columns.Count = 2 Then 

     linksArr = myRange.Value 

    Else 

     MsgBox "Please select a range of two columns" 
     Exit Sub 

    End If 

    ReDim Preserve linksArr(1 To UBound(linksArr), 1 To 3) 

    linksArr = ValidateUrls(linksArr) 

    Dim currentLink As Long 

    For currentLink = LBound(linksArr, 1) To UBound(linksArr, 1) 

     If linksArr(currentLink, 3) Then 

      UpdateMyHyperlink CStr(linksArr(currentLink, 1)), CStr(linksArr(currentLink, 2)) 

     End If 

    Next currentLink 

    WriteValidationResults linksArr, myRange 

End Sub 

Private Function ValidateUrls(ByVal linksArr As Variant) As Variant 

    Dim currentLink As Long 

    For currentLink = LBound(linksArr, 1) To UBound(linksArr, 1) 

     linksArr(currentLink, 3) = IsURLGood(CStr(linksArr(currentLink, 1))) 

    Next currentLink 

    ValidateUrls = linksArr 

End Function 

Public Function IsURLGood(ByVal url As String) As Boolean 

    'https://www.experts-exchange.com/questions/27240517/vba-check-URL-if-it-is-active-or-not.html by m4trix 

    Dim request As WinHttpRequest 

    Set request = New WinHttpRequest 

    On Error GoTo IsURLGoodError 
    request.Open "HEAD", url 
    request.Send 

    IsURLGood = request.Status = 200 

    Exit Function 

IsURLGoodError: 
    IsURLGood = False 
End Function 

Private Sub UpdateMyHyperlink(ByVal oldUrl As String, ByVal newUrl As String) 

    Dim ws As Variant 
    Dim hyperlink As Variant 

    For Each ws In ThisWorkbook.Worksheets 

     For Each hyperlink In ws.Hyperlinks 

      If hyperlink.Address = oldUrl & "/" Then 
       hyperlink.Address = Application.WorksheetFunction.Substitute(hyperlink.Address, oldUrl, newUrl) 
       hyperlink.TextToDisplay = newUrl 
      End If 

     Next 
    Next 

End Sub 

Private Sub WriteValidationResults(ByVal linksArr As Variant, ByRef myRange As Range) 

    Dim isUrlValidOutput As Range 

    Set isUrlValidOutput = myRange.Offset(, 2).Resize(myRange.Rows.Count, 1) 

    isUrlValidOutput = Application.Index(linksArr, , 3) 

    isUrlValidOutput.Offset(-1, 0).Resize(1) = "Valid URL" 

End Sub 

そして、あなたが設定します - これは単に、あなたがボタンに付ける標準モジュール(あなたはまた、リボンに[開発]タブを追加する必要があり、GoogleはExcelでボタンにマクロを割り当てる)に置くの手順になります次のように(列Dは、コードを介して添加される)までのデータ:

Data for url updates

フォームの追加制御ボタン:

Inserting a form control button

自動的にそれはあなたがして、更新リンク手順を割り当てることができ、ウィンドウをポップアップ表示されます:

Assign macro to button

+0

どのシートにコードを追加するかは重要ですか?私はVBAを知らない。私はこれを簡単な式で行うことを望んでいました。また、上記のVLOOKUPについても言及していますか? – LadyStensberg

+0

トップ・コードは標準モジュールに入っています。下部のコードは、ワークシート・イベントであるため、更新するURLを含む特定のワークシート(コード・ウィンドウ)に移動するため、イベントのトリガーとなるコード例です。 – QHarr

+0

再計算を強制する他の方法がありますが、これは単にマスターシートで手動で更新できる方法だったので、特定のワークシートに移動したときにactivateイベントがトリガされ、再計算が行われます。更新するURLを含む各ワークシートでこのコードを繰り返します(または、呼び出される関数として持っています...明日の例を編集します)。私はVLOOKUPアプローチの問題は、あなたがクリック可能なハイパーリンクで終わらないということです。それが助けになるなら私は編集に絵を加えるでしょうか? – QHarr

関連する問題