Консультация № 176911
25.02.2010, 17:07
35.77 руб.
0 33 1
Уважаемые эксперты подскажите в следующем:
какие имеются строки кода при программировании при помощи ВБА списка ComboBox и поля со списком ListBox. Меня интересует информация об этих объектах, которые добавляются из меню и из панели Toolbar. То есть, как добавить в них запись как её удалить, как её просматривать, как её переместить и т. д.
Подскажите примеры. Спасибо Эндрю

Обсуждение

Неизвестный
26.02.2010, 16:49
общий
Andrew Kovalchuk:
Я попробовал Ваш код получил в каждом макросе ошибку 424, скажите почему??
Эндрю
Неизвестный
26.02.2010, 16:54
общий
F®ost:
Меня интересует информация об этих объектах, которые добавляются из меню и из панели Toolbar. И вот например добавил эти объекты из меню в Ворде сохранил документ. Что далее окрыл снова документ как пользоваться???
Например список жмёшь на него ему без разницы ни добавить ничего не сделать
Поле со списком – ComboBox имеет справа от себя треугольник он вниз поле не раскрывает, что добавляешь вводится и смещается влево. Как этим пользоваться???
Неизвестный
26.02.2010, 16:58
общий
F®ost:
Подскажите также что такое
SelLength
Для чего служит
Спасибо Эндрю
Неизвестный
26.02.2010, 20:51
общий
Ципихович Эндрю:
Цитата: 238244
Я попробовал Ваш код получил в каждом макросе ошибку 424, скажите почему??

Макросы не нашли требуемые объекты. Перед запуском макросов следует произвести "подготовительные" действия.
Из панели элементов управления перетащите в документ элементы ComboBox и ListBox. Оставьте имена по умолчанию (ComboBox1 и ListBox1). А уж после этого запустите макросы.

Неизвестный
27.02.2010, 17:11
общий
Andrew Kovalchuk:
"подготовительные" действия перед запуском макросов я производил и вчера и сегодня, всё та же ошибка 424
Также подскажите:
Меня интересует информация об этих объектах, которые добавляются из меню и из панели Toolbar. И вот например добавил эти объекты из меню в Ворде сохранил документ. Что далее окрыл снова документ как пользоваться???
Например список жмёшь на него ему без разницы ни добавить ничего не сделать
Поле со списком – ComboBox имеет справа от себя треугольник он вниз поле не раскрывает, что добавляешь вводится и смещается влево. Как этим пользоваться???
Спасибо Эндрю
Неизвестный
27.02.2010, 19:09
общий
Ципихович Эндрю:
Для определенности можете скачать тренировочный документ - URL >> пример макросов по вопросу 176911
Я вижу смысл использовать предлагаемые объекты в случаях шаблонных заполнений. К примеру ваш документ это форма. Пользователь открывая документ будет получать возможность заполнить шаблон требуемым образом (например, выбором из предлагаемых вариантов) и пересылки итогового документа адресату или его печати. Значения для полей в форме могут заполняться на событии открытия документа вашим макросом.
Поле ComboBox начинает смещать текст влево, когда вводимое значение не помещается в поле (можно увеличить длину поля или запретить ввод значения - оставив лишь возможность выбора из предлагаемых вариантов - для этого установите свойтво Style в значение 2).
давно
Управляющий
143894
2148
01.03.2010, 10:32
общий
Ципихович Эндрю:
Почитайте VBA Создание меню и Работа с панелями инструментов и меню.
SelLength - возвращает или устанавливает число выделенных символов.
Об авторе:
Устав – есть устав! Если ты устав – то отдыхай!


Неизвестный
01.03.2010, 14:32
общий
Andrew Kovalchuk:
Осмотрел Ваш пример, большое спасибо
Я понял, в чём было дело мне надо было лищь добавить словосочетание ActiveDocument в строку ActiveDocument.ComboBox1.AddItem "Element " & str$(i)
И всё бы у меня пошло и ранее
Подскажите то есть я правильно понял, что в эти элементы вручную ничего нельзя добавить, убрать и т. д.
И как поставить условие, того что в элементах выбрано в настоящее время??
Неизвестный
01.03.2010, 16:46
общий
Ципихович Эндрю:
Цитата: 238244
Подскажите то есть я правильно понял, что в эти элементы вручную ничего нельзя добавить, убрать и т. д.
И как поставить условие, того что в элементах выбрано в настоящее время??

ComboBox:
Когда свойство Style = 0 (fmStyleDropDownCombo) - пользователь может вводить собственное значение (а не только выбирать из списка). Узнать что находится в поле ввода можно из свойства Text (или Value) объекта. Специальным образом обработав нажатие клавиш (например, отследив нажатие клавиши Enter) можно (с помощью макроса) добавить введенный текст в список значений.
Условия для выяснения установленного значения могут выглядеть так
Код:
(по индексу)
If ComboBox1.ListIndex <> -1 Then
...
End If

(по значению)
If ComboBox1.Text = "Some text" Then
...
End If


ListBox:
Добавить элементы можно только программно.
Для выяснения выделенного элемента в ListBox необходимо организовать в цикле просмотр всех элементов и проверить у них значение свойства Selected
Получится что-то такое:
Код:
For i=1 to ListBox1.ListCount-1
If ListBox1.Selected(i) = True Then
...
End If
Next

Неизвестный
02.03.2010, 18:11
общий
Andrew Kovalchuk:
Спасибо за Ваш ответ
Что то не пойму в строках Лист бокса как искать нужную строку, один раз получалось ввёл первую букву, далее само перемещалось содержимое Лист бокса, а более так не получается
Свойство MatchEntry определяет будет ли при вводе пользователем первых символов значения выбраться подходящая позиция из списка
Но у него есть значения, подскажите их значения
0 MatchEntryFirstLetter ??
1 MatchEntryComplete ??
2 MatchEntryNone ??
Подскажите, какое свойство Лист бокса отвечает, чтобы строки были в нём согласно алфавита, можно ли ещё как то их сортировать по своему усмотрению??
Неизвестный
02.03.2010, 22:12
общий
Цитата: 238244
Свойство MatchEntry определяет будет ли при вводе пользователем первых символов значения выбраться подходящая позиция из списка
Но у него есть значения, подскажите их значения
0 MatchEntryFirstLetter ??
1 MatchEntryComplete ??
2 MatchEntryNone ??
MatchEntry определяет стиль поведения при вводе пользователем значения
Одна из трех на выбор, а не все сразу.
ComboBox1.MatchEntry = fmMatchEntryFirstLetter совпадение по первой букве(можно вносить только соответствующие знаки)
ComboBox1.MatchEntry = fmMatchEntryNone без совпадения(можно печатать любые знаки)
ComboBox1.MatchEntry = fmMatchEntryComplete совпадение по полной строке(долны совпасть все знаки в строке)
Обратите внимание на то, что MatchRequired должно быть установлено в состояние True

Цитата: 238244
Подскажите, какое свойство Лист бокса отвечает, чтобы строки были в нём согласно алфавита, можно ли ещё как то их сортировать по своему усмотрению??
Насколько я помню этот объект не имеет свойства, отвечающего за сортировку элементов списка. Все придется делать руками (зато в качестве критерия сортировки можно выбрать что Бог на душу положит )
Неизвестный
03.03.2010, 12:23
общий
Andrew Kovalchuk:
Спасибо за Ваш ответ
Что то не пойму в строках Лист бокса как искать нужную строку, один раз получалось ввёл первую букву, далее само перемещалось содержимое Лист бокса, а более так не получается
Спасибо
Неизвестный
03.03.2010, 16:40
общий
Ципихович Эндрю:
Цитата: 238244
Что то не пойму в строках Лист бокса как искать нужную строку, один раз получалось ввёл первую букву, далее само перемещалось содержимое Лист бокса, а более так не получается
Видимо, было изменено значение свойства MatchEntry (значения те же что и для комбобокса - см. предыдущий ответ)
Неизвестный
05.03.2010, 16:43
общий
Andrew Kovalchuk:
Из всего Вами сказанного чтобы при открытии любого документа Ворд строки загружались в ComboBox я в макросы
'AutoNew работает при создании любого нового документа Ворд
и
'AutoOpen работает при открытии существующего документа Ворд
Пишу код

If ActiveDocument.InlineShapes.Count >= 1 Then 'условие, если Количество_кнопок_в_документе >= 1, тогда ...
If ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Name = "ComboBox1" Then 'условие, если имя 1 кнопки ="ComboBox1", тогда ... НА ЭТОЙ СТРОКЕ КОДА ПОЛУЧАЮ ОШИБКУ № 91 ПОЧЕМУ???

ActiveDocument.ComboBox.AddItem "ЯЯ"

End If
End If
Неизвестный
06.03.2010, 17:25
общий
Ципихович Эндрю:
Цитата: 238244
If ActiveDocument.InlineShapes.Count >= 1 Then 'условие, если Количество_кнопок_в_документе >= 1, тогда ...
If ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Name = "ComboBox1" Then 'условие, если имя 1 кнопки ="ComboBox1", тогда ... НА ЭТОЙ СТРОКЕ КОДА ПОЛУЧАЮ ОШИБКУ № 91 ПОЧЕМУ???
ActiveDocument.ComboBox.AddItem "ЯЯ"
End If
End If
Я не вижу указанной вами ошибки №91 во время проверки условия.
Строку ActiveDocument.ComboBox.AddItem "ЯЯ" следует заменить на ActiveDocument.ComboBox1.AddItem "ЯЯ" во избежание ошибки 438 (объект не найден).
Для большей ясности посмотрите URL >> тестовый файлик к 176911
Неизвестный
06.03.2010, 18:55
общий
Andrew Kovalchuk:
Извините Вы немножко не правильно поняли проблему я тоже не получил ошибку № 91, если бы не эксперементировал с разными документами
Написал код всё было в порядке, с одним документом, с вторым документом прогнал код, всё было хорошо, а на третьем осёкся
То есть как я понимаю в этом документе что такое есть, Винрар у меня будет завтра, смогу выложить документ
Но чтобы не ждать до завтра стал колдовать над этим документом сегодня, получил:
Количество = ActiveDocument.InlineShapes.Count 'получил Количество = 2
ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Select 'пытаюсь выделить 1 кнопку в документе и вот уже здесь получаю ошибку № 91, то есть что то в этом документе есть этакое, загадочное, не подскажите что это может быть???
Если что не поймёте чудо документ выложу завтра

Неизвестный
07.03.2010, 11:59
общий
Andrew Kovalchuk:
"Чудо" файл я загрузил, ссылка на него: https://rfpro.ru/upload/1772
Вопрос по нему всё тот же:
Количество = ActiveDocument.InlineShapes.Count 'получил Количество = 2
ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Select 'пытаюсь выделить 1 кнопку в документе и вот уже здесь получаю ошибку № 91, то есть что то в этом документе есть этакое, загадочное, не подскажите что это может быть???
Неизвестный
07.03.2010, 12:09
общий
Andrew Kovalchuk:
Забыл указать код для скачивания файла: https://rfpro.ru/upload/1772, он равен "00"
Неизвестный
07.03.2010, 18:57
общий
Ципихович Эндрю:
Цитата: 238244
"Чудо" файл я загрузил, ссылка на него: https://rfpro.ru/upload/1772
Вопрос по нему всё тот же:
Количество = ActiveDocument.InlineShapes.Count
В представленном документе - 00 к служебному.doc - последовательности ActiveDocument.InlineShapes.Count не обнаружено (ни в теле документа, ни в исходниках макросов).
Неизвестный
07.03.2010, 19:25
общий
Andrew Kovalchuk:
ТО есть Вы хотите сказать что при открытом файле 00 к служебному.doc
Если вручную прогонять код, то на строке
Количество = ActiveDocument.InlineShapes.Count 'Вы не получаете Количество = 2 ?????
А затем на следующей строке
ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Select 'Вы не получаете ошибку № 91 ?????
Неизвестный
07.03.2010, 21:21
общий
Ципихович Эндрю:
Цитата: 238244
ТО есть Вы хотите сказать что при открытом файле 00 к служебному.doc
Если вручную прогонять код, то на строке
Количество = ActiveDocument.InlineShapes.Count 'Вы не получаете Количество = 2 ?????
А затем на следующей строке
ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Select 'Вы не получаете ошибку № 91 ?????
Я хочу сказать что НЕ ВИЖУ кода, который нам хотелось бы протестировать
Неизвестный
08.03.2010, 09:36
общий
Andrew Kovalchuk:
Открываете документ 00 к служебному.doc
Открываете любой свой макрос или Альт Эф 11
Скопируйте и вставьте в него две строчки кода
Количество = ActiveDocument.InlineShapes.Count
ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Select
Проходите его вручную нажимая Эф 8
'на первой строке Вы получаете Количество = 2 ?????
'на второрй строке Вы получаете ошибку № 91 ?????
Если получаете ошибку, то тогда почему она образовывается???
Неизвестный
09.03.2010, 10:28
общий
Andrew Kovalchuk:
Ещё обнаружил непонятное для себя, подскажите:
Для того чтобы в КомбоБокс при открытии документа загружались строки в макросы
'AutoNew работает при создании любого нового документа Ворд
'AutoOpen работает при открытии существующего документа Ворд
я пишу код:
If ActiveDocument.InlineShapes.Count >= 1
If ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Name = "ComboBox1А" Then
ActiveDocument.ComboBox1А.AddItem "Строка"
Но при открытии документа строки в КомбоБокс попадают, потом сохраняю документ, открываю снова и более в него эти строки не попадают.

Спасибо Эндрю
Неизвестный
09.03.2010, 16:24
общий
Ципихович Эндрю:
Цитата: 238244
Скопируйте и вставьте в него две строчки кода
Количество = ActiveDocument.InlineShapes.Count
ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Select
Проходите его вручную нажимая Эф 8
Я почему-то ожидал готового кода в модуле
Цитата: 238244
'на первой строке Вы получаете Количество = 2 ?????
Получаю.
Цитата: 238244
'на второрй строке Вы получаете ошибку № 91 ?????
Если получаете ошибку, то тогда почему она образовывается???
Получаю. Причина ошибки том, что ActiveDocument.InlineShapes.Item(1).OLEFormat = Nothing, следовательно попытки взять у него значения свойств или выполнить по отношению к нему какие-то методы некорректны. Вот такая модификация ActiveDocument.InlineShapes.Item(1).Select выделяет картинку с двуглавым орлом.
Неизвестный
09.03.2010, 17:16
общий
Andrew Kovalchuk:
Из Вами сказанного чтобы не получить ошибку № 91 надо вместо
ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Select
написать
ActiveDocument.InlineShapes.Item(1).Select

А тогда чтобы не получить ошибку № 91 надо вместо этого

If ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Name = "ComboBox1" Then
...
End If
Что написать???

Неизвестный
09.03.2010, 21:40
общий
Цитата: 238244
А тогда чтобы не получить ошибку № 91 надо вместо этого
If ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Name = "ComboBox1" Then
...
End If
Что написать???
Подозреваю в вашем случае можно обойтись вот таким куском кода
Код:
If Not (ActiveDocument.InlineShapes.Item(1).OLEFormat Is Nothing) Then
If ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Name = "ComboBox1" Then
MsgBox "Found " & ActiveDocument.InlineShapes.Item(1).OLEFormat.Object.Name
' Здесь напишите нужный вам код
End If
End If
Неизвестный
12.04.2010, 19:39
общий
Andrew Kovalchuk:
Подскажите мне требуется очистить содержимое комбобокса, но не следующим образом:
ActiveDocument.ComboBox1.Clear
Предложенное Вами решение я помещу в код АутоКлозе
Сделать это нужно для того чтобы когда пользователь открывал документ и тут же его закрыл, чтобы ему не предлагали изменить сохранения, так как он может придти в замешательство, ведь он ничего не делал.
Спасибо Эндрю
Неизвестный
12.04.2010, 21:35
общий
Ципихович Эндрю:
Цитата: 238244
Подскажите мне требуется очистить содержимое комбобокса, но не следующим образом:
ActiveDocument.ComboBox1.Clear
Предложенное Вами решение я помещу в код АутоКлозе
Сделать это нужно для того чтобы когда пользователь открывал документ и тут же его закрыл, чтобы ему не предлагали изменить сохранения, так как он может придти в замешательство, ведь он ничего не делал.
Мне неизвестны альтернативные способы очистки всего содержимого комбобокса. На мой взгляд любое решение (например, поэлементное удаление в цикле) все равно будет сигнализировать об изменениях внесенных в документ. Но раз вы хотите сделать все в автоклозе, то вам может помочь вариант подавления диалогового окна о необходимости сохранения документа. Этого можно добиться такой строкой - Application.Quit SaveChanges = False
Неизвестный
13.04.2010, 17:13
общий
Andrew Kovalchuk:
Спасибо ранее Вы давали ссылки на
Почитайте VBA Создание меню и Работа с панелями инструментов и меню
Сейчас есть вопрос № 177826 на эту тему, не поможете???
Неизвестный
13.04.2010, 19:20
общий
Ципихович Эндрю:
Цитата: 238244
ранее Вы давали ссылки на
Почитайте VBA Создание меню и Работа с панелями инструментов и меню
Сейчас есть вопрос № 177826 на эту тему, не поможете???
Это не я давал ссылки, а F®ost (и как раз в том вопросе, куда вы меня направляете:), но вряд ли в настоящий момент я смогу присоединиться к его обсуждению.
Форма ответа