Здравствуйте. В документах нередко использую функцию ГИПЕРССЫЛКА, которая отправляет на разные диапазоны в зависимости от исходных данных. Недавно, в рамках VBA, начал осваивать возможность написания собственных функций, и одним из первых решил упростить создание адреса массива, типа 1:1 или A:A, на который должна перебрасывать гиперссылка. Написать функцию в VBA смог и она выдовала тот результат который надо, но когда сунул её в гипссылку, та не сработала. Методом исключения смог выяснить что в целом гипссылка может работать с моей функцией до тех пор пока в имени гипссылке я не использую именованные диапазоны. Отказываться от именованных диапазонов не хочется. Зря что ли создавал их? И функцию удобную для себя сделал. Так что прошу подскажите, может можно что то сделать что бы заставить их вместе работать как надо.
Здравствуйте. В документах нередко использую функцию ГИПЕРССЫЛКА, которая отправляет на разные диапазоны в зависимости от исходных данных. Недавно, в рамках VBA, начал осваивать возможность написания собственных функций, и одним из первых решил упростить создание адреса массива, типа 1:1 или A:A, на который должна перебрасывать гиперссылка. Написать функцию в VBA смог и она выдовала тот результат который надо, но когда сунул её в гипссылку, та не сработала. Методом исключения смог выяснить что в целом гипссылка может работать с моей функцией до тех пор пока в имени гипссылке я не использую именованные диапазоны. Отказываться от именованных диапазонов не хочется. Зря что ли создавал их? И функцию удобную для себя сделал. Так что прошу подскажите, может можно что то сделать что бы заставить их вместе работать как надо.ZetMenChavo
Проверьте названия листов. У меня во втором случае в диспетчере имен нечитаемое что-то. Возможно в разных версиях делалось и где-то что-то неправильно сработало. Для надежности используйте английский алфавит и в названиях листов и в коде VBA. В самом коде VBA разбираться не стал, гадать без комментариев что каждая строчка должна делать... А еще лучше объясните, что и для чего хотите сделать, а не как сделать Если вариант работает, то зачем ломать то, что работает?
Проверьте названия листов. У меня во втором случае в диспетчере имен нечитаемое что-то. Возможно в разных версиях делалось и где-то что-то неправильно сработало. Для надежности используйте английский алфавит и в названиях листов и в коде VBA. В самом коде VBA разбираться не стал, гадать без комментариев что каждая строчка должна делать... А еще лучше объясните, что и для чего хотите сделать, а не как сделать Если вариант работает, то зачем ломать то, что работает? _Igor_61
Сообщение отредактировал _Igor_61 - Суббота, 16.07.2022, 19:27
_Igor_61, Внёс изменения касательно языка, всё тоже самое. Я так понял, методом тыка, когда в стандартной функции использую и функцию ВБА и именованные диапазоны (не находящийся в ф.ВБА) то ГИПЕРССЫЛКА перестаёт отправлять на вычесленный диапазон.
Касательно действий в коде ВБА. Для ГСсылки адрес массива должен задаваться в виде адресов крайних ячеек и двоеточего между ними. К примеру выделить строку 3 будет "#3:3", а столбец E "#E:E". Со строками просто раз там только числа указываются, а вот со столбцами приходиться изощряться чтоб достать букву столбца. А так как указать букву нужно с обеих сторон от двоеточего, то приходиться дважды вычислять её. И в итоге вот такой вот функционный монстр получается
И это самый короткий вариант который можно написать стандартными функциями. Осваивая написание своих функций в ВБА, решил упростить вычисление адреса массива, вычисляя только одну букву, а мокрос уже из неё полноценный адрес делает. В итоге получается тот же результат что и в верхней а запись короче.
(Второй и третий параметры в ней не обязательны, 2й задаёт отступ от первой выч-ой ячейки, 3й переключает между столбцами(0) и строкаи(1))
Для меня сюрпризом стало что ГСсылка перестает работать, если использую вместе с ф.ВБА именованные диапазоны. Но отказываться от них не хотелось бы, таблица большая и они упрощают написание формул.
_Igor_61, Внёс изменения касательно языка, всё тоже самое. Я так понял, методом тыка, когда в стандартной функции использую и функцию ВБА и именованные диапазоны (не находящийся в ф.ВБА) то ГИПЕРССЫЛКА перестаёт отправлять на вычесленный диапазон.
Касательно действий в коде ВБА. Для ГСсылки адрес массива должен задаваться в виде адресов крайних ячеек и двоеточего между ними. К примеру выделить строку 3 будет "#3:3", а столбец E "#E:E". Со строками просто раз там только числа указываются, а вот со столбцами приходиться изощряться чтоб достать букву столбца. А так как указать букву нужно с обеих сторон от двоеточего, то приходиться дважды вычислять её. И в итоге вот такой вот функционный монстр получается
И это самый короткий вариант который можно написать стандартными функциями. Осваивая написание своих функций в ВБА, решил упростить вычисление адреса массива, вычисляя только одну букву, а мокрос уже из неё полноценный адрес делает. В итоге получается тот же результат что и в верхней а запись короче.
(Второй и третий параметры в ней не обязательны, 2й задаёт отступ от первой выч-ой ячейки, 3й переключает между столбцами(0) и строкаи(1))
Для меня сюрпризом стало что ГСсылка перестает работать, если использую вместе с ф.ВБА именованные диапазоны. Но отказываться от них не хотелось бы, таблица большая и они упрощают написание формул.ZetMenChavo
Может можно как то свою ГИПЕРССЫЛКУ в ВБА написать? Это помогло бы обойти проблему, ибо написанная ф-я не капризничает когда именованные диапазоны указаны в ней. Я только не знаю какой тип данных нужно присвоить что бы написанная работала так же как встроенная. Может кто из знатаков тут знает?
Может можно как то свою ГИПЕРССЫЛКУ в ВБА написать? Это помогло бы обойти проблему, ибо написанная ф-я не капризничает когда именованные диапазоны указаны в ней. Я только не знаю какой тип данных нужно присвоить что бы написанная работала так же как встроенная. Может кто из знатаков тут знает?ZetMenChavo
Сообщение отредактировал ZetMenChavo - Суббота, 16.07.2022, 22:38
А еще лучше объясните, что и для чего хотите сделать, а не как сделать
Ответа не последовало, поэтому излагаю свои (может и тупые и неправильные мысли) Исходя из названия пользовательской функции - нужно облегчить работу ГИПа, чтобы при нажатии на ячейку с определенным значением он смог перейти на нужный диапазон. Отсюда и имена появились. Но в примере - только "15", приходится гадать - это строка, или имя диапазона или еще что-то... Если нужно в VBA - я бы просто посадил адреса на события выделения ячеек (типа Range(такой-то).Value=>переход, без использования функции "гиперссылка", а адреса указывал в коде в виде переменных (но не в диспетчере имен, т.к. имен иного будет, а переменной можно присвоить значение из выделенной ячейки), но если Вам уж так хочется гиперссылки в код запихать... непонятно зачем это надо. Они и так работают, в штатном режиме.
А еще лучше объясните, что и для чего хотите сделать, а не как сделать
Ответа не последовало, поэтому излагаю свои (может и тупые и неправильные мысли) Исходя из названия пользовательской функции - нужно облегчить работу ГИПа, чтобы при нажатии на ячейку с определенным значением он смог перейти на нужный диапазон. Отсюда и имена появились. Но в примере - только "15", приходится гадать - это строка, или имя диапазона или еще что-то... Если нужно в VBA - я бы просто посадил адреса на события выделения ячеек (типа Range(такой-то).Value=>переход, без использования функции "гиперссылка", а адреса указывал в коде в виде переменных (но не в диспетчере имен, т.к. имен иного будет, а переменной можно присвоить значение из выделенной ячейки), но если Вам уж так хочется гиперссылки в код запихать... непонятно зачем это надо. Они и так работают, в штатном режиме.
_Igor_61, всмысле не последовало? В ответе на ваше первое сообщение всё написал. Поставленную задачу гипссылка выполняет как надо, но как я писал раньше, мой интерес в упрощение использования штатных функций. К примеру для выполнения другой задачи мне приходилось писать функциями вот такого монстра (в работу которого можете не вникать)
Function МОИТблАртШт(Krai As Range, Vsego As Range, ArtCvet As Range, ArtVkl As Range, TabArt As Range, Art123 As Range) As Long Dim oX&, oY&, oZ&, KC As Long KC = Application.Caller.Column - Krai.Column oZ = 2 Do While KC > 3 KC = KC - 3 oZ = oZ + 1 Loop oX = Choose(KC, 1, 4, 9) For oY = 2 To TabArt.Rows.Count - 1 If (ArtVkl.Cells(oY) = "+" Or Vsego) _ And TabArt.Cells(oY, oX) = ArtCvet.Cells(oZ) _ And Art123.Cells(oY) Like "*" & KC & "*" _ Then МОИТблАртШт = МОИТблАртШт + 1 Next oY End Function
[/vba] С гипссылкой цель та же, превратить функции, вычисляющие адрес столбцов, из этих
Function МОИДЛЯГИП(NomerStrStl As Long, Optional Otstup As Long, Optional StrILIStl As Byte) As String Dim AdrsT1$, AdrsT2$, AdrsN1&, AdrsN2& AdrsN1 = NomerStrStl AdrsN2 = NomerStrStl + Otstup '========================= If StrILIStl = 0 Then Do While AdrsN1 > 0 oX = Int((AdrsN1 - 1) / 26) oY = (AdrsN1 - 1) Mod 26 AdrsT1 = Chr(oY + 65) & AdrsT1 AdrsN1 = oX Loop If Otstup > 0 Then Do While AdrsN2 > 0 oX = Int((AdrsN2 - 1) / 26) oY = (AdrsN2 - 1) Mod 26 AdrsT2 = Chr(oY + 65) & AdrsT2 AdrsN2 = oX Loop Else: AdrsT2 = AdrsT1 End If Else: AdrsT1 = AdrsN1: AdrsT2 = AdrsN2 End If '========================= МОИДЛЯГИП = "#" & AdrsT1 & ":" & AdrsT2 End Function
[/vba] И это работает, гипссылка переносит куда надо, но лишь до тех пор пока в внутри гипссылки, но за пределами моей функции я не начинаю использовать именованные диапазоны. А использовать их приходиться так как диапазонов много и часть из них скрывается, так что когда возникает необходимость что либо редактировать в документе проще указывать имена диапазонов. Я обычно сам страюсь способы решения моих задач в инете, и зачастую удачно, но кагда возникают такие мелочи недающие мне получить то что я хочу от функционала, меня это вводит в ступор. Поэтому и интересует можно ли как то заставить гипссылку работать с моей функцией и именованными диапазонами. Обходные пути явно будуд только усложнять задачу и, даже если надо будет, сам смогу их найти, но тогда это не даст мне ответа на мой вопрос.
Цитата
Ответа не последовало...
_Igor_61, всмысле не последовало? В ответе на ваше первое сообщение всё написал. Поставленную задачу гипссылка выполняет как надо, но как я писал раньше, мой интерес в упрощение использования штатных функций. К примеру для выполнения другой задачи мне приходилось писать функциями вот такого монстра (в работу которого можете не вникать)
Function МОИТблАртШт(Krai As Range, Vsego As Range, ArtCvet As Range, ArtVkl As Range, TabArt As Range, Art123 As Range) As Long Dim oX&, oY&, oZ&, KC As Long KC = Application.Caller.Column - Krai.Column oZ = 2 Do While KC > 3 KC = KC - 3 oZ = oZ + 1 Loop oX = Choose(KC, 1, 4, 9) For oY = 2 To TabArt.Rows.Count - 1 If (ArtVkl.Cells(oY) = "+" Or Vsego) _ And TabArt.Cells(oY, oX) = ArtCvet.Cells(oZ) _ And Art123.Cells(oY) Like "*" & KC & "*" _ Then МОИТблАртШт = МОИТблАртШт + 1 Next oY End Function
[/vba] С гипссылкой цель та же, превратить функции, вычисляющие адрес столбцов, из этих
Function МОИДЛЯГИП(NomerStrStl As Long, Optional Otstup As Long, Optional StrILIStl As Byte) As String Dim AdrsT1$, AdrsT2$, AdrsN1&, AdrsN2& AdrsN1 = NomerStrStl AdrsN2 = NomerStrStl + Otstup '========================= If StrILIStl = 0 Then Do While AdrsN1 > 0 oX = Int((AdrsN1 - 1) / 26) oY = (AdrsN1 - 1) Mod 26 AdrsT1 = Chr(oY + 65) & AdrsT1 AdrsN1 = oX Loop If Otstup > 0 Then Do While AdrsN2 > 0 oX = Int((AdrsN2 - 1) / 26) oY = (AdrsN2 - 1) Mod 26 AdrsT2 = Chr(oY + 65) & AdrsT2 AdrsN2 = oX Loop Else: AdrsT2 = AdrsT1 End If Else: AdrsT1 = AdrsN1: AdrsT2 = AdrsN2 End If '========================= МОИДЛЯГИП = "#" & AdrsT1 & ":" & AdrsT2 End Function
[/vba] И это работает, гипссылка переносит куда надо, но лишь до тех пор пока в внутри гипссылки, но за пределами моей функции я не начинаю использовать именованные диапазоны. А использовать их приходиться так как диапазонов много и часть из них скрывается, так что когда возникает необходимость что либо редактировать в документе проще указывать имена диапазонов. Я обычно сам страюсь способы решения моих задач в инете, и зачастую удачно, но кагда возникают такие мелочи недающие мне получить то что я хочу от функционала, меня это вводит в ступор. Поэтому и интересует можно ли как то заставить гипссылку работать с моей функцией и именованными диапазонами. Обходные пути явно будуд только усложнять задачу и, даже если надо будет, сам смогу их найти, но тогда это не даст мне ответа на мой вопрос.ZetMenChavo
Сообщение отредактировал ZetMenChavo - Вторник, 19.07.2022, 11:19
Здравствуйте, ZetMenChavo и Игорь С момента появления первого поста в этой теме, попробовал "включиться", но первый тест оказался неудачным и я ошибку не понял. Решил подождать готового решения, и подписался на тему. Но решение в теме не "родилось", поэтому попытался еще раз разобраться "что же не так".
Функция ГИПЕРССЫЛКА имеет 2 аргумента адрес и [имя], причем, 2-й не обязательный. Тесты показали, что если один из аргументов содержит Пользовательское имя или функцию, то гиперссылка РАБОТАЕТ, а если оба аргумента включают Пользовательское имя(функцию), не зависимо от формата данных аргумента [имя] (Текст/число), переход по ссылке НЕ работает. Думаю, это глюк майкрософта, т.к. описание такого поведения на официальных сайтах не нашел.
Решение: не указывать второй аргумент или указывать его средствами и диапазонами Excel или статично (( ну или требовать от MS исправления глюка ))
Здравствуйте, ZetMenChavo и Игорь С момента появления первого поста в этой теме, попробовал "включиться", но первый тест оказался неудачным и я ошибку не понял. Решил подождать готового решения, и подписался на тему. Но решение в теме не "родилось", поэтому попытался еще раз разобраться "что же не так".
Функция ГИПЕРССЫЛКА имеет 2 аргумента адрес и [имя], причем, 2-й не обязательный. Тесты показали, что если один из аргументов содержит Пользовательское имя или функцию, то гиперссылка РАБОТАЕТ, а если оба аргумента включают Пользовательское имя(функцию), не зависимо от формата данных аргумента [имя] (Текст/число), переход по ссылке НЕ работает. Думаю, это глюк майкрософта, т.к. описание такого поведения на официальных сайтах не нашел.
Решение: не указывать второй аргумент или указывать его средствами и диапазонами Excel или статично (( ну или требовать от MS исправления глюка ))boa
Сообщение отредактировал boa - Среда, 20.07.2022, 00:08
Может можно как то свою ГИПЕРССЫЛКУ в ВБА написать?
Пользовательские функции не могут переходить "куда-то". Поэтому, отбросьте эту идею. Либо обработка событий листа макросом( о чем Игорь писал выше), либо только вычисление.
Может можно как то свою ГИПЕРССЫЛКУ в ВБА написать?
Пользовательские функции не могут переходить "куда-то". Поэтому, отбросьте эту идею. Либо обработка событий листа макросом( о чем Игорь писал выше), либо только вычисление.boa
Сообщение отредактировал boa - Среда, 20.07.2022, 00:24
Думаю, это глюк майкрософта, т.к. описание такого поведения на официальных сайтах не нашел
boa, Спасибо что замарочились с моим вопросом . Жаль что Эксель с таким обилием возможностей порой не может точно сделать что надо из-за недоделки Майкросовцев. Имя гипссылок я для условного форматирования использую, да и просто чтоб эстетичный текст стоял а не просто адрес, так что обойтись тут без указании имени не смогу, в отличие от использования своей пользовательской функции.
Цитата
Пользовательские функции не могут переходить "куда-то". Поэтому, отбросьте эту идею
Это уже и своими силами выяснил, пока искал в инете "создание гипссылок макросом". Забавно что стандартная гипссылка существоет, а способа создать свою её версию макросом не завезли.
Цитата
Думаю, это глюк майкрософта, т.к. описание такого поведения на официальных сайтах не нашел
boa, Спасибо что замарочились с моим вопросом . Жаль что Эксель с таким обилием возможностей порой не может точно сделать что надо из-за недоделки Майкросовцев. Имя гипссылок я для условного форматирования использую, да и просто чтоб эстетичный текст стоял а не просто адрес, так что обойтись тут без указании имени не смогу, в отличие от использования своей пользовательской функции.
Цитата
Пользовательские функции не могут переходить "куда-то". Поэтому, отбросьте эту идею
Это уже и своими силами выяснил, пока искал в инете "создание гипссылок макросом". Забавно что стандартная гипссылка существоет, а способа создать свою её версию макросом не завезли.ZetMenChavo
Сообщение отредактировал ZetMenChavo - Среда, 20.07.2022, 11:42
можно, например обрабатывать значение ячейки при получении фокуса и подменять его на гипперрсылку [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 6 And Target.Count = 1 Then On Error Resume Next Me.Hyperlinks.Add Anchor:=Target, Address:="", SubAddress:=Target.Value, TextToDisplay:=Target.Value On Error GoTo 0 End If End Sub
[/vba]
ZetMenChavo, макросом можно. функцией нельзя
можно, например обрабатывать значение ячейки при получении фокуса и подменять его на гипперрсылку [vba]
Код
Private Sub Worksheet_SelectionChange(ByVal Target As Range) If Target.Column = 6 And Target.Count = 1 Then On Error Resume Next Me.Hyperlinks.Add Anchor:=Target, Address:="", SubAddress:=Target.Value, TextToDisplay:=Target.Value On Error GoTo 0 End If End Sub