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

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

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

Восстановить пароль
Повторная активизация e-mail

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

Ответ
 
Опции темы Поиск в этой теме
Старый 06.03.2009, 12:15   #1
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию Как напечатать символ после InlineShape?

Господа, есть вопрос.
Вот процедура и функция. Процедура СоздатьКомбобокс вставляет комбобокс в ячейку таблицы, соседнюю для ячейки, в которой был найден текст sText. Ячейка с текстом ищется функцией НайтиЯчейкуСТекстом. Заполняется комбобокс элементами массива arNames, также дополнительно задается количество комбобоксов, которое нужно вставить в ячейку. Задача в том, что если комбобоксов больше 1, то их нужно разделить запятыми. Не могу понять как.
Код:
'Задаем строку для поиска ячейки, массив с именами и количество комбобоксов, которое нужно вставить. _
По умолчанию количество комбобоксов равно 1.
Private Sub СоздатьКомбобокс(sText As String, arNames As Variant, Optional КоличествоКомбиков = 1#)
  Dim oYadda As InlineShape, i#
  Dim sOldEntry As String 'строка для хранения старой записи в ячейке, куда вставляем комбобокс
  Dim oCell As Cell 'ячейка, соседняя с найденным текстом
  Set oCell = НайтиЯчейкуСТекстом(sText, oOrderDoc).Next
  Dim fam As Variant
  'Смотрим, что находится в ячейке, комбобокс или простой текст
  If oCell.Range.InlineShapes.Count <> 0 Then 'если есть нетекстовые элементы
    For i = 1 To oCell.Range.InlineShapes.Count
      'Если это комбобокс
      If TypeName(oCell.Range.InlineShapes(i).OLEFormat.Object) = "ComboBox" Then
        With oCell.Range.InlineShapes(i).OLEFormat.Object
          sOldEntry = .Value 'Запоминаем текст, выбраный в нем
          .Clear 'Очищаем
          For Each fam In arNames 'забиваем список
            .AddItem fam
            .ListIndex = IIf(sOldEntry = fam, .ListCount - 1, .ListIndex)
          Next
        End With
      End If
    Next
  Else 'если в ячейке только текст
    sOldEntry = Left(oCell.Range.text, Len(oCell.Range.text) - 2) 'Запоминаем текст из соседней ячейки
    'Убираем из нее текст
    oCell.Range.text = ""
    For i = 1 To КоличествоКомбиков
      'В соседней от найденного текста ячейке создаем комбобокс
      Set oYadda = oCell.Range.InlineShapes.AddOLEControl(ClassType:="Forms.ComboBox.1")
      With oYadda.OLEFormat.Object
        .SpecialEffect = fmSpecialEffectFlat
        .DropButtonStyle = 1: .ShowDropButtonWhen = 1
        .Height = 14: .Width = IIf(sText = "фамилия", 47, 140)
        .SelectionMargin = False
        .Object.AutoSize = sText = "с членами бригады"
        For Each fam In arNames 'забиваем список
          .AddItem fam
          .ListIndex = IIf(sOldEntry = fam, .ListCount - 1, .ListIndex)
        Next
      End With
    Next i
  End If
End Sub

'Функция возвращает первую ячейку, в которой был найден заданный текст. В качестве _
необязательного параметра можно задать документ, в котором производить поиск. Если _
документ не указать, то поиск производится в активном документе.
Function НайтиЯчейкуСТекстом(sText As String, Optional oDoc = Nothing) As Cell
  Set НайтиЯчейкуСТекстом = Nothing
  Set oDoc = IIf(oDoc Is Nothing, ActiveDocument, oDoc)
  Dim oTbl As Table
  For Each oTbl In oDoc.Tables
    With oTbl.Range.Find
      .ClearFormatting: .Replacement.ClearFormatting
      .text = sText: .Wrap = wdFindStop
      .Execute
      If .Found And .Parent.Cells.Count <> 0 Then
        Set НайтиЯчейкуСТекстом = .Parent.Cells(1)
        Exit Function
      End If
    End With
  Next
End Function
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 06.03.2009 в 12:18.
viter.alex вне форума Ответить с цитированием
Старый 06.03.2009, 16:47   #2
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Что-то не получается. Попробовал вставить сразу после комбобокса через
Код:
oCell.Range.InsertAfter ", "
Вставляет, но при вставке следующего он лепится впритык к предыдущему, а запятая уезжает в самый конец, где к ней плюсуется еще одна.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 06.03.2009, 18:02   #3
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Решил!
Оказалось, чтобы писать после нужно вставлять после. А чтобы писать между, то нужно вставлять до, т.к. при вставке нового комбобокса он ставится не в конец ячейки, а почему-то в начало. Вроде офис русский, а вставляет справа налево.
Таким образом после каждой вставки комбобокса нужно проверять, сколько уже вставлено и печатать запятую перед диапазоном ячейки.
после строки Set oYadda = oCell.Range.InlineShapes.AddOLECont rol(ClassType:="Forms.ComboBox.1") нужно написать
Код:
If КоличествоКомбиков > 1 And i <> КоличествоКомбиков Then oCell.Range.InsertBefore ", "
Надеюсь, что мои потуги понадобятся другим.

P.S. Интересное наблюдение. Грамотно пользоваться Excel умеют далеко не все, о чем говорит количество сообщений в соответствующей ветке (12817 в 2155 темах на момент написания поста). Тогда как Word знают почти все (1,162 сообщений в 230 темах). Разница на порядок. Но стоит посмотреть документы, которые присылают, как эта статистика требует правки. И это я заметил не только на этом форуме. Куда мы катимся?
Лучше день потерять — потом за пять минут долететь!©

Последний раз редактировалось viter.alex; 06.03.2009 в 18:11.
viter.alex вне форума Ответить с цитированием
Старый 06.03.2009, 21:17   #4
EducatedFool
Программист VBA
СуперМодератор
 
Аватар для EducatedFool
 
Регистрация: 13.07.2008
Сообщений: 6,856
По умолчанию

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Грамотно пользоваться Excel умеют далеко не все .... Тогда как Word знают почти все
У большинства примерно одинаковые познания в этих 2 программах.
И эти познания стремятся к нулю

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Но стоит посмотреть документы...
А ты не смотри. Или, по крайней мере, выключай режим отображения непечатаемых символов (сам знаю - когда видишь по 50 пробелов подряд в начале каждой строки, начинаешь думать про составителя документа всякие нехорошие вещи )

Количество постов в соответствующих разделах нисколько не свидетельствует об уровне познаний людей в этих программах.

Просто, чтобы пользоваться Вордом, думать вообще не надо - тыкай кнопочки с буковками, а потом нажимай Файл - Печать, и всё.

С Excel-ем чуть сложнее - после кнопочек требуется подсчитать сумму в одной ячейке, а это вынуждает хоть чуточку, но думать (не так ведь просто написать формулу суммы 5-ти ячеек)
Поэтому и вопросов в разделе Excel на порядок больше.

Цитата:
Сообщение от viter.alex Посмотреть сообщение
Куда мы катимся?
Мы не катимся. Они катятся
EducatedFool вне форума Ответить с цитированием
Старый 06.03.2009, 21:24   #5
viter.alex
Балуюсь кодами
Участник клуба
 
Аватар для viter.alex
 
Регистрация: 09.01.2009
Сообщений: 1,837
По умолчанию

Цитата:
Сообщение от EducatedFool Посмотреть сообщение
…А ты не смотри. Или, по крайней мере, выключай режим отображения непечатаемых символов …
Не успеваю выключить. Он у меня включен по умолчанию, пока выключу, уже впечатление портится.
Цитата:
Сообщение от EducatedFool Посмотреть сообщение
…Мы не катимся.…
Мы уверенно шагаем.
Лучше день потерять — потом за пять минут долететь!©
viter.alex вне форума Ответить с цитированием
Старый 07.03.2009, 00:45   #6
Sasha_Smirnov
Особый статус
Участник клуба
 
Аватар для Sasha_Smirnov
 
Регистрация: 24.11.2008
Сообщений: 1,535
По умолчанию Excel & Word

У разработчиков Word не хватило юмора в меню Вид добавить "Печатную машинку"! (Зато в Сервисе есть Автоформат. Но ведь это же для гур!)

А вообще, Excel требует хотя бы 1 кг мозга, а Word — думает за нас! Что нас и портит.
Sasha_Smirnov вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Как из delphi вставить символ в word? Sony Общие вопросы Delphi 10 04.09.2014 19:51
как в шаблоне Word напечатать данные из Exel Ирина Штефан Microsoft Office Excel 4 21.01.2009 01:23
Как получить символ?(Delphi) The_Darkness Помощь студентам 3 18.07.2008 08:36
как присвоить char'у символ перевода строки? Retiz Помощь студентам 6 06.04.2008 00:05