2017-12-14 3 views
0

페인트 색상 및 해당 페인트 색상에 대한 링크를 추적하는 데 사용되는 색상 가이드라는 참조 시트가 있습니다. 그것은 다음과 같습니다VLOOKUP 및 HYPERLINK가 작동하지 않습니다.

paint guide example

나는 약 85 장을 가지고, 다른 방에 대한 허용 페인트 색상 선택의 집합을 가진 각 건물과 건물을 대표하는 각각.

building sheet example

은 내가 무엇을 찾고 있어요 것은 이것이다 : 그것은 다음과 같습니다 나는 칼라 가이드 시트 (첫번째 이미지) 내 외부 하이퍼 링크를 업데이트 할 때, 나는 같은 하이퍼 링크는 각 건물에 업데이트 할 것을 필요 시트. VLOOKUP을 통해이 작업을 수행하려고했지만 하이퍼 링크가 작동하지 않습니다. 나는 VLOOKUP 공식과 함께 HYPERLINK 공식을 연결할 수 있다는 것을 온라인으로 읽었습니다.

formula plus error

어떻게해야이는 내가 이미지 2에서 하이퍼 링크를 클릭 할 때 내가 오류를 포함 모습입니다? 며칠 동안이 프로젝트를 진행해 왔지만 제대로 작동하지 않습니다. 여기에 나온 다른 대답은 문제를 해결하지 못하는 것 같습니다.

+0

참고 : 하이퍼 링크는 통합 문서가 아닌 외부 링크입니다. – LadyStensberg

답변

0

내 솔루션 :

문제는 하이퍼 링크는 올바른 하이퍼 링크를 구축 할 수 없었던 것이 었습니다 VLOOKUP을 사용할 수 있습니다.

색상 가이드에서 2 개의 열을 만들어 해결했습니다. 첫 번째는 색상의 이름을 저장합니다. 두 번째는 하이퍼 링크를 저장했습니다. 두 번째 VLOOKUP은 '알기 쉬운 이름'을 뽑아,

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

첫 번째 VLOOKUP 링크 위치를 뽑아 : 나는에 이름과 하이퍼 링크를 끌어 원하는 두 번째 시트에, 나는 다음과 같은 공식을 사용했다. 이 기능은 색상 안내에서 변경되면 링크가 자동으로 업데이트됩니다.

+0

글쎄 그것은 확실히 단순 해 보인다! – QHarr

+0

예, 그렇습니다. 귀하의 의견에 진심으로 감사드립니다! – LadyStensberg

1

옵션 1 : 당신은 사용자 정의 함수 (UDF) GetUrl를 통해 URL을 업데이트하는 워크 시트 기반의 방법으로 표준 모듈에 Igor하여 다음 코드를 (수정 약간)를 사용할 수있는 UDF

시트에서, 클릭 가능한 링크가 있는지 확인하려면 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)) 

시트 한 셀 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

예를 들어, 기능을 포함하는 각 시트의 워크 시트 코드 창에 갈 것입니다 트리거 코드 (그래서 하이퍼 링크 텍스트 업데이트) 시트 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 

을 - (당신은 또한 리본 메뉴에 개발 도구 탭을 추가 할 필요가 구글 Excel에서 버튼에 매크로를 지정) 그리고 당신은 설정합니다 이것은 단순히 당신이 버튼에 부착 표준 모듈에 배치하는 과정이 될 것입니다 다음 (D 열 코드로 첨가)를 데이터 :

Data for url updates

이 형태 추가 제어 버튼 :

Inserting a form control button

,536,913,632 10

자동으로 당신이 다음 업데이트 링크 절차를 지정할 수있는 창이 나타납니다 :

Assign macro to button

+0

코드를 추가 할 시트가 중요합니까? 나는 VBA를 모른다. 나는 이것을 간단한 공식으로하기를 희망했다. 또한 위에서 언급 한 VLOOKUP에서 위의 작업을 수행 할 수 있습니까? – LadyStensberg

+0

맨 위 코드는 표준 모듈을 사용합니다.워크 시트 이벤트가 업데이트 할 URL이 포함 된 특정 워크 시트 (코드 창)에 들어 있기 때문에 예제 이벤트가 업데이트 된 하단 코드입니다. – QHarr

+0

재 계산을 강제하는 다른 방법이있을 수 있습니다.이 방법은 마스터 시트에서 수동으로 업데이트 할 수있는 방법이었으며 특정 워크 시트로 이동하면 표시된 activate 이벤트가 트리거되어 다시 계산됩니다. 업데이트 할 URL이 포함 된 각 워크 시트에서이 코드를 반복합니다 (또는 내일 호출 할 함수를 편집 할 것입니다). VLOOKUP 방식의 문제점은 클릭 가능한 하이퍼 링크로 끝나지 않는다는 것입니다. 도움이된다면 그림을 편집에 추가하겠습니까? – QHarr