Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Microsoft Office и VBA программирование > Microsoft Office Excel
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 23.05.2011, 08:33   #1
Miguel Sanchez
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 33
По умолчанию Заполнение xlValidateList значениями массива

Уважаемые эксперты! Подскажите технологию заполнения списка проверки данных элементами массива или списком констант через VBA, по аналогии вставки списка значений через стандартный диалог "проверка данных" -> "список"
Пробую так:

Option Explicit
Dim list_monht As Variant
Dim nitem
Dim titem
Sub mylist_month()
list_monht = Array("январь", "февраль", "март") 'ну и т.д.
Workbooks(ThisWorkbook.Name).Active Sheet.UsedRange.Item(1).Select
With Selection.Validation
.Delete
.Add Type:=xlValidateList, AlertStyle:=xlValidAlertStop, Operator:= _
xlBetween, Formula1:= ******ЗДЕСЬ ЗАГВОЗДКА*****
.IgnoreBlank = True
.InCellDropdown = True
End With

Как переписать массив list_monht в ValidateList? Помогите!
Miguel Sanchez вне форума Ответить с цитированием
Старый 23.05.2011, 09:44   #2
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Попробуйте:
Код:
Sub mylist_month()
Dim list_month() As Variant
list_month = Array("январь", "февраль", "март", "апрель")    'ну и т.д.
With ThisWorkbook.ActiveSheet.UsedRange.Item(1).Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=Join(list_month, ",")
End With
End Sub

Последний раз редактировалось nilem; 23.05.2011 в 09:48.
nilem вне форума Ответить с цитированием
Старый 23.05.2011, 12:13   #3
Miguel Sanchez
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 33
По умолчанию

nilem! Угу, заработала! Спасибо премногое!
И еще вопросик, вдогонку - а можно ли возвращать индекс выбранного элемента в списке xlValidateList, подобно:

PHP код:
nitem ActiveSheet.Controls.ControlFormat.ListIndex
titem 
ActiveSheet.Controls.ControlFormat.List(nitem)
Cells(nm).Value Left(titem1
Miguel Sanchez вне форума Ответить с цитированием
Старый 23.05.2011, 13:21   #4
nilem
Форумчанин
 
Регистрация: 25.04.2010
Сообщений: 616
По умолчанию

Вот такое придумалось (в модуль листа, проверяем яч. А1):
Код:
Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) <> "A1" Then Exit Sub
If Intersect(Target, Cells.SpecialCells(-4174)) Is Nothing Then Exit Sub
Dim i&, list_month
list_month = Split(Target.Validation.Formula1, ";")
Application.EnableEvents = False
For i = 0 To UBound(list_month)
    If Target = list_month(i) Then Target.Next = i + 1: Exit For
Next
Application.EnableEvents = True
End Sub
nilem вне форума Ответить с цитированием
Старый 23.05.2011, 14:57   #5
Miguel Sanchez
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 33
По умолчанию

Интересный подход...
Не все понятно, правда, - при беглом просмотре. Щас скопирую и буду пробовать.
Спасибо за оперативную помощь!

PS
Как я понял, спец.пропертей у этого объекта нет - ну чтоб сразу по currently selected item ретурнуть index элемента.
Рылся в хелпе и ничего не нашел... может плохо рылся....
Miguel Sanchez вне форума Ответить с цитированием
Старый 23.05.2011, 15:10   #6
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

А так:
Код:
Option Explicit

Dim list_month() As Variant

Private Sub Worksheet_Change(ByVal Target As Range)
If Target.Address(0, 0) <> "A1" Then Exit Sub
Dim x As Integer
If Intersect(Target, Cells.SpecialCells(-4174)) Is Nothing Then Exit Sub
x = WorksheetFunction.Match(Target, list_month, 0)
MsgBox x
Application.EnableEvents = True
End Sub

Sub mylist_month()
list_month = Array("январь", "февраль", "март", "апрель")    'ну и т.д.
With ThisWorkbook.ActiveSheet.UsedRange.Item(1).Validation
    .Delete
    .Add Type:=xlValidateList, Formula1:=Join(list_month, ",")
End With
End Sub
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 25.05.2011, 07:30   #7
Miguel Sanchez
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 33
По умолчанию

Private Sub Worksheet_Change никак не реагирует на изменения.

Target.Address равен А1, SpecialCells(-4174) в той же ячейке, а почему-то ничего не происходит...

Причем, само событие Private Sub Worksheet_Change не перехватывается, т.к. для проверки поставил

Код:
Private Sub Worksheet_Change(ByVal Target As Range)
msgbox Target.Address
.........
Может у меня со средой VBA что-то не так, где-то что-то включить/выключить... галочки какие проставить в параметрах ексела или в references dll-ки какой нет???

Последний раз редактировалось Miguel Sanchez; 25.05.2011 в 07:50.
Miguel Sanchez вне форума Ответить с цитированием
Старый 25.05.2011, 09:13   #8
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Вполне может быть, что у Вас сбойнул код после
Application.EnableEvents = False
и соответственно
Application.EnableEvents = True
не прошло, поэтому и перестали обрабатываться события.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Старый 25.05.2011, 13:41   #9
Miguel Sanchez
Пользователь
 
Регистрация: 09.03.2011
Сообщений: 33
По умолчанию

Виноват, накосячил... - Private Sub Worksheet_Change вставил в общий модуль, а не в модуль листа!
Поправил и все заработало!
Спасибо всем!
Miguel Sanchez вне форума Ответить с цитированием
Старый 25.05.2011, 13:44   #10
Hugo121
Старожил
 
Регистрация: 11.05.2010
Сообщений: 5,170
По умолчанию

Я это название макроса никогда не вставляю и не набираю - вдруг какая ошибка, например а или о кириллицей
Они ведь есть в выпадающем списке в редакторе - никогда не ошибёшься.
webmoney: E265281470651 Z422237915069 R418926282008
Hugo121 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Заполнение массива Сеня2007 Помощь студентам 6 23.02.2011 20:39
создание массива real рандомно с 2-мя разными значениями после запятой dima-intro Помощь студентам 6 15.12.2010 20:15
Delphi. Перемещение всех элементов массива с четными значениями в конец массива2. deathz0r Помощь студентам 1 25.05.2010 15:04
Заполнение значениями из сводной Branch Microsoft Office Excel 0 12.02.2009 16:20
Заполнение столбца с уникальными значениями автоматически Mary_star SQL, базы данных 7 04.08.2008 17:43