Страницы: 1
RSS
Программно созданная проверка условий не хочет работать...
 
Потребовалось программно создавать в активной ячейке листа список проверки условий.  
НаписАл в стандартном модуле процедуру:  
 
Sub SetValidation()  
  With ActiveCell.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  
 
Запускаю. Получаю в ячейке одно единственное условие "мама;мыла;раму" вместо списка из трёх условий "мама", "мыла", "раму"  
Вхожу в меню Данные-Проверка...  
Вижу там правильно установленные значения проверки условий...    
В списке значений под надписью "Источник:" записано именно то, что я и хотел: мама;мыла;раму (именно так - без кавычек и пробелов, т.е. как и надо)  
Кликаю мышкой в этот список. Закрываю окно проверки — ЧУДО! Список проверки выводится правильно - три пункта.  
Такое впечатление, что после программного создания списка проверки его ещё надо как-то обновить аналогично тому, как иногда приходится даблкликать в ячейки чтобы применились форматы.  
 
Кто-нибудь сталкивался с таким или это глюк моего Ёкселя (2003)?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Formula1:="мама,мыла,раму"
 
???  
и в самом деле работает... СПАСИБО  
Ничего не понимаю! А как задать пункт списка с запятой? (просто мама мылы раму - это жутко упрощенная часть моей общей задачи)
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Вообще-то и с перечислением пунктов через точку с запятой у меня тоже возникли бы проблемы, т.к. планируемый список проверки - это список названий листов книги, а в именах допустимы и запятые и точки с запятой...  
Может, туда можно как-то массив подсунуть? Или коллекцию?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Dim Список As String  
Список = ""  
With Sheets("Лист1")  
For i = 1 To 7  
Список = Список & "," & .Cells(i, 1)  
Next i  
End With  
 
With ActiveCell.Validation  
..., Formula1:=Список  
......
 
да я уже попробовал и в одно из имён листов ввёл запятую.  
Ну и получил вместо пункта с названием листа - два пункта по части названия...  
Вот мой макрос:  
Sub SheetsValidation()  
  With ActiveCell.Validation  
     .Delete  
     .Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:=xlBetween, _  
          Formula1:=ListWbkNames  
     .IgnoreBlank = True  
     .InCellDropdown = True  
     .InputTitle = ""  
     .ErrorTitle = ""  
     .InputMessage = ""  
     .ErrorMessage = ""  
     .ShowInput = True  
     .ShowError = True  
  End With  
End Sub  
Function ListWbkNames()  
  Dim sStr$, wSht As Worksheet  
  With CreateObject("Scripting.Dictionary")  
     For Each wSht In ThisWorkbook.Worksheets  
        .Item(wSht.Name) = 0  
     Next  
     ListWbkNames = Join(.Keys, ",")  
  End With  
End Function
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
{quote}{login=Alex_ST}{date=14.03.2011 10:01}{thema=}{post}...... 1. а в именах допустимы и запятые и точки с запятой...  
2. Может, туда можно как-то массив подсунуть? Или коллекцию?{/post}{/quote}  
1. а вот раньше это было недопустимо! и это было хорошо;  
2. думаю там только string хорошо переваривается, но не пробовал.
 
здесь For Each wSht In ThisWorkbook.Worksheets и заменить в именах "," на "_"???
 
К сожалению, файл, для которого меня попросили слепить макрос не мой, а ведётся несколькими людьми из разных подразделений в режиме общего доступа уже несколько лет.  
И я не думаю, что эти люди будут рады если я вдруг возьмусь переименовывать листы в книге.    
Хотя имён с запятыми там (пока!) нет. Только что проверил. Поэтому вариант с перечислением через запятую прокатит.  
 
Но вопрос на будущее. Чисто для опыта: как программно можно создать проверку данных с произвольным текстом в пунктах?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
поместить на лист? и ссылкой..
Живи и дай жить..
 
{quote}{login=слэн}{date=14.03.2011 10:58}{thema=}{post}поместить на лист? и ссылкой..{/post}{/quote}  
Это, конечно, можно...  
И наверняка будет работать, и лист можно будет хитро-хитро обозвать и сделать VeryHiden...  
Но как-то это грубо, не элегантно... :-)  
Может, попробую на досуге программно создавать в ячейке листа комбобокс размером в ячейку со списком... А при деактивации ячейки его убивать.  
Хотя, наверное, сложновато получится: клик в ячейку - создать поверх ячейки комбобокс - заполнить ему список. Скорее всего овчинка выделки не стоит.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Алекс, не это нужно?  
Sub Alex_St_Validation()  
Dim Stroka As String  
Stroka = "мама, мыла, раму"  
   With Cells(1, 1)  
       .Validation.Delete  
       .Validation.Add Type:=xlValidateList, Formula1:=(Stroka)  
   End With  
End Sub
 
А вот для имён листов:  
Sub Alex_St_Validation2()  
Dim i As Long, Arr()  
   ReDim Arr(1 To Sheets.Count)  
   For i = 1 To Sheets.Count  
       Arr(i) = Sheets(i).Name  
   Next  
   With Cells(2, 1)  
       .Validation.Delete  
       .Validation.Add Type:=xlValidateList, Formula1:=Join(Arr, ",")  
   End With  
End Sub
 
Нет, не получается...  
Formula1:= воспринимает запятую как сепаратор значений.  
Поэтому если одно из значений содержит запятую, то оно разбивается на 2 значения...  
Дело даже не в листах книги.  
Попробуйте программно создать список валидации из трёх значений:  
папа, матерясь,  
мыл  
раму
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Т.е. здесь нужно применять какое-то иносказание (ну, типа как в MsgBox чтобы вывести кавычки нужно писать либо & Chr(34) &  либо просто в тексте поставить тройные кавычки) чтобы запятая не воспринималась как сепаратор.
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
попробовал по аналогии с MsgBox заменить запятую на  & Chr(44) & - ни чего не вышло: запятую опознали и по ней разделили пункт
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Согласен. Если в именах листов исключить запятые, то всё отработает корректно.
 
запятую писать как наши деды в телеграммах стилем "ЗПТ":)  
Остался нерешённый вопрос об ограничении суммарного количества символов отображаемых элементов списка в Validation -255, причём включая неотображаемые запятые.
 
Alex не парьтесь с этими строками. Из-за ограничения в 255 символов. Я обычно использую именованный диапазон на скрытом листе:  
Formula1:="="Имя_диапазона".    
Удобно тем, что список можно дописывать ручками и автоматом (программно) обновлять именованный диапазон. Очень удобно и без заморочек.  
 
Владимир.
 
Володя, привет.  
Я уже писАл, что использование скрытого листа с именованным диапазоном на нём решит все проблемы с формированием списка валидации.  
Просто это решение очень уж не элегантное: для выполнения такой вроде бы не сложной операции как заполнение списка валидации применять такой могучий объект как лист Ёкселя...  
Ну, как вместо обычного MsgBox с кнопками Yes и No использовать с Userform Label и CommandButton'ами...  
 
Хотя, скорее всего вся эта лажа происходит из-за недоработки программного модуля Ёкселя, отвечающего за проверку условий. И его "хромоногость" побороть можно только такими "костылями".
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
К стати, на то, что это баг намекает ещё и тот факт, что руками список вводится через точку с запятой, а программный ввод с таким разделителем не понимается "без пинка".  
А если программно вводить список с разделителем "запятая", то мало того, что список работает, так ещё и в нём введённые программно тапятые оказываются заменены на точку с запятой...  
 
Может, это конечно и глюки локализации... Может кто-нибудь с родной английской локалью сможет проверить?  
P.S.  я точно знаю, что английская локаль у Hugo... Игорь, может попробуешь?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
Страницы: 1
Читают тему
Наверх