Devust
Newbie | Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору Ой, спасибо большое. Пример только мудрёный получился. Со сплитом (SplitEx) - совсем муторно разбираться. Скопировал к себе, потом обязательно разберу, но для меня и мой простенький вариант подходит. Но всё-же не пойму. Ваша программа работает со словом целиком - она же не заменяет НБС7 на НАС101 (<что-то>БС7 на <то же что-то>АС101) Но, определённо я нашёл в вашей программе, что искал: Никак не мог понять как работает Range r.SetRange Start:=r.Start + i, End:=r.Start + i r.InsertAfter (DownS) и т.д. В общем, я всё-таки, оставил свой вариант. Но )) Теперь никак не могу понять одну фишку. Public Sub zamena_po_predl() Const razd = "., " Dim s As String Dim i, j, l, k, cs, csi, ri As Integer Dim s_split() As String Dim s_split_all() As String Dim yes_instr, yes_zamena As Boolean Dim r As Range Open "d:\plast112test.txt" For Input As #1 cs = -1 While Not EOF(1) Input #1, s If s <> "" Then s = Trim(s): s_split() = Split(s): j = -1: l = UBound(s_split): cs = cs + 1 For i = 0 To l If s_split(i) <> "" Then j = j + 1: s_split(j) = s_split(i) End If Next i ReDim Preserve s_split(j) l = UBound(s_split) ReDim Preserve s_split_all(0 To 3, 0 To cs) For i = 0 To l s_split_all(i, cs) = s_split(i) Next i End If Wend Close #1 For i = 1 To ActiveDocument.Sentences.Count For csi = 0 To cs yes_instr = True Do While yes_instr j = InStr(1, ActiveDocument.Sentences(i), s_split_all(0, csi)) If j <> 0 Then yes_zamena = False If InStr(razd, ActiveDocument.Sentences(i).Characters(j + Len(s_split_all(0, csi)))) > 0 Then yes_zamena = True End If If yes_zamena Then Set r = ActiveDocument.Sentences(i) r.SetRange Start:=j - 1, End:=j + Len(s_split_all(0, csi)) - 1 r.Delete r.InsertAfter (s_split_all(1, csi)) j = j + Len(s_split_all(1, csi)) - 1 If s_split_all(2, csi) <> "" Then Set r = ActiveDocument.Sentences(i) r.SetRange Start:=j, End:=j r.InsertAfter (s_split_all(2, csi)) r.Font.Subscript = True j = j + Len(s_split_all(2, csi)) End If If s_split_all(3, csi) <> "" Then Set r = ActiveDocument.Sentences(i) r.SetRange Start:=j, End:=j r.InsertAfter (s_split_all(3, csi)) r.Font.Superscript = True j = j + Len(s_split_all(3, csi)) End If End If Else yes_instr = False End If Loop Next csi Next i End Sub Фишка в том, что в разных случаях удаляется разный диапазон. Видимо именно в указании начала и конца диапазона, который следует удалить, я что-то делаю не правильно. Не могу пока понять как правильно. откуда и как управляется у Вас r.Start я у себя определяю однозначно, однако к чему-то есть ещё привязки. Расскажите, плиз, это очень полезная функция. Добавлено: Вот, например: Сначала: Слово НБС7 слово слово слово, БС7. Стало: Слово НАС101 слово слово слово,АС.101 Вообще катавасия какая-то. Съелся пробел после запятой, а 10 и 1 вставились после точки. Как я вижу, что после определения set range, r.Start = 0 Почему тогда после второго нахождения БС7 диапазон начинает болтать в разные стороны? Ведь перед каждой заменой стоит Set r = ActiveDocument.Sentences(i) Добавлено: Ничего не понимаю. Закрыл ворд, открыл - всё прошло нормально. Начал в ворде испытывать разные варианты, запускаю (F8) программку, топою по строкам, и вижу, что снова пробелы съедаются. Где что какое эхо с прошлых выполнений остаётся? Это как randomize в начале нужно ставить, чтоб случайные числа не повторялись. Здесь что-ли также? | Всего записей: 18 | Зарегистр. 15-01-2013 | Отправлено: 12:59 01-03-2016 | Исправлено: Devust, 13:47 01-03-2016 |
|