Форум программистов, компьютерный форум, киберфорум
VBA
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.89/18: Рейтинг темы: голосов - 18, средняя оценка - 4.89
saper

Обработка контролов на листе

26.01.2009, 13:01. Показов 3891. Ответов 13
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
На листе динамически создаются несколько разных контролов,
среди них ComboBox'ы, сколько их будет, я не знаю. Эти ComboBox'ы надо обработать в цикле. Подскажите пожалуйста, как это проще сделать.
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
26.01.2009, 13:01
Ответы с готовыми решениями:

Обработка информации на листе
Разработать макрос для выполнения операции, интерфейс организовать через форму, вызов форму сделать с рабочего листа через кнопку. Особа из...

Обработка события на листе
День добрый, коллеги, Какой в VBA обработчкик событий на листе/книге? 1. При активации листа? (что-нибудь типа Auto_open?) 2. При...

Обработка данных только на листе
Здравствуйте! есть такой вот макрос в модуле листа, спасибо art1289 который убирает при вводе пробелы, рубли и другой мусор и...

13
1 / 1 / 1
Регистрация: 29.12.2008
Сообщений: 108
26.01.2009, 21:45
Один только вопрос, а что с ними нужно делать???

Сергей
0
saper
26.01.2009, 22:45
Мне надо в цикле присвоить значения и имена combobox'ов массиву
saper
27.01.2009, 20:18
Вообще задача такая:
на одном листе пользователь формирует списки данных
в виде столбцов, количество списков и количество записей в списках
может меняться. Надо на другом листе динамически создать столько
ComboBox'ов, сколько столбцов, и присвоить им диапазон равный
количеству записей. Кстати, присвоить ComboBox'у диапазон программно,
у меня тоже не получается. Пожалуйста подскажите что-нибудь, а то может я на ложном пути?
1 / 1 / 1
Регистрация: 29.12.2008
Сообщений: 108
28.01.2009, 00:12
Вообще, если подходит, можно создать ComboBox (1 шт.) в котором будут отображаться заговки столбцов, а рядом ListBox (тоже 1 шт.), в котором, в зависимости от выбора заголовка столбца в ComboBox, будут отображаться данные содержимого этого столбца. По-моему это гораздо интереснее, чем создавать кучу всеких Controls'ов. К тому же для постоянного добавления новых Controls должен висеть класс с событием типа Worksheet_Change, чтобы отслеживать изменения и при надобности добавлять Control. Вроде бы сильно громоздко получается.

Сергей
0
0 / 0 / 0
Регистрация: 14.01.2009
Сообщений: 16
28.01.2009, 13:25
Добрый день!

Сделать это можно, например так:
Для проверки примеров создайте новую книгу с листами 'Лист1' и 'Лист2' и добавьте к ней модуль. В модуль допишите один (можно и оба) варианта кода. Второй вариант не совсем по условию вопроса но тоже может на что-нибудь сгодиться
Единственное ограничение: пользователь при вводе не должен пропускать ячейки, т.е. Значения должны следовать в столбце одно за другим без разрывов т.к. из столбца здесь отбирается количество строк равное количеству заполненных ячеек (ф-ция Count). Но это тема другого вопроса. Можно конечно и сканировать столбец и просто задать например 5000 значений в список и еще много чего. Можно лист2 создать и из кода ... Много чего можно !!! Во простор для экспериментов!!! .

===== ВАРИАНТ 1 ========
Создаются ComboBox-ы на Листе2 по количеству заполненных колонок на листе 1.
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
Sub CreateOLE()
    Dim tWS2 As Worksheet
    Dim tWS As Worksheet
    Dim tSh As OLEObject
    Dim n As Integer, m As Long
    
    Set tWS = ThisWorkbook.Worksheets('Лист1')
    Set tWS2 = ThisWorkbook.Worksheets('Лист2')
    
    tWS.Select
    'цикл по колонкам с которыми работал пользователь
    For n = 1 To tWS.Rows(1).SpecialCells(xlCellTypeLastCell).Column
        'количество значений в колонке
        m = Application.WorksheetFunction.Count(tWS.Columns(n))
        'создание объекта
        Set tSh = tWS2.OLEObjects.Add(ClassType:='Forms.ComboBox.1', _
                  Link:=False, DisplayAsIcon:=False, _
                  Left:=100, Top:=20 + n * 30, Width:=140, Height:=18)
         'и установка его свойств
         With tSh
            If m Then .ListFillRange = tWS.Name & '!' & _
                      tWS.Range(Cells(1, n), Cells(m, n)).Address
            .Name = 'ComboBox_Col' & n
            .Border.Color = vbYellow
            '.и т.д по желанию :)
        End With
    Next
    Set tSh = Nothing
    Set tWS = Nothing
    Set tWS2 = Nothing
End Sub
Считать значения из полученных ComboBox-сов можно например так:
Здесь я правда ограничил количество якобы заполненных колонок до 5
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
Sub ReadDataComboBox()
    Dim tWS2 As Worksheet
    Dim tSh As OLEObject
    Dim n, s
    Set tWS2 = ThisWorkbook.Worksheets('Лист2')
    For n = 1 To 5
        Set tSh = tWS2.OLEObjects(n)
        s = s + tSh.Name + ' = ' & tSh.Object & vbCr
    Next
    MsgBox s
    Set tSh = Nothing
    Set tWS2 = Nothing
End Sub
===== ВАРИАНТ 2 ========
Выбор из списка. По количеству заполненных колонок на листе 1, ячейкам на Листе2 присваиваются свойства списков.
Также создаются именованные диапазоны nar1-narX, где X- количество заполненных столбцов на листе 1
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
Sub CreateListCell()
    Dim tWS2 As Worksheet
    Dim tWS As Worksheet
    Dim n As Integer, m As Long, s As String
    
    Set tWS = ThisWorkbook.Worksheets('Лист1')
    Set tWS2 = ThisWorkbook.Worksheets('Лист2')
    
    'цикл по колонкам с которыми работал пользователь
    tWS.Activate
    For n = 1 To tWS.Rows(1).SpecialCells(xlCellTypeLastCell).Column
        'количество значений в колонке
        m = Application.WorksheetFunction.Count(tWS.Columns(n))
        'пишем название
        tWS2.Cells(n, 1) = 'Колонка ' & n
        If m Then
            ActiveWorkbook.Names.Add _
                Name:='nar' & n, _
                RefersToLocal:=tWS.Range(Cells(1, n), Cells(m, n))
            'создаем список
            With tWS2.Cells(n, 2)
0
saper
28.01.2009, 15:17
Большое спасибо всем за подробную информацию

Еще один вопрос - как присвоить объектной переменной ссылку на уже имеющийся на листе conrol.
И если можно, порекомендуйте литературу по VBA Excel
saper
28.01.2009, 15:24
А как можно определить, вносились изменения на лист или нет, может флаг какой есть?

За ранее спасибо.
1 / 1 / 1
Регистрация: 29.12.2008
Сообщений: 108
28.01.2009, 15:30
Как я и говорил, - нужно вешать событие Worksheet_Change, который будет отлавливать изменения и добавлять Controls, в зависимости, добавился ли новый столбец или нет.

Сергей
0
0 / 0 / 0
Регистрация: 14.01.2009
Сообщений: 16
28.01.2009, 17:38
* Еще один вопрос - как присвоить объектной переменной ссылку на уже * имеющийся на листе conrol.
* И если можно, порекомендуйте литературу по VBA Excel

Посмотрите еще раз на пример 1 функцию чтения данных из TextBox-сов.

Dim tWS as Worksheet
Dim tSh as OLEObject
Set tWS=ActiveWorkbook.Worksheets('ИмяЛиста' )
Set tSh = tWS2.OLEObjects(Индекс(integer) или имя(string)объекта)

С уважением, Андрей.
0
Comanche
30.01.2009, 11:51
Если тебе эти комбобоксы нужны ТОЛЬКО для того, чтобы в определённой ячейке можно было вводить данные ВЫБОРОМ ИЗ СПИСКА, который (список) есть просто некая область на этом (или другом) листе Эксель, 'отображаемая' в твой комбобокс, то может быть, стоит пойти более простым путём? Т.е. не создавать на листе контролы ComboBox динамически, а просто использовать Данные >> Проверка... >> Тип данных := 'Список' >> Источник := Область_На_Листе. Тогда при установке курсора на ячейку с такой 'Проверкой' в этой ячейке автоматом появится выпадающий список (аналог твоего комбобокса), в котором будут только те значения, что перечислены в 'Область_На_Листе'.

М.б., конечно, я тебя не понял, и у тебя всё сложнее.
saper
30.01.2009, 15:37
Возможно то же самое можно было бы сделать и с помощью списков, но я почему-то сразу пошел по пути комбобоксов, только вот запнулся на полпути.
А вообще программа уже готова и отлично работает, спасибо всем, особенно AndreySZ.
0 / 0 / 0
Регистрация: 14.01.2009
Сообщений: 16
30.01.2009, 23:33
Да лишь бы на пользу
Успехов! С уважением, Андрей.
0
0 / 0 / 0
Регистрация: 14.01.2009
Сообщений: 16
30.01.2009, 23:33
Да лишь бы на пользу
Успехов! С уважением, Андрей.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
30.01.2009, 23:33
Помогаю со студенческими работами здесь

Обработка большого количества объектов на листе
Здравствуйте, уважаемые форумчане. Помогите, пожалуйста советом. Исходные данные: На листе находится анкета с большим количество кнопок...

Обработка кода если на листе текст не был найден
Добрый день! В VBA новичок)))) Скажите мне как проверить результат? Есть код который на листе ищет заданное значение и...

Обработка события Change на листе - что я делаю не так?
Уважаемые форумчане, помогите, пожалуйста! Заклинило на вроде бы простой вещи (неважные детали опускаю). В таблицу на листе вводятся...

Обработка диапазона на раб. листе
Прямоугольный диапазон клеток заполнен словами ( в одной клетке может находится одно или несколько слов). Составить предложение из всех...

XAML. Выравнивание контролов в ToolBar и StatusBar. + ширина контролов в процентах
Выравнивание контролов в ToolBar и StatusBar с помощью Grid или без. + ширина контролов в процентах. Есть главный Grid, в нем лежат...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
14
Ответ Создать тему
Новые блоги и статьи
Очистка реквизитов документа при копировании
Maks 09.04.2026
Алгоритм из решения ниже применим как для типовых, так и для нетиповых документов на самых различных конфигурациях. Задача: при копировании документа очищать определенные реквизиты и табличную. . .
модель ЗдравоСохранения 8. Подготовка к разному выполнению заданий
anaschu 08.04.2026
https:/ / github. com/ shumilovas/ med2. git main ветка * содержимое блока дэлэй из старой модели теперь внутри зайца новой модели 8ATzM_2aurI
Блокировка документа от изменений, если он открыт у другого пользователя
Maks 08.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа, разработанного в конфигурации КА2. Задача: запретить редактирование документа, если он открыт у другого пользователя. / / . . .
Система безопасности+живучести для сервера-слоя интернета (сети). Двойная привязка.
Hrethgir 08.04.2026
Далее были размышления о системе безопасности. Сообщения с наклонным текстом - мои. А как нам будет можно проверить, что ссылка наша, а не подделана хулиганами, которая выбросит на другую ветку и. . .
Модель ЗдрввоСохранения 7: больше работников, больше ресурсов.
anaschu 08.04.2026
работников и заданий может быть сколько угодно, но настроено всё так, что используется пока что только 20% kYBz3eJf3jQ
Дальние перспективы сервера - слоя сети с космологическим дизайном интефейса карты и логики.
Hrethgir 07.04.2026
Дальнейшее ближайшее планирование вывело к размышлениям над дальними перспективами. И вот тут может быть даже будут нужны оценки специалистов, так как в дальних перспективах всё может очень сильно. . .
Горе от ума
kumehtar 07.04.2026
Эта мне ментальная установка, что вот прямо сейчас, мол, мне для полного счастья не хватает (нужное вписать), и когда я этого достигну - тогда и полный кайф. Одна из самых сильных ловушек на пути. . . .
Использование значений реквизитов справочника в документе, с определенными условиями и правами
Maks 07.04.2026
1. Контроль срока действия договора Алгоритм из решения ниже реализован на примере нетипового документа "ЗаявкаНаРаботу", разработанного в конфигурации КА2. Задача: уведомлять пользователя, если. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru