Excel это не сложно
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
24.04.2024, 07:33:39

Войти
Добавляйтесь в нашу группу ВКонтакте - будьте в курсе всех новых событий сайта, узнавайте первым обо всех акциях и новых статьях!
33 242 Сообщений в 5 457 Тем от 6 758 Пользователей
Последний пользователь: Сергей2662
*
Перейти на сайт Хитрости Надстройка MulTEx Обучающие тренинги Наша группа ВКонтакте
Правила форума Начало Помощь Поиск Календарь Войти Регистрация Выйти
+  Excel это не сложно
|-+  Основные форумы
| |-+  Вопросы по Excel и VBA
| | |-+  Как сделать коллекции из Текстбоксов?
Страниц: [1]   Вниз
Печать
Автор Тема: Как сделать коллекции из Текстбоксов?  (Прочитано 10986 раз)
0 Пользователей и 1 Гость смотрят эту тему.
vadimn
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 22


Просмотр профиля E-mail
« : 09.08.2011, 15:11:40 »

Правда, тема касается Wordа, но, может быть, заинтересует многих. Захотелось мне сделать так, чтобы в Ворде были такие коллекции Текстбоксов, что любое изменение значения одного из элементов автоматически влекло бы соответствующее изменение других элементов, сколько бы их не было в документе. Например, присвоив значение TextBox2 "12 августа 2011 г.", автоматически изменились бы значения TexBox1?, TextBox3, TextBox4 и т.д. на это же значение. В этом же документе могут соседствовать TextBox-ы с другими именами, которые соответственно вели бы себя также, но реагируя на изменения только своего шаблона (Имя1, Имя2, Имя3...).
Все, что я смог сделать:

Option Explicit
Dim strDate As String

Private Sub TextBox1_LostFocus()
strDate = TextBox1.Value
TextBox2 = strDate
TextBox3 = strDate
TextBox4 = strDate
End Sub

Private Sub TextBox2_LostFocus()
strDate = TextBox2.Value
TextBox1 = strDate
TextBox3 = strDate
TextBox4 = strDate
End Sub

Private Sub TextBox3_LostFocus()
strDate = TextBox3.Value
TextBox1 = strDate
TextBox2 = strDate
TextBox4 = strDate
End Sub

Private Sub TextBox4_LostFocus()
strDate = TextBox4.Value
TextBox1 = strDate
TextBox2 = strDate
TextBox3 = strDate
End Sub

Но это как-то громоздко. И при добавлении нового текстбокса приходится вносить изменения во все процедуры.
Записан
Юрий М
Глобальный модератор
Ветеран
*****

Репутация: +112/-0
Офлайн Офлайн

Сообщений: 2 077



Просмотр профиля E-mail
« Ответ #1 : 09.08.2011, 15:27:30 »

В Вашей ситуации поможет использование так называемых классов.
Записан
Дмитрий Щербаков(The_Prist)
Администратор
Ветеран
*****

Репутация: +485/-0
Офлайн Офлайн

Сообщений: 5 831



Просмотр профиля WWW
« Ответ #2 : 09.08.2011, 15:55:36 »

Код:
Private Sub TextBox1_LostFocus()
Dim sObjName as string, li as long,lNon as long
sObjName = "TextBox"
lNon = 1
strDate = TextBox1.Value
For li = 1 to 4
if li <> lNon then
Userform1.Controls(sObjName & li) = strDate
end if
Next li
End Sub
Хотя классы все же предпочтительнее, ввиду того, что при грамотном построении и написании кода вносить изменения потом в код не придется вообще.
Записан

Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
Пункты приёма Спасибов:    -41001332272872  -R298726502453
vadimn
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 22


Просмотр профиля E-mail
« Ответ #3 : 13.09.2011, 10:34:46 »

Спасибо, Prist!
Это было бы идеально, если вместо строчки:
Userform1.Controls(sObjName & li) = strDate
была бы такая строка:
ThisDocument.Controls(sObjName & li) = strDate
поскольку Текстбоксы мне нужны не на форме (Userform1), а в документе (ThisDocument). Но, к сожалению, VBA меня не понимает -:(
Записан
Юрий М
Глобальный модератор
Ветеран
*****

Репутация: +112/-0
Офлайн Офлайн

Сообщений: 2 077



Просмотр профиля E-mail
« Ответ #4 : 13.09.2011, 11:22:52 »

Так Вам на соответствующий Форум - по Word.
Записан
vadimn
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 22


Просмотр профиля E-mail
« Ответ #5 : 13.09.2011, 22:08:17 »

Я понимаю, что немного не в теме, но всё-таки...
Записан
doober
Глобальный модератор
Ветеран
*****

Репутация: +67/-0
Офлайн Офлайн

Сообщений: 634


Просмотр профиля E-mail
« Ответ #6 : 14.09.2011, 15:35:09 »

не нашел варианта как добавить текстбоксы перебором.
Записан
vadimn
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 22


Просмотр профиля E-mail
« Ответ #7 : 14.09.2011, 17:37:17 »

doober. Интересный вариант. Работает до тех пор, пока не добавишь TextBox5. После этого всё умирает и даже удаление этого TextBox5 не помогает восстановить работоспособность макроса...
Записан
doober
Глобальный модератор
Ветеран
*****

Репутация: +67/-0
Офлайн Офлайн

Сообщений: 634


Просмотр профиля E-mail
« Ответ #8 : 14.09.2011, 18:10:49 »

Я же писал.не могу перебрать контролы в Ворде
Только в код добавлять
Private Sub Document_Open()
ReStart
End Sub

 Sub  ReStart()
Dim evnt As ClassText
    Dim obj As Object
 
        Set evnt = New ClassText
        Set evnt.TextGroup = ThisDocument.TextBox1
        coln.Add evnt
        Set evnt = Nothing
           Set evnt = New ClassText
        Set evnt.TextGroup = ThisDocument.TextBox2
        coln.Add evnt
        Set evnt = Nothing
       
           Set evnt = New ClassText
        Set evnt.TextGroup = ThisDocument.TextBox3
        coln.Add evnt
        Set evnt = Nothing
 
     Set evnt = New ClassText
        Set evnt.TextGroup = ThisDocument.TextBox4
        coln.Add evnt
        Set evnt = Nothing
End Sub
Записан
vadimn
Новичок
*

Репутация: +0/-0
Офлайн Офлайн

Сообщений: 22


Просмотр профиля E-mail
« Ответ #9 : 14.09.2011, 20:10:41 »

Красиво!
Я, правда, ещё новичок в VBA и программировании в целом, мало что понимаю, но, думаю, что смогу на основе этого кода двигаться в нужном направлении.
Спасибо, doober!
Записан
Страниц: [1]   Вверх
Печать
Перейти в:  

Powered by MySQL Powered by PHP Powered by SMF 1.1.21 | SMF © 2006-2011, Simple Machines Valid XHTML 1.0! Valid CSS!
Яндекс.Метрика Рейтинг@Mail.ru