Доброго времени суток уважаемые жители планеты! Заранее прошу прощения за создание темы ( её начало тут) немного условия поменялись, но проблема та же. Взываю к Вашей помощи ибо не знаю, что делать с текущей проблемой и как из неё выйти. Есть книга с двумя листами. На первом листе таблица (примерно 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
Да! Ваш пример только на случай замены цифр на букву. Но если пользователь изменил цифру на букву, а через время снова захотел поставить прежнюю цифру, то столкнется с ошибкой. Вот по этому, в примере я использовал другую формулу. Задача составить проверку, которая будет позволять наличие только букв из именованного диапазона или исходной цифры.
Ну добавьте в именованный список значение изначальное и все...
С радостью, но я их сам не знаю. Их рассчитывает макрос. Да и если представить, что в именованом диапазоне будут допустим еще и 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
С помощью макроса составляется таблица и заносятся начальные данные. Следующий ход макроса - установить проверку эти ячейки. Условием для устанавки проверки является: если в ячейке текст -значит, при редактировании этой ячейки, допускаются только буквенные значения из именованного диапазона (на листе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 * кол-во Пунктов.
Согласие есть продукт при полном непротивлении сторон
...да и если представить, что в именованном диапазоне будут допустим еще и 5,6,8,9... То, что в этом случае будет мешать пользователю изменить изначальную 9 на 5?!
И с кавычками у меня не получается. Эксель все равно интерпретирует число с запятой, как два разных. ((( Видимо реально проблема получается?!
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
Вообще, конечно странно... Но видимо приходится констатировать тот факт, что любое (даже текстовое значение) которое записано через запятую в ячейке, с помощью ВБА не возможно добавить в стандартную проверку. Просто потому, что эксель, в этом случае, не воспринимает запятую как десятичный разделитель, а упорно думает, что это перечисление последовательных (или не последовательных) пунктов. Но тут появляется вопрос: почему когда в проверку добавляешь значение через запятую, то всё нормально?
Ronin751 написал: с помощью ВБА не возможно добавить в стандартную проверку. Просто потому, что эксель, в этом случае, не воспринимает запятую как десятичный разделитель, а упорно думает, что это перечисление последовательных
мне кажется не xl, а vba
Цитата
Ronin751 написал: Но тут появляется вопрос: почему когда в проверку добавляешь значение через запятую, то всё нормально?
а тут не vba, а xl (думаю в вашем вопросе и есть этот ответ)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
чтобы не гадать на кофейной гуще, кто вам отвечает и после этого не совершать кучу ошибок - обратитесь к собеседнику на ВЫ - ответ на ваш вопрос получите - а остальное вас не касается (п.п.п. на форумах)
Поскольку при попытке создать проверку макросом эксель не воспринимает запятую как десятичный разделитель, решил пойти нахрапом: сменил десятичный разделитель с запятой на точку (меню пуск - панель управления - пункт "Языки и региональные стандарты"). Но эффект тот же (даже если формат ячейки перевести в текстовый). Получается, что с помощью ВБА вообще не возможно передать в проверку значение с любым разделителем?! И это очень прискорбно.
Если я правильно понимаю, то в этом случае придется добавлять новые значения (с разделителями) в именованный динамический диапазон и в итоге все эти значения будут доступны для каждой ячейки. Но этот вариант не подходит, так как необходимо чтоб список проверки был наполнен значениями (буквенными) из именованного списка и значением самой ячейки ( к примеру "3,5"). Или можно как то это менять?
Юрий М, я тоже не сразу воткнулся. Тут не все так просто. Диапазон не просто динамический. Проблема в том, что в Диапазон необходимо добавлять значение, если оно НЕ из Диапазона, но находится в ячейке на момент добавления в нее Проверки данных. А таким значением может быть число с десятичной запятой, которая Списком Проверки данных расценивается как разделитель списка. Теоретически таких РАЗНЫХ Списков может быть 31 (кол-во столбцов) * кол-во строк в таблице. Хотелось это обойти (назначение КАЖДОЙ ячейке СВОЕГО Списка (см. код в #19), но из-за запятой не выходит. С целыми числами проблем нет. Как-то так
Согласие есть продукт при полном непротивлении сторон
Юрий М написал: Может какой простенький пример? :-)
Так там-же в #19. Находиться не в ячейке Диапазона, а в ячейке, в которую Проверка вставляется. Т.е. на момент вставки ячейка НЕ пустая и вот это значение нужно добавить к Списку Проверки
Согласие есть продукт при полном непротивлении сторон