Страницы: 1
RSS
Как на VBA вернуть имя именованного диапазона, который используется в выпадающем списке данной ячейки.
 
Собственно, описание проблемы в названии темы.
 
kai61, а самого файла у Вас нет?
 
Код
Debug.Print Mid(ActiveCell.Validation.Formula1, 2)
Владимир
 
Я совсем плохо знаю ВБА. Смысл такой: На листе есть много ячеек с выпадающими списками, которые берутся из именованных диапазонов. Есть макрос, который улавливает изменения в этой ячейке, сравнивает их со списком и если этого слова в списке нет, добавляет его в именованный диапазон. В этом макросе переменной присваивается имя диапазона. Но, макрос один, а ячеек со списком много. Вот я и подумал, что если я верну имя диапазона для данной ячейки, то смогу его присвоить этой переменной. Этот базовый макрос написан в "Выпадающий список с пополнением".
 
Цитата
sokol92 написал:
Debug.Print Mid(ActiveCell.Validation.Formula1, 2)
А что делает эта строка? Я попробовал ее изменить на Debug.Print Mid(Target.Adress.Validation.Formula1, 2), а оно мне сказало, что так не бывает.
 
kai61,
если вы не знаете что делать с подсказкой, которая отвечает на ваш вопрос, то перечитайте сообщение #2 в вашей теме, может это подтолкнет вас к правильным действиям
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Юрий М написал:
kai61 , а самого файла у Вас нет?
Сделал тренировочный файл. Как заставить работать разные диапазоны на одном листе?
Изменено: kai61 - 03.04.2020 08:36:15
 
Цитата
kai61 написал: Собственно, описание проблемы в названии темы.
Описание задачи и файл-пример должны быть в первом сообщении
 
У Вас была подсказка в #3 ))
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NameRange As String 'Добавлено Ю.И.
    Set p = Range("диапазон_1")
    If Target.Cells.Count > 1 Then Exit Sub
    If IsEmpty(Target) Then Exit Sub
    If Not Intersect(Target, Range("D2:D10")) Is Nothing Then
        Application.EnableEvents = False 'Отключили отслеживание событий (Добавлено Ю.И.)
        If WorksheetFunction.CountIf(p, Target) = 0 Then
            r = MsgBox("Добавить новое имя в справочник?", vbYesNo)
            If r = vbYes Then p.Cells(p.Rows.Count + 1) = Target
        End If
        NameRange = Mid(ActiveCell.Validation.Formula1, 2) 'Добавлено Ю.И.
        MsgBox "Значение переменной = " & NameRange, 64, "Для сведения"
    End If
    Application.EnableEvents = True 'Добавлено Ю.И.
End Sub
 
Спасибо, но предложенный Вами вариант макроса работает не корректно. А именно: выпадающий список в ячейке D4 , берется правильно, из "диапазона_2", но потом он сравнивает выбранное значение с "диапазоном_1", не находит аналога и заносит его в "диапазон_1". В этом то и вся заковыка.
 
Цитата
kai61 написал:
В этом то и вся заковыка
Т.е., Вы знали, как извлечь имя диапазона, а затруднения именно с этой "заковыкой"?
 
Вы же сами установили в строке 3 один единственный диапазон.
Проверьте такой вариант:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
Dim NameRange As String, p As Range 'Добавлено Ю.И.
    If Target.Cells.Count > 1 Then Exit Sub
    If IsEmpty(Target) Then Exit Sub
    If Not Intersect(Target, Range("D2:D10")) Is Nothing Then
        Application.EnableEvents = False 'Отключили отслеживание событий (Добавлено Ю.И.)
        NameRange = Mid(Target.Validation.Formula1, 2) 'Добавлено Ю.И.
        Set p = Range(NameRange) 'Добавлено Ю.И.)
        If WorksheetFunction.CountIf(p, Target) = 0 Then
            r = MsgBox("Добавить новое имя в справочник?", vbYesNo)
            If r = vbYes Then p.Cells(p.Rows.Count + 1) = Target
        End If
        MsgBox "Значение переменной = " & NameRange, 64, "Для сведения"
    End If
    Application.EnableEvents = True 'Добавлено Ю.И.
End Sub
 
Цитата
kai61 написал:
Спасибо, но предложенный Вами вариант макроса работает не корректно.
извините, но просто кто-то не может корректно сформулировать проблему, которую не может решить
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Юрий М написал:
Т.е., Вы знали, как извлечь имя диапазона, а затруднения именно с этой "заковыкой"?
Я и сейчас не знаю, как это сделать. Похоже, определение имени диапазона происходит в строке NameRange = Mid(ActiveCell.Validation.Formula1, 2). Но тогда мне нужно вместо ActiveCell нужно прописать не активную ячейку, а ту, в которой произошли изменения. (юзер чтот-то напишет, нажмет Enter и активной ячейкой станет другая. Типа Target.Adress ?
И еще получается, что эту строку мне нужно будет поставить перед строкой Set p = Range("диапазон_1") или переписать ее приблизительно так: Set p =  Mid(ActiveCell.Validation.Formula1, 2).

Попробовал Set p =  Mid(ActiveCell.Validation.Formula1, 2) - ругается.
 
kai61, а Вы #12 видели?
 
Цитата
Юрий М написал:
Проверьте такой вариант:
Работает!!! Вы мне очень помогли! Спасибо огромное! Здоровья и удачи Вам в жизни!
 
Цитата
Юрий М написал:
Проверьте такой вариант:
Возможно, сажусь на голову, но оказалось, что из выпадающего списка можно выбрать несколько значений, разделенных запятыми. Вот макрос:
Код
Private Sub Worksheet_Change(ByVal Target As Range)
    On Error Resume Next
    If Not Intersect(Target, Range("C2:C5")) Is Nothing And Target.Cells.Count = 1 Then
        Application.EnableEvents = False
        newVal = Target
        Application.Undo
        oldval = Target
        If Len(oldval) <> 0 And oldval <> newVal Then
            Target = Target & "," & newVal
        Else
            Target = newVal
        End If
        If Len(newVal) = 0 Then Target.ClearContents
        Application.EnableEvents = True
    End If
End Sub

Он работает, но хотелось бы объединить его с первым. Очень хотелось бы. Поможете?
Изменено: kai61 - 14.04.2020 10:57:45
 
1. Код.
2. Файл.
3. А чего сразу я? )
 
Цитата
Юрий М написал:
1. Код.2. Файл.3. А чего сразу я? )
1.1. Код Вашего макроса на Листе2
1.2. Код макроса, который позволяет из выпадающего списка выбрать несколько значений - на Листе3

2. Файл прикреплен

3. А разве кто-то смог, кроме Вас? Откликнулся? Решил мою задачу? Поэтому - Вы!
 
Пункт 1  - это про оформление кода в #17. Исправьте.
А обращаясь за помощью к конкретному человеку, Вы тем самым ограничиваете круг потенциальных помощников. А я сейчас по объективным причинам не могу...
 
Цитата
Юрий М написал:
Пункт 1  - это про оформление кода в #17. Исправьте.
Я перечитал правила форума и не нашел, как правильно оформляется код для форума. Увы мне. И в остальном, Вы правы.
 
Найдите такую кнопку (см. скрин).
 
Похоже, мне удалось совместить оба макроса. Теперь я могу из выпадающего списка выбрать любое количество значений (правда после добавления каждого нового значения он меня спрашивает, нужно ли внести эту пару значений в именованный диапазон и так на присоединение третьего т.д. значения) и, при желании записать новое составное значение в именованный диапазон.

В файле -это лист "Сборка".


Похоже, мне опять не удалось правильно оформить тут код. Извините - туповат от природы. Посмотрел в реале - совсем плохо. Лучше удалю.
Изменено: kai61 - 09.04.2020 08:44:49
 
kai61, а в чём сложность? Выделяем код в редакторе, копируем, нажимаем на кнопку (см. скрин в #22) вставляем скопированное.
 
Цитата
Юрий М написал:
Выделяем код в редакторе, копируем, нажимаем на кнопку (см. скрин в #22) вставляем скопированное.
Все понятно. Я сначала вставил код, потом выделил и нажал кнопку. Спасибо. Учту.
 
Ну хоть теперь исправьте свой #17. Сколько же можно Вас просить?
 
Цитата
Юрий М написал:
Ну хоть теперь исправьте свой #17. Сколько же можно Вас просить?
Извините, только добрался до компьютера. Исправился.
Страницы: 1
Наверх