Есть ли способ обновить/обновить гиперссылку в форме при нажатии на гиперссылку?

У меня есть фигуры на диаграмме, которые представляют процессы в потоке данных; фигуры связаны гиперссылками с определениями процессов, расположенными на другой вкладке, на основе текста в фигуре и имени формы (например, фигура с именем «Control ##» с текстом «ABC» ссылается на вкладку, где определен процесс ABC). Есть ли способ автоматически обновить гиперссылку в этой форме, если я изменю текст в форме на «XYZ», т.е. я хочу, чтобы гиперссылка затем перешла к определению «XYZ»? Я попробовал процедуру события SheetFollowHyperlink, но ничего не происходит. Код, который у меня есть до сих пор, ниже:

Sub AssignHyperlink()

Dim CallerShapeName As String
CallerShapeName = Application.Caller

With ActiveSheet
    Dim CallerShape As Shape
    Set CallerShape = .Shapes(CallerShapeName)

    Dim RowVar As Integer

    Err.Number = 0
    On Error Resume Next

    If InStr(CallerShapeName, "Control") = 1 Then

        RowVar = Application.WorksheetFunction _
            .Match(.Range("C2").Value & CallerShape.TextFrame2.TextRange.Text, _
            Sheets("Control Point Log").Range("A1:A700"), 0)

        If (Err.Number = 1004) Then
            MsgBox "No match found for this shape text in the Control Point Log"
            Exit Sub
        End If

        On Error GoTo 0

        .Hyperlinks.Add Anchor:=CallerShape, _
        Address:=ActiveWorkbook.Name & "#" & "'Control Point Log'!$C$" & RowVar

    Else

        RowVar = Application.WorksheetFunction _
            .Match(.Range("C2").Value & CallerShape.TextFrame2.TextRange.Text, _
            Sheets("Data Flow Glossary").Range("A1:A700"), 0)

        If (Err.Number = 1004) Then
            MsgBox "No match found for this shape text in the Data Flow Glossary"
            Exit Sub
        End If

        On Error GoTo 0

        .Hyperlinks.Add Anchor:=CallerShape, _
        Address:=ActiveWorkbook.Name & "#" & "'Data Flow Glossary'!$C$" & RowVar

    End If

End With

End Sub

person stew graff    schedule 26.04.2013    source источник
comment
Когда фигура щелкается, почему бы не получить текст фигуры и использовать его для прямого перехода к соответствующему рабочему листу? Или я что-то упускаю?   -  person Siddharth Rout    schedule 27.04.2013
comment
Я использую текст фигуры для ссылки, но когда я изменяю текст, он не связывает фигуру заново, используя новый текст.   -  person stew graff    schedule 27.04.2013
comment
Каким образом вы определяете место назначения гиперлинга? это просто имя «вкладки» (листа) или вы используете «именованные диапазоны» в своей книге?   -  person Kazimierz Jawor    schedule 27.04.2013
comment
Еще один вопрос - вы сказали «фигуры на диаграмме» - это SmartArt объект из нескольких фигур, которые составлены в виде диаграммы?   -  person Kazimierz Jawor    schedule 27.04.2013
comment
Назначение — это диапазон (ячейка) в точке управления вкладками или в глоссарии потока данных. Код ищет строку, содержащую текст формы, столбец всегда C.   -  person stew graff    schedule 27.04.2013
comment
фигуры - это фигуры блок-схемы.   -  person stew graff    schedule 27.04.2013
comment
да, хорошо, но как вы его создали, используя стандартный встроенный объект SmartArt? это важно для обходного пути, который я хотел бы предложить вам   -  person Kazimierz Jawor    schedule 27.04.2013
comment
Нет, они не были созданы с помощью смарт-арта.   -  person stew graff    schedule 27.04.2013
comment
в любом случае, если это объект SmartArt, я понятия не имею, если у вас есть несколько макетов диаграммы простых фигур, вы можете изменить hyperlinks на onAction функцию фигуры ... чем один (для всех фигур) простой макрос будет вызываться при нажатии на фигуру. Этот макрос может перемещаться в любом месте вашей книги.   -  person Kazimierz Jawor    schedule 27.04.2013
comment
Дайте мне информацию, если вы заинтересованы в таком ответе и поддержке.   -  person Kazimierz Jawor    schedule 27.04.2013
comment
Итак, макрос, который у меня есть, не будет назначен фигурам? Я никогда не использовал onaction, поэтому не уверен, как это работает. Я хотел бы попробовать, какая информация вам нужна?   -  person stew graff    schedule 27.04.2013
comment
щелчок правой кнопкой мыши по фигуре дает вам вариант on Action (или что-то подобное, поскольку я не использую английскую версию Excel, я не могу это проверить). Затем вы можете установить макрос, который будет запущен (однако вам необходимо удалить гиперссылку этой формы перед запуском). Используя этот макрос, вы можете перемещаться... Если у вас возникли проблемы, вы можете либо оставить комментарий здесь, либо начать новый вопрос...   -  person Kazimierz Jawor    schedule 27.04.2013
comment
Спасибо. Я удалю гиперссылки и попробую запустить макрос и посмотреть, работает ли он.   -  person stew graff    schedule 27.04.2013
comment
Когда я щелкаю правой кнопкой мыши по фигуре, я не вижу действия в качестве опции, просто назначаю макрос. Я использую эксель 2007   -  person stew graff    schedule 27.04.2013
comment
Это вариант, который вы должны использовать...   -  person Kazimierz Jawor    schedule 27.04.2013
comment
Я в замешательстве... это то, что я уже делаю   -  person stew graff    schedule 27.04.2013
comment
я покажу вам через несколько минут свою логику в ответе   -  person Kazimierz Jawor    schedule 27.04.2013


Ответы (1)


1-й. Я предполагаю, что ваша цель – перейти к диапазону в рабочей книге после нажатия на фигуру.

Второй. Диапазон, к которому нужно перейти, называется диапазоном.

3-й. Диапазон для навигации равен тексту в фигуре.

Мое предложение состоит в том, чтобы использовать onAction триггер формы (assign macro при щелчке правой кнопкой мыши по фигуре)

4-е. Нам нужна следующая процедура — одна для всех фигур.

Sub Hyperlink_Workaround()
    On Error GoTo ErrorHandler

    Dim curHL As String
        curHL = ActiveSheet.Shapes(Application.Caller).TextFrame2.TextRange.Text

    'which way do you define destination?
    'this way you go to named range

    Application.Goto Range(curHL), True
    Exit Sub
ErrorHandler:
    MsgBox "There is no range like " & curHL
End Sub

5th. Протестируйте, имея следующие фигуры на листе с назначенным выше макросом, после щелчка по любой фигуре мы переместимся либо в диапазон ABC, либо в DEF в нашей книге. введите здесь описание изображения

6. Я добавил обработчик ситуации, когда вы пытаетесь перейти к несуществующему диапазону.

person Kazimierz Jawor    schedule 27.04.2013
comment
+1 Точно моя точка зрения. ОП опоздал с ответом, иначе я бы вчера вставил почти тот же код, LOL. - person Siddharth Rout; 27.04.2013
comment
Спасибо, это работает, но у меня есть большое количество ячеек, которые мне нужно назвать, чтобы это сработало (более 225). Есть ли другой обходной путь, который вы можете предложить для гиперссылки? Если я проверю наличие гиперссылки и заменю ее? Будет ли это работать? - person stew graff; 29.04.2013
comment
Я не уверен, правильно ли я вас понял... вы написали: "Я хочу, чтобы гиперссылка вела к определению XYZ?" значит, у вас где-то есть это определение. Итак, где и каким образом вы храните информацию о том, что XYZ должен открыть что-то вроде Sheet(Foo).Range(A100)... - person Kazimierz Jawor; 29.04.2013
comment
Я определяю XYZ на другом листе, но не называю диапазон XYZ, значение ячейки — XYZ. Это помогает? Определение представляет собой ячейку, объясняющую, что означает XYZ для новых пользователей. - person stew graff; 30.04.2013
comment
Теперь я понимаю. Однако я просто подумал, не могу ли я предложить вам что-нибудь интересное, но не нашел хорошего решения. В вашей ситуации кажется, что работает только метод Range.Find, но тогда вам нужно запускать его для каждого листа отдельно (рассмотрите это, если у вас не слишком много листов). Другим вариантом может быть матрица/массив «XYZ» ›› «пункт назначения XYZ», что может быть очень полезно. Наконец, я нахожу Range.Name подходящее решение в вашей ситуации... - person Kazimierz Jawor; 30.04.2013
comment
Итак, если бы я сделал что-то вроде: Sheets(Control Point Log).range(c1:c700).select. range.name = search_field перед application.goto range(search_field) это может сработать? - person stew graff; 30.04.2013
comment
да вот у вас именованные диапазоны, на мой взгляд неплохой и простой для вас вариант - person Kazimierz Jawor; 30.04.2013
comment
Спасибо, попробую. - person stew graff; 30.04.2013
comment
Если у вас есть какой-либо диапазон с именем XYZ, если вы затем поместите этот XYZ в виде текста в форму (как на изображениях выше), тогда код в моем ответе будет просто работать. Однако, если вы назовете свой диапазон XYZ_ABC, вам нужно поместить ту же строку в форму, а не XYZ ABC, которая отличается. Если вы не можете понять это на основе моего ответа, мне нужно будет увидеть ваш код. Лучшим вариантом для этого может быть начать новый вопрос, представляя то, что у вас есть. - person Kazimierz Jawor; 30.04.2013
comment
Спасибо. Я заставил ваш код работать, но только для отдельных диапазонов ячеек, у меня это не сработало, когда я попробовал диапазон из нескольких ячеек. Я подумаю, как лучше подойти к проблеме, так как я не хочу называть 200+ ячеек... - person stew graff; 01.05.2013