Страницы: 1
RSS
функция .Replace изменяет форматирование ячейки. Как это исправить?
 
После применения фукции .Replace вся ячейка в которой происходит замена приобретает формат самого первого символа в этой ячейки.    
Написал коротенький макрос, который выделяет замещенный текст жирным шрифтом, однако понимаю что это слабое решение. У кого-нибудь есть идеи как можно по другому обойти "эту фичу" функции .Replace?  
 
Sub Replace2(WhatFind As String, Replace As String)  
 
Dim Finded As Range  
Dim temp As Integer  
 
Set Finded = Cells.Find(what:=WhatFind, lookat:=xlPart)  
If Finded Is Nothing Then Exit Sub  
 
temp = InStr(1, Finded, WhatFind) - 1  
With Finded  
   Finded.Value = Left(Finded, temp) + Replace + Right(Finded, Len(Finded) - temp - Len(WhatFind))  
   Finded.Characters(Start:=temp, Length:=Len(Replace) + 1).Font.FontStyle = "Bold"  
End With  
 
End Sub
 
В общем случае задача весьма сложна. Каждый символ в ячейке может иметь отдельный набор признаков форматирования (шрифт, размер, цвет, полужирный, курсив и т.д.).  
Подстрока поиска также может состоять из символов с разным форматом. Подстрока поиска может содержаться в одной ячейке несколько раз, каждый раз с разным форматом.  
Можно, например, сформулировать задачу так: заменить все вхождения подстроки WhatFind на подстроку WhatReplace, причем подстроки WhatReplace должны получить форматирование первого символа соответствующей замененной подстроки. Остальные символы должны сохранить исходное форматирование.  
Ваш макрос предусматривает замену только первой подстроки и только в одной ячейке. Что Вы хотите исправить?
 
Раз нельзя скопировать текст и одновременно скопировать его формат значит придется создавать массив, в котором будет хранится информация о формате каждого символа в найденной ячейке.    
 
Считаю, что учитвывать формат замещающего текста здесь лишнее. Главное, чтобы при замене не изменялся формат конечной ячейки. То есть, если мы замещаем "корову", которая выделена жирным шрифтом, на "свинью", то в конечном тексте слово "свинья" тоже должна иметь жирный шрифт.  
 
Да, в моем примере можно произвести замену только первого вхождения искомого слова, но это достаточно просто решается введением циклов.
 
http://www.excelworld.ru/forum/2-553-1#6528
Я сам - дурнее всякого примера! ...
 
Excel_master,  
всё это можно замутить не слишком сложно только если Вы заменяете слова на слова такой же длины.  
Тогда, действительно, можно запомнить параметры форматирования каждого символа в исходной строке и по ним форматировать результат.  
Пример-ссылку как это мы делали "В миру" привёл КukLP  
(АБСОЛЮТНО забыл об этой теме... Склероз, однако... Спасибо, Серёга!)    
Но там мы меняли неразрывные пробелы на обычные. Т.е. 1 символ на 1.  
А вот какой формат давать лишним символам при замене, например, "конь" на "лошадь"?
С уважением, Алексей (ИМХО: Excel-2003 - THE BEST!!!)
 
Леш, если слово отформатировано одинаково, то в HTMLproject оно будет целиком и можно менять его на что хочешь.
Я сам - дурнее всякого примера! ...
 
Посмотрел пример с html. Пример корректно работает только в 2003 офисе, у меня же на работе очень многие уже сидят под 2010, поэтому этот вариант не подходит.  
 
Есть идея, как это сделать по другому. Для этого нужны:  
1. функция для деления предложения на слова, которая возвращала бы номер символа слова в предложении, а лучше всего номер символа +1, с которого заканчивается предыдущее слово.  
2. функция, которая запоминает формат символа, полученного от функции №1  
3. Функция, которая восстанавливает форматы слов по формату их первого символа, используя функции №1 и №2. Эта же функция должна удалять искомый текст и добавлять замещающий текст так же как и в моем примере в начале темы.
 
Казанский > В общем случае задача весьма сложна.  
при этом весьма типична : )  
 
1. Составить коллекцию букв + их форматирование (ActiveCell.Characters.Font)  
2. Найти в ячейке позицию замены (InStr)  
3. Удалить элементы начиная с позиции InStr заканчивая InStr + length  
4. Добавить на их место любые другие с нужным форматированием  
5. Записать в ячейку  
6. Радоваться : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
nerv, как составить коллекцию форматирования для конкретного символа в строке?
 
\см. файл. Дальше сам.  
 
p.s.: могу решить задачу за умеренное вознаграждение. Мыло в подписи.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Попробовал делать через массивы: объявлял массив Ar() типа font, но массив заполняется не значениями, а ссылками на font.  
Попробовал делать через классы, но видимо неправильно описал тип данных.  
Пробы пера прилагаю.
 
Excel_master, ну, а так, как я говорил, конечно, не пробовал : )  
 
Создай тему здесь - http://www.excelworld.ru/forum/  
Этот форум грузиться 500 мильенов лет )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=03.09.2012 04:02}{thema=}{post}Этот форум грузиться 500 мильенов лет ){/post}{/quote}сглазил )))
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Все получилось. Сделал через введение нового класса. Если кому надо могу привести файл.
 
покажи. Мне интересно : )
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Конечно, лови. Макрос работает, но по моему мнению еще требует доработки.
 
че т слишком часто он меняет
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Для простоты задачи предполагается, что в одной ячейке содержится только одно искомое слово. По идее, т.к. строка в приведенном примере содержит две буквы "й", то строка должна меняться два раза, однако получается чаще.
 
Сколько бы вхождений искомого символа/текста строка не содержала, она должна меняться 1 раз. Еще, кажется, вы поиск не правильно используете.
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
Если вы скажете, как сделать, что бы менялось один раз и правильно использовался поиск, буду вам признателен.
 
Excel_master, код писать нету времени. Могу посоветовать почитать справку по Find (это раз), два - нашли файндом - дальше в цикле инстр пока не будет 0 (или как там по задаче)
Чебурашка стал символом олимпийских игр. А чего достиг ты?
Тишина - самый громкий звук


https://github.com/nervgh
 
{quote}{login=nerv}{date=08.09.2012 12:29}{thema=}{post}Excel_master, код писать нету времени. Могу посоветовать почитать справку по Find (это раз), два - нашли файндом - дальше в цикле инстр пока не будет 0 (или как там по задаче){/post}{/quote}  
 
Собственно не понимаю, зачем читать справку по Find - там нет ничего полезного.  
А по условию "моей" задачи в одной ячейке содержится только одно искомое слово, поэтому для меня резона дописывать код нет - и так все работает.    
Если кто-нибудь захочет дописать или изменить код - милости прошу, все необходимые коменты там присуствуют.
Страницы: 1
Читают тему
Наверх