Выбрать дату в календареВыбрать дату в календаре

Страницы: 1
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Ха!!! Нашел приемлемое для себя решение.
Для добавления текста в ячейку использую вариант из РЕШЕНИЕ2 (XML). При этом, первое ограничение (подмена некоторых цветов) мне не критично. А вот второе ограничение (изменение диапазонов условного форматирования) удалось обойти просто включив совместный доступ к файлу :) В этом режиме изменение условного форматирования недоступно, соответственно при отработке скрипта УФ не изменяется :)
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Нашел еще одну багу/фичу, РЕШЕНИЯ 2:
2. Если целевая ячейка входила в диапазон(ы) условного форматирования, то после вставки целевая ячейка исключается из диапазона(ов) правил условного форматирования. Например, если для Cell(1, 1), на листе было правило условного форматирования =$B1>10, для диапазона =$1:$1000, то после вставки правило остается прежним, а диапазон изменяется на =$2:$1000;$B$1:$XFD$1, (ячейка 1.1 исключается).

Это можно как-то победить?
Изменено: AnSo - 18.10.2019 09:51:55
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Написал функцию, может кому пригодиться:
Код
' Функция добавляет текст в ячейку, формата "Текстовый" или "Общий"(содержащий хотя бы одну букву),
' содержащую данные, не изменяя формат содержимого текста. Текст добавляется в начало.
' Функция возвращает:
'   True - если добавление прошло успешно,
'   False - если произошла ошибка при добавлении.
' Данные в ячейку НЕ добавятся (результат будет False) если:
'   - ячейка в которую добавляются данные пуста,
'   - добавляемый текст - пустой
'   - формат ячейки в котороую производится вставка НЕ "Текстовый" или "Общий"(содержащий хотя бы одну букву)
'   - произошла ошибка поиска тега Data
' Известные проблемы:
' 1. В процессе вставки подменяются некоторые цвета, например:
'       если в ячейке был фрагмент выделенный зеленым цветом #00B050,
'       то после добавления цвет меняется на #008080.
' 2. Если целевая ячейка входила в диапазон(ы) условного форматирования, то после вставки
' целевая ячейка исключается из диапазона(ов) правил условного форматирования.
' Например, если для Cell(1, 1), на листе было правило условного форматирования =$B1>10, для диапазона =$1:$1000,
' то после вставки правило остается прежним, а диапазон изменяется на =$2:$1000;$B$1:$XFD$1, (ячейка 1.1 исключается).
Function AddTextInCell(TargetCell As Range, sAddString As String) As Boolean
    Dim sXML As String
    Dim p As Long
    Dim pData As Long
    
    AddTextInCell = False
    
    ' Если нечего добавлять - выходим
    If sAddString = "" Then Exit Function
    
    ' Получаем содержимое целевой ячейки в формате XML
    sXML = TargetCell.Value(xlRangeValueXMLSpreadsheet)
    
    ' Заменяем переносы строк пробелами, для того чтобы корректно отработал поиск нужной подстроки
    sXML = Application.Trim(Replace$(Replace$(Replace$(sXML, vbCrLf, " "), vbLf, " "), vbCr, " "))
  
    ' Определяем позицию в тексте XML с которой начинается тэг данных
    p = InStr(sXML, "Data")
    ' Если тег есть
    If p Then
        ' Ищем позицию окончание тэга Data, т.е. закрывающую часть ">"
        pData = InStr(p, sXML, ">")
        If pData Then
            ' Проверяем что формат ячейки Текстовый или Общий (в ячейке есть буква):
            '    внутри тега Data ищем слово String
            If InStr(Mid(sXML, p, pData - p), "String") > 0 Then
                ' добавляем нужные нам данные в xml, для этого:
                ' берем левую часть исходного XML до данных в ячейке + добавляем нужный нам текст
                ' + добавляем правую часть исходного XML начиная с данных содержащихся в ячейке.
                sXML = Left(sXML, pData) & sAddString & Mid(sXML, pData + 1)
                ' записываем получившийся XML в ячейку
                TargetCell.Value(xlRangeValueXMLSpreadsheet) = sXML
                ' Возвращаем True
                AddTextInCell = True
            End If
        End If
    End If
End Function ' AddTextInCell(TargetCell As Range, sAddString As String) As Boolean

Проблему с цветом победить не удалось :(
Изменено: AnSo - 18.10.2019 09:52:58
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Цитата
Jack Famous написал:  БМВ , это очень сильное колдунство)) что это, если вкратце?
Для себя откомментировал код. Может кому пригодиться:
Код
Sub AddTextInCell()
    ' Получаем содержимое ячейки в формате XML
    sXml = Cells(1, 1).Value(xlRangeValueXMLSpreadsheet)
    
    ' Насколько я понял, заменяем переносы строк пробелами, для того чтобы корректно отработал поиск нужной подстроки
    sXml = Application.Trim(Replace$(Replace$(Replace$(sXml, vbCrLf, " "), vbLf, " "), vbCr, " "))
    
    ' Формируем строку для поиска, сразу после данного текста в XML идут данные содержащиеся в ячейке
    s = "Type=""String"" xmlns=""http://www.w3.org/TR/REC-html40"">"
    
    ' Определяем позицию в тексте XML с которой начинаются данные ячейки =
    ' позиция начиная с которой нашли строку поиска "s" + длина строки поиска
    p = InStr(sXml, s) + Len(s)
    
    ' добавляем нужные нам данные в xml, для этого:
    ' берем левую часть исходного XML до данных в ячейке + добавляем нужный нам текст (здесь добавлено еще форматирование текста - выделение черным цветом)
    ' + добавляем правую часть исходного XML начиная с данных содержащихся в ячейке.
    sXml = Left(sXml, p - 1) & "<Font html:Color=""#000000"">4. Добавляемый текст
</Font>" & Mid(sXml, p, 32768)
    
    ' записываем получившийся XML в ячейку
    Cells(1, 1).Value(xlRangeValueXMLSpreadsheet) = sXml
End Sub

БМВ, ОГРОМНОЕ спасибо за предложенное решение! Оно действительно работает.

Вопросы:
1. Вот это немного смущает: Mid(sXml, p, 32768). Что за число 32768? Максимальный размер данных (в формате XML) в ячейке?
2. После отработки данной процедуры, почему то, вот эта строка данных в XML:
Код
html:Color="#00B050">ttt</Font>
заменилась на
Код
html:Color="#008080">ttt</Font>

Т.е. изменился цвет. В других местах все сохранилось. Странь какая-то?! Почему так?
Изменено: AnSo - 15.10.2019 13:44:43
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Обнаружилась проблемка. Данное решение работает, если количество символов в целевой ячейке + количество добавляемых символов <= 255.
Если символов больше, то не работает :( - ошибок не выдает, просто не добавляет текст.
MS Excel 2013 x86, на других не проверял. Формат ячейки пробовал: "Обычный" и "Текст". Руками добавляется без проблем.  

Возможно ли обойти это ограничение? Если да, то как?
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Цитата
Alec Perle написал:
ActiveCell.Characters(0, 0).Insert "Дополнительная строка" & Chr(10)
Это именно то, что я искал! Вопрос решен. Всем большое спасибо!
Alec Perle, Вам отдельное ОГРОМНОЕ спасибо!
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Цитата
БМВ написал:
посмотрите это
Насколько я понял там есть два варианта:
1. Посимвольный перебор
2. Обработка xml.

Первый как я уже писал, мне не нравится.
А вот второй, вполне себе может подойти. Нужно время разобраться. Большое спасибо! Пошел разбираться :) По результатам постараюсь отписаться.

Если у кого-то будут еще варианты, буду рад услышать.
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Цитата
Alec Perle написал:
ведь по условиям задачи форматирование одинаково для каждой строки
Возможно я не совсем корректно описал задачу, но я потом уточнил:
Цитата
Задача именно в том, чтобы сохранить существующее форматирование. Т.е. в боевых условиях я не знаю какое форматирование есть внутри ячейки, оно каждый раз разное.
Т.е. форматирование в постановке задачи это пример, чтобы показать, что при исполнении описанного мной скрипта (команды) оно (форматирование) сбрасывается. На самом же деле форматирование равно как и содержание ячейки может совершенно разным.
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Цитата
RAN написал:
Считываете из ячейки параметры каждого символа
Спасибо за вариант. Но пока мне хочется думать, что предложенное Вами решение не единственное, поскольку оно мне ну очень не нравится.

Как Excel хранит форматирование текста внутри ячейки?
Предположу, что параметры форматирования он хранит не для каждого символа, а для каждого изменения формата. Что-то типа html: <b>жирный текст</b>. Если у меня текста в ячейке 100-200 символов, и я для каждого символа сделаю посимвольное форматирование, то размер форматирования превысит размер данных в ячейке :) Можно конечно программно одинаковое форматирование объединять в диапазоны, т.е. приводить к оригинальному виду, но это как-то сложновато выглядит для относительно простой операции.

Может все-таки есть более простой (правильный) способ?
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Задача именно в том, чтобы сохранить существующее форматирование. Т.е. в боевых условиях я не знаю какое форматирование есть внутри ячейки, оно каждый раз разное. Все что мне нужно, добавить в эту ячейку текст, не изменяя (сохранив) существующее форматирование.
Руками такое сделать легко. Неужели нельзя через VBA?
Как с помощью VBA добавить в ячейку текст с сохранением существуещего форматирования текста внутри ячейки?
 
Всем привет!

Есть ячейка A1, в которой содержатся строки с разным форматированием (см. вложение):
3. Жирный текст
2. Красный текст
1. Обычный текст

Как с помощью VBA в ячейку, в начало, добавить еще одну строку обычного текста, чтобы существующее форматирование не нарушилось, т.е. 3-я строка осталась жирной, 2-я Красной, а 1-я осталась без форматирования?
Уточнение: приведенное форматирование текста внутри ячейки это просто пример, т.е. на самом деле оно может быть произвольным.

Если я делаю так:

Код
Cells(1, 1).FormulaR1C1 = "4. Обычный текст" & Chr(10) & Cells(1, 1).FormulaR1C1 

то форматирование нарушается, становиться одинаковым для всей ячейки (т.е. для всего текста внутри ячейки).



РЕШЕНИЕ №1 от  Alec Perle,
в ответе #12:
Ограничение: работает только если в ячейке содержится не более 255 символов.

Код
ActiveCell.Characters(0, 0).Insert "Дополнительная строка" & Chr(10)

РЕШЕНИЕ №2 от БМВ, в ответе #11:
Ограничения:
1. В процессе вставки подменяются некоторые цвета текста внутри ячейки, например стандартный зеленый #00B050.
2. Если на листе используется условное форматирование, то после вставки целевая ячейка исключается из диапазонов существующих условий условного форматирования.

Код
Sub insertText()
 sXml = Cells(1, 1).Value(xlRangeValueXMLSpreadsheet)
 sXml = Application.Trim(Replace$(Replace$(Replace$(sXml, vbCrLf, " "), vbLf, " "), vbCr, " "))
 s = "Type=""String"" xmlns=""http://www.w3.org/TR/REC-html40"">"
 p = InStr(sXml, s) + Len(s)
 sXml = Left(sXml, p - 1) & "<Font html:Color=""#000000"">4. Обычный текст
</Font>" & Mid(sXml, p, 32768)
 Cells(1, 1).Value(xlRangeValueXMLSpreadsheet) = sXml
End Sub


ОГРОМНОЕ СПАСИБО:  Alec Perle (Решение1), БМВ (Решение 2), Jack Famous (комментарий про MID) и конечно автору первоисточника - ZVI.


Результат того, что мне было нужно в ответе #27.

Изменено: AnSo - 18.10.2019 09:41:35
VBA Excel+Outlook 2013. Ошибка при отправке сохраненных писем.
 
The_Prist, это то что нужно. Вопрос решен.

Большое спасибо за помощь!
VBA Excel+Outlook 2013. Ошибка при отправке сохраненных писем.
 
Большое спасибо всем откликнувшимся!
Цитата
PerfectVam написал: Черновик может быть не готов к отправке
с письмами точно все впорядке.

Цитата
The_Prist написал: Вполне возможно, что при выделении письма включается предпросмотр письма
Вы правы область чтения включена и насколько я понимаю это и есть причина, поскольку если Область чтения выключить, то письма уходят без ошибок.
Но область чтения должна быть включена (для выборочного контроля писем и содержания перед отправкой).

Как же можно победить данную проблему?

Мне видятся два варианта:
1. На время отправки как-то выключить обновление Области чтения
2. Перед отправкой сделать активной другую папку, например Отправленные.
Но как их реализовать, я пока не нашел :(

Если знаете как, поделитесь плиз. Или если есть еще варианты, буду рад их услышать.

Спасибо.
VBA Excel+Outlook 2013. Ошибка при отправке сохраненных писем.
 
Использование цикла:
Код
For Each oMail In oFolder.Items

не помогает.

VBA Excel+Outlook 2013. Ошибка при отправке сохраненных писем.
 
Добрый день.

Есть необходимость из Excel осуществлять отправку ранее сохраненных писем (папка "Черновики"). Код отправки см. ниже. Код работает, НО если перед отпавкой в Оутлуке открыть папку Черновики и выбрать любое сообщение (не открыть, а просто "встать" на него), то часть писем не отправиться и при отправке будет выдана ошибка: Run-time error ... "Этот метод нельзя использовать со встроенным элементом отправки почты".
Что это значит? Почему так происходит? И как это можно победить?

Код
Sub SendSaved()
    Dim oOutApp As Outlook.Application
    Dim oNamespace As Outlook.Namespace
    Dim oFolder As Outlook.MAPIFolder
    Dim oMail As Outlook.MailItem
    Dim i As Long
    
    Set oOutApp = GetObject(, "Outlook.Application")
    Set oNamespace = oOutApp.GetNamespace("MAPI")
    Set oFolder = oNamespace.GetDefaultFolder(olFolderDrafts)
    
    For i = 1 To oFolder.Items.Count
        Set oMail = oFolder.Items.Item(i)
         oMail.Send
        Set oMail = Nothing
    Next

    Set oFolder = Nothing
    Set oNamespace = Nothing
    Set oOutApp = Nothing
End Sub

Заранее, большое спасибо!
Изменено: AnSo - 20.03.2017 11:19:20
Страницы: 1
Наверх