Отформатируйте подмножество текста в ячейке Excel с помощью формулы

Я построил строку, используя формулу в Excel. Например

Ячейка C3 содержит текст «Языки»
Ячейка C4 = «Английский, испанский, немецкий, французский»
My Forumla = C3 & ":" & CHAR (10) & C4

Желаемый текст будет:

Языки:
английский, испанский, немецкий, французский

(где полужирный текст на самом деле будет иметь какой-то цвет, например красный)

Есть ли способ сделать это в Excel (изменить частичное форматирование текста).

Я пробовал формулу ... (Не работает)

Function formatText(InText As Range)

'Set font color
  InText.Characters(1.5).Font.Color = Red
   'InText.Characters((InStr(1, ":", InText) + 1), (Len(InText) - InStr(1, ":", InText))).Font.ColorIndex = 3
End Function

person Hightower    schedule 28.02.2013    source источник
comment
+1 интересная проблема / недоработка приложения   -  person whytheq    schedule 28.02.2013


Ответы (4)


Ваша опубликованная функция работает тогда и только тогда, когда

  • Он вызывается из Sub (т.е., как уже упоминалось, не как UDF)

И

  • значения, содержащиеся в диапазоне InText, являются строковыми константами. (Это суть моего ответа)

Это не будет работать для любых ячеек в диапазоне InText, содержащих формулу. AFAIK вы не можете форматировать часть строки, возвращаемой формулой.

Кстати, я бы хотел, чтобы меня доказали, что я ошибаюсь в этом!

person chris neilsen    schedule 28.02.2013
comment
+1! Хотел бы доказать, что вы ошибаетесь, но это сработает, только если вы заранее измените формулу на значение. в противном случае цвет будет применен ко всей ячейке. :-( - person Peter Albert; 28.02.2013
comment
Да ... Я понимаю, о чем вы говорите ... Итак, как бы вы преобразовали вывод формулы в строку, чтобы можно было применить форматирование текста? - person Hightower; 28.02.2013

Что касается вопроса Хайтауэра, «как бы вы преобразовали вывод формулы в строку, чтобы можно было применить форматирование текста?»

Чтобы «преобразовать» вывод формулы, чтобы можно было применить форматирование текста, вы должны записать значение, возвращаемое формулой, в электронную таблицу, а затем применить форматирование к написанному вами значению. Вы можете либо записать значение в ячейку, содержащую формулу (которая стирает формулу), либо вы можете записать значение в другое место в электронной таблице (что сохранит формулу, но тогда вы увидите двойное).

Sub Cell_Format(InText as Range)
  InText.formula = cstr(InText.value)  ' converts result of formula into a string literal   
    'or: InText.offset(0,1).formula = cstr(InText.value) -- writes the value in the cell next to InText
  InText.characters(1, 5).font.color = vbRed
End Sub

Затем Cell_Format range("$A$1") заменит формулу в ячейке $ A $ 1 строковой константой и изменит цвет первых пяти символов на красный.

Если вы хотите сделать это для диапазона, превышающего одну ячейку, добавьте этот код к приведенному выше:

Sub Range_Format(InText as Range)
  For each c in InText
    Cell_Format(c)
  Next
End Sub
person tpkaplan    schedule 04.12.2014

Вам нужно использовать этот код:

InText.Characters(1,5).Font.Color = RGB(255, 0, 0)

Если вы хотите сделать его гибким, чтобы только (полностью) вторая строка была красной, используйте этот код:

InText.Characters(Instr(InText, vbCr)+1, Len(InText)-Instr(InText, vbCr)).Font.Color = RGB(255, 0, 0)

Обратите внимание, что ваша функция должна вызываться из VBA, т.е. вы не можете использовать ее как функцию, определяемую пользователем! UDF могут возвращать только результат, но никогда не изменять ячейку!

person Peter Albert    schedule 28.02.2013

Вы не можете напрямую вызвать указанную ниже UDF в интерфейсе Excel. Для этого вам нужно будет использовать событие, поскольку UDF не может изменить физические характеристики ячейки. Более подробно вы можете прочитать по этой ссылке. http://support.microsoft.com/kb/170787

Function formatText(InText As Range)

'Set font color
  InText.Interior.Color = vbRed
   'InText.Characters((InStr(1, ":", InText) + 1), (Len(InText) - InStr(1, ":", InText))).Font.ColorIndex = 3
End Function
person Community    schedule 28.02.2013