Страницы: 1 2 След.
RSS
Проверка данных ячейки макросом
 
Доброго времени суток уважаемые жители планеты!
Заранее прошу прощения за создание темы ( её начало тут) немного условия поменялись, но проблема та же.
Взываю к Вашей помощи ибо не знаю, что делать с текущей проблемой и как из неё выйти.
  Есть книга с двумя листами. На первом листе таблица (примерно 200 строк, но может меняться).В таблицу, исходя из условий поставленных пользователем, макросом вносятся начальные данные (каждой ячейке или буква, или цифра). Далее пользователь корректирует таблицу уже по фактическим данным. Но при этом есть условия:
1.Буквенные значения ограничены перечнем (именованный диапазон на Листе2) и не заменяются на цифры ( это я решил );
2. Ячейки с исходно числовыми значениями (могут быть целыми или с десятыми), меняются только на буквы или же на изначально (внесенную макросом) цифру.
  Все эти задачи с легкостью решает стандартная "Проверка". Но... Оказывается,при создании Проверки макросом, Экселю тяжело понять, что я от него хочу. (НУ ИЛИ Я СКОРЕЕ НЕ ПРАВИЛЬНО ЕМУ ОБЪЯСНЯЮ)
В файле в ячейке А1 установлена проверка вручную. А в В1 поместить проверку макросом не могу.
Прошу Вашей помощи в решении второго пункта. Заранее огромное спасибо всем за помощь!
 
Здравствуйте.
Я (честно) пытался понять критерии проверки ячейки, которые вы описываете. Про числа - вообще не понял как.
Пока нашел только то, что счетесли надо писать СЧЁТЕСЛИ (чрез Ё) - функция пишется именно так.
Не знаю, решит это проблему, или нет.
Опять же - проверки у вас - все в процедурах, которые не срабатывают автоматом (не привязаны к событию на листе, изменению значения ячейки там, или еще какому), а написаны в отдельных процедурах, которые надо запускать. Т.е. чтобы макрос начал работать - его надо запустить. Вы меняете значение в нужной ячейке - как макрос поймет, что "уже пора, Коля!"?
Кому решение нужно - тот пример и рисует.
 
Здравствуйте Пытливый! Спасибо, что обратили внимание на тему.
Цитата
как макрос поймет, что "уже пора, Коля!"?
Это же я для образца, сделал.  Весь файл очень большой. Вот я только проблемный участок и показал. В реальном файле дело идет так: пользователь, в UserForm отбирает нужные позиции, их количество и подчиненность, нажимает ОК и макрос составляет полную таблицу начальных данных ( если хотите, назовем её неким ГРАФИКОМ или ПЛАНОМ ). Как только таблица составлена, макрос выставляет проверку. А далее пользователь редактирует данные в таблице.
Проблема в том, что цифры, которые изначально проставляет макрос, предугадать нельзя. Но и другие ставить пользователю тоже запрещено. Цифры можно заменять только на буквы из именованного диапазона.
Буду рад любому совету.
 
Ну... тогда у вас уже все сделано, т.е. надо определить конкретную ячейку, для которой стараемся (у вас в коде это все для АсtiveCell).
А так я вон макрорекордером записал:
Код
Sub Макрос1()
'
' Макрос1 Макрос
'

'
    With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="=исходник"
        .IgnoreBlank = True
        .InCellDropdown = True
        .InputTitle = ""
        .ErrorTitle = ""
        .InputMessage = ""
        .ErrorMessage = ""
        .ShowInput = True
        .ShowError = True
    End With
End Sub

Потом выделил В2, запустил - все гуд.
Кому решение нужно - тот пример и рисует.
 
Да! Ваш пример только на случай замены цифр на букву. Но если пользователь изменил цифру на букву, а через время снова захотел поставить прежнюю цифру, то столкнется с ошибкой. Вот по этому, в примере я использовал другую формулу. Задача составить проверку, которая будет позволять наличие только букв из именованного диапазона или исходной цифры.
Изменено: Ronin751 - 06.05.2016 14:01:11
 
Ну добавьте в именованный список значение изначальное и все...
Код
ActiveWorkbook.Names("ИСХОДНИК").Delete 'удаляем именованный диапазон
'копируем из В1 листа 1 в первую пустую столбца А на листе 2
Worksheets("Лист1").Range("B1").copy Worksheets("Лист2").Range("A" & Worksheets("Лист2").Range("A1").CurrentRegion.Rows.Count +1)
'делаем новый именованный диапазон
ActiveWorkbook.Names.Add Name:="ИСХОДНИК", RefersToR1C1:="=Лист2!R1C1:R" & Worksheets("Лист2").Range("A1").CurrentRegion.Rows.Count & "C1"
Изменено: Пытливый - 06.05.2016 14:14:21
Кому решение нужно - тот пример и рисует.
 
Цитата
Ну добавьте в именованный список значение изначальное и все...
С радостью, но я их сам не знаю. Их рассчитывает  макрос. Да и если представить, что в именованом диапазоне будут допустим еще и 5,6,8,9... То, что в этом случае будет мешать пользователю изменить изначальную 9 на 5?!
Но за предложение спасибо!
 
Цитата
Ronin751 написал: цифры, которые изначально проставляет макрос, предугадать нельзя. Но и другие ставить пользователю тоже запрещено.
Такое не то что макросу не объяснить, тут и человеку-то надо столько выпить, что бы понять... ;)
Не отчаивайтесь, попытайтесь еще раз объяснить.
На сколько я понял на текущий момент - По событию Change нужной ячейке добавляйте значение Target.Value к Списку Проверки данных
Согласие есть продукт при полном непротивлении сторон
 
Развивая мысль ув.Sanja, по событию Change
1. сохраняете буквенный массив из диапазона проверки куда-нить
2. очищаете имя с массивом
3. вставляете сохраненные буквы "взад"
4. добавляете нужное значение из ячейки к массиву
5. формируете новый именованный диапазон
6. Ставите проверку на ячейку по этому диапазону.

Ничего не забыл? :)
Кому решение нужно - тот пример и рисует.
 
"Растекаемся" мыслью дальше
Цитата
Пытливый написал:
5. формируете новый именованный диапазон
6. Ставите проверку на ячейку по этому диапазону.
не обязательно. Проверка данных принимает в качестве Списка строку, которую можно формировать прямо в коде, изначально, без ссылок на диапазоны
Код
With Selection.Validation
        .Delete
        .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
        xlBetween, Formula1:="1,2,3,4,5,6,7,8,9"
        ....
    End With
Изменено: Sanja - 06.05.2016 14:51:52
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Не отчаивайтесь, попытайтесь еще раз объяснить
С помощью макроса составляется таблица и заносятся начальные данные. Следующий ход макроса - установить проверку эти ячейки. Условием для устанавки проверки является: если в ячейке текст -значит, при редактировании этой ячейки, допускаются только буквенные значения из именованного диапазона (на листе2); если в ячейке число(допустим 7) - то, при редактировании этой ячейки, допускаются только буквенные значения из именованного диапазона (на лист2) и это число (то есть 7). Фух! Вроде так.
Желтым выделил ячейки в которых уже установил проверку вручную.
Прошу помощи!
 
?
Код
Sub ПРОВЕРКА()
   Dim j As String, i As Long, w As Long
    j = 14: Do While Cells(j, 4) > "": j = j + 3: Loop: j = j + 1
    For i = 14 To j Step 3
        For w = 5 To 35
            a = Cells(i, w)
            With Cells(i, w).Validation
                .Delete
                If Not IsNumeric(Cells(i, w)) Then
                    S = "А,Б,У,О,ПР,К"
                    errS = "Допускаются только буквенные значения"
                Else
                    X = "=или(счётесли(ИСХОДНИК;" & Cells(i, w).Address & ");счетесли(" & Cells(i, w).Address & ";" & a & "))"
                    S = "А,Б,У,О,ПР,К," & Replace(Cells(i, w), ",", ".")
                    errS = "Допускаются только буквенные значения или " & Replace(Cells(i, w), ",", ".")
                End If
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=S
                    .InCellDropdown = True: .ErrorMessage = errS
                    .ErrorTitle = "Отклонение от условий ": .ShowInput = False: .ShowError = True
            End With
        Next w
    Next i
End Sub
Согласие есть продукт при полном непротивлении сторон
 
Вроде и проверку выполнило но...
Цитата
S = "А,Б,У,О,ПР,К," & Replace(Cells(i, w), ",", ".")
В ячейках, где числовое значение записано через запятую, эту самую запятую превращаем в точку. Только проблема возникает при попытке изменить, допустим 4,5 на 4.5. Все равно пишет, что значение не допустимое. И сумма получается уже другая.
Но за мысль и за Ваше внимание спасибо!
 
Да, я это тоже заметил. Если в строку для Проверки вставлять числа с запятой, то Список их разбивает на два значения. Этот пример больше как направление для дальнейшего движения.
Согласие есть продукт при полном непротивлении сторон
 
Я это тоже делал, только немного иначе. Сейчас думаю как число с запятой загнать в кавычки (как текст). Тогда проверка, по идее, должна воспринять его.  
 
Можно вернуться к схеме, которую предложил Пытливый, Добавлять значение к диапазону и в Проверку вставлять ссылку на него
Согласие есть продукт при полном непротивлении сторон
 
Проверил на практике идею Пытливый,
После этого пункта
Цитата
5. формируете новый именованный диапазон
т.к. всем ячейкам назначается диапазон с одним и тем-же именем (хоть его содержимое и меняется от ячейки к ячейке), то, в итоге, для всех ячеек будет назначен диапазон со значениями для последней ячейки, что логично.
Можно, конечно для каждой ячейки создать свой собственный диапазон, но тогда этих имен будет 31 * кол-во Пунктов.
Согласие есть продукт при полном непротивлении сторон
 
Именно об этом я говорил в посте № 7
Цитата
...да и если представить, что в именованном диапазоне будут допустим еще и 5,6,8,9... То, что в этом случае будет мешать пользователю изменить изначальную 9 на 5?!
И с кавычками у меня не получается. Эксель все равно интерпретирует число с запятой, как два разных. (((
Видимо реально проблема получается?!  :cry:  
 
Цитата
Ronin751 написал: Именно об этом я говорил в посте № 7
Нет, мы говорим про разные вещи. Но все равно решения нет. Пока
Может более опытные коллеги помогут.
Сузим вопрос.
Как к Списку Проверки данных добавить число с запятой с помощью макроса?
Конкретно - как в нижеприведенном коде добавить к переменной S(строка кода 13) число с запятой в качестве разделителя дробной части?

Или может какое другое решение будет?
Код
Sub ПРОВЕРКА()
   Dim j As String, i As Long, w As Long
    j = 14: Do While Cells(j, 4) > "": j = j + 3: Loop: j = j + 1
    For i = 14 To j Step 3
        For w = 5 To 35
            a = Cells(i, w)
            With Cells(i, w).Validation
                .Delete
                If Not IsNumeric(a) Then
                    S = "А,Б,У,О,ПР,К"
                    errS = ""
                Else
                    S = "А,Б,У,О,ПР,К," & Trim(Str(a))
                    errS = " или " & a
                End If
                    .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, Formula1:=S
                    .InCellDropdown = True: .ErrorMessage = "Допускаются только буквенные значения" & errS
                    .ErrorTitle = "Отклонение от условий ": .ShowInput = False: .ShowError = True
            End With
        Next w
    Next i
End Sub
Изменено: Sanja - 07.05.2016 13:51:14
Согласие есть продукт при полном непротивлении сторон
 
   Вообще, конечно странно... Но видимо приходится констатировать тот факт, что любое (даже текстовое значение) которое записано через запятую в ячейке, с помощью ВБА не возможно добавить в стандартную проверку. Просто потому, что эксель, в этом случае,  не воспринимает запятую как десятичный разделитель, а упорно думает, что это перечисление последовательных (или не последовательных) пунктов.  :cry:
   Но тут появляется вопрос: почему когда в проверку добавляешь значение через запятую, то всё нормально?
 
Цитата
Ronin751 написал: с помощью ВБА не возможно добавить в стандартную проверку. Просто потому, что эксель, в этом случае,  не воспринимает запятую как десятичный разделитель, а упорно думает, что это перечисление последовательных
мне кажется не xl, а vba
Цитата
Ronin751 написал: Но тут появляется вопрос: почему когда в проверку добавляешь значение через запятую, то всё нормально?
а тут не vba, а xl
(думаю в вашем вопросе и есть этот ответ)
Изменено: JeyCi - 08.05.2016 15:19:39
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Как то странно получается не правда ли? Эксель не понимает ВБА. хм-м.
 
Цитата
Ronin751 написал: Эксель не понимает ВБА.
расхождения бывают в рус.яз xl (именно по трактовке запятой и точки-с-запятой в формулах, а также десятичного разделителя)
Изменено: JeyCi - 08.05.2016 16:30:52
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
 
Поскольку при попытке создать проверку макросом эксель не воспринимает запятую как десятичный разделитель, решил пойти нахрапом: сменил десятичный разделитель с запятой на точку (меню пуск - панель управления - пункт "Языки и региональные стандарты"). Но эффект тот же (даже если формат ячейки перевести в текстовый).  :evil:  Получается, что с помощью ВБА вообще не возможно передать в проверку значение с любым разделителем?! И это очень прискорбно.  :cry:
 
Вариант: создать именованный динамический (если размер меняется) диапазон и его скармливать Проверке данных.
 
Цитата
Вариант: создать именованный динамический
Если я правильно понимаю, то в этом случае придется добавлять новые значения (с разделителями) в именованный динамический диапазон и  в итоге все эти значения будут доступны для каждой ячейки. Но этот вариант не подходит, так как необходимо чтоб список проверки был наполнен значениями (буквенными) из именованного списка и значением самой ячейки ( к примеру "3,5"). Или можно как то это менять?
 
 
Не понимаю проблемы (вопроса): что будет в ячейках, то и увидите в выпадающем списке.
 
Цитата
Юрий М написал: Не понимаю проблемы
Юрий М, я тоже не сразу воткнулся. Тут не все так просто. Диапазон не просто динамический. Проблема в том, что в Диапазон необходимо добавлять значение, если оно НЕ из Диапазона, но находится в ячейке на момент добавления в нее Проверки данных. А таким значением может быть число с десятичной запятой, которая Списком Проверки данных расценивается как разделитель списка. Теоретически таких РАЗНЫХ Списков может быть 31 (кол-во столбцов) * кол-во строк в таблице. Хотелось это обойти (назначение КАЖДОЙ ячейке СВОЕГО Списка (см. код в #19), но из-за запятой не выходит. С целыми числами проблем нет.
Как-то так  
Согласие есть продукт при полном непротивлении сторон
 
Цитата
Sanja написал:
если оно НЕ из Диапазона, но находится в ячейке
Вот это не могу переварить: если находится в ячейке диапазона, то уже в диапазоне ))
Может какой простенький пример? :-)
 
Цитата
Юрий М написал: Может какой простенький пример? :-)
Так там-же в #19. Находиться не в ячейке Диапазона, а в ячейке, в которую Проверка вставляется. Т.е. на момент вставки ячейка НЕ пустая и вот это значение нужно добавить к Списку Проверки
Согласие есть продукт при полном непротивлении сторон
Страницы: 1 2 След.
Читают тему
Наверх