Форум программистов, компьютерный форум, киберфорум
MS Office Word
Войти
Регистрация
Восстановить пароль
 
6 / 4 / 1
Регистрация: 21.02.2013
Сообщений: 61
1

VSTO Вставка символа в середину слова

27.06.2020, 22:42. Просмотров 148. Ответов 5
Метки нет (Все метки)

Здравствуйте, уважаемые форумчане!
В коде понадобилось пройти циклом по выделению и в каждом третьем слове в его середине вставить набор символов.
Например текст:
"У меня очень хорошее настроение, поэтому я пою"
превращается в:
"У меня оче555нь хорошее настроение, поэт555ому я пою"

Проблема в том, что никак не пойму как их вставить. Гугл что-то не то подсказывает.
Что имею:
Цикл по словам и определение каждого третьего слова:
C#
1
2
3
4
5
6
7
8
9
for(int curNumber=1; curNumber < rng.Words.Count; curNumber++)
  {
      if (curNumber % 3 == 0)
      {
          if (rng.Words[curNumber].Text.Length > 2)
              rng.Words[curNumber].Text = rng.Words[curNumber].Text.Insert(rng.Words[curNumber].Text.Length / 2, "555");               
              //Так не работает, говорит, что "Не удается удалить диапазон"
      }
  }
Приму с благодарностью любые верные направления)
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
27.06.2020, 22:42
Ответы с готовыми решениями:

Машина Тьюринга: вставка символа A после первого символа непустого слова Р
нужно решение А={a,b,c}. Составьте программу для МТ вставки символа а после первого символа...

Вставка символа после определенного слова в текстбоксе
нужно вставить после 6-ого символа в текстбоксе (text1.text) букву 'а', каким способом можно...

Вырезать середину строки от символа до символа и вставить туда точки (сокращение пути)
Здравствуйте. Имеется строка, которую получаю из комбобокса, формат, в основном, такой:...

Вставка в середину LinkedList
Задание Применяя связанный список класса LinkedList, создать последовательность строк из 26...

5
65 / 40 / 20
Регистрация: 30.01.2020
Сообщений: 105
28.06.2020, 10:15 2
Цитата Сообщение от sandycorp Посмотреть сообщение
rng.Words[curNumber].Text = rng.Words[curNumber].Text.Insert(rng.Words[curNumber].Text.Length / 2, "555");
На VBA можно было бы написать примерно так:
Visual Basic
1
2
3
  ss = rng.Words(curNumber).Text
  ii = Int(Len(ss) / 2)
  rng.Words(curNumber).Text = Left(ss, ii) & "555" & Mid(ss, ii + 1)
0
6 / 4 / 1
Регистрация: 21.02.2013
Сообщений: 61
28.06.2020, 23:21  [ТС] 3
К сожалению результат тот же, та же ошибка.
Буду разбираться.
Если есть у кого-либо еще мысли - готов выслушать.
Если найду причины и решения - обязательно отпишу сюда
0
7723 / 4178 / 1660
Регистрация: 11.02.2013
Сообщений: 8,943
29.06.2020, 01:37 4
Типичная ошибка: изменение коллекции (выделения) во время её перебора.
Решение: сначала просчитать точки вставки (Range.Start от начала документа). Затем, идя с конца, вставлять в ранее запомненные места свои слова

Добавлено через 20 минут
На VBA это будет примерно так:
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
Sub InsertMiddleEveryNWord(rng As Range, n As Integer, wd As String)
  'Вставка заданного текста в середину n-ого слова
  
  'Коллекция, куда будем запоминать место середины слов
  Dim ind As New Collection
  'Добавляем нулевой первый элемент, чтобы при добавлении в коллекцию
  'получить обратный порядок
  ind.Add 0
  Dim i As Variant
  Dim w As Range
  Ищем n - слова
  For i = n To rng.Words.Count Step n
    Set w = rng.Words(i)
    'Добавляем середины слов в начало коллекции
    ind.Add CLng(w.Start + (w.End - w.Start) / 2), Before:=1
  Next
  'Удаляем последний элемент коллекции
  ind.Remove ind.Count
  'Перебираем диапазон с конца, вставляя заданный текст
  For Each i In ind
    rng.Document.Range(CInt(i), CInt(i)).InsertAfter wd
  Next
End Sub
1
65 / 40 / 20
Регистрация: 30.01.2020
Сообщений: 105
29.06.2020, 10:10 5
Цитата Сообщение от ViterAlex Посмотреть сообщение
Решение: сначала просчитать точки вставки (Range.Start от начала документа). Затем, идя с конца, вставлять в ранее запомненные места свои слова
Спасибо!
То есть, если sandycorp, просто перепишет свою первую строчку на обратный отсчёт:
C#
1
for(int curNumber=rng.Words.Count; curNumber > 1; curNumber--)
то и у него всё должно получиться, как я понимаю.
0
7723 / 4178 / 1660
Регистрация: 11.02.2013
Сообщений: 8,943
29.06.2020, 10:26 6
Punkt5, нет. Изменять нужно не текст, диапазон. И точку вставки считать относительно всего документа, а не слова.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
29.06.2020, 10:26

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Вставка элемента в середину массива
Дело вот в чем. У меня есть массив структур. У всех есть поле &quot;id&quot; - 1,2,4,5,6,7,8 Мне надо в...

Вставка элемента в середину массива
есть массив состоящий из 10 интов 12 85 66 12 44 0 0 0 0 0 как вставить новый элемент(напр. 25)...

Вставка в середину типиризированного файла
Удалять и заменять записи в типизированном файле я уже научился. Но вот вставить в середину запись...

Вставка узла в середину двусвязного списка
Уважаемые коллеги, прошу помощи! Изучаю двусвязный список. Вставку в конец и начало я...

Вставка элемента в середину и поиск по списку
Хеееелп! В с++ я шарю плохо. Есть прога, работающая со списком (код почти весь стырен), но идет...

Вставка нового столбца в середину таблицы
Столкнулся с проблемой при работе в &quot;Среде Microsoft SQL Server Management Studio Express&quot; :wall:...


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

Или воспользуйтесь поиском по форуму:
6
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.