Страницы: 1
RSS
Изменение части текста в ячейке (string, range, superscript), Форматирование текста в ячейке при помощи функции
 
Добрый день!

Написал макрос, склеивает 2 строки и возвращает в ячейку при помощи Range, а после форматирует.
Первая строка - обычная, вторая - superscript.
Код
Sub formatcell_superscript()

    Dim strName As String
    Dim srtsuperscript As String
    
    strName = "TestText" ' Обычная строка
    srtsuperscript = "12" ' superscript
    L = Len(srtsuperscript)
    
    MsgBox "srtsuperscript : " & srtsuperscript ' проверка содержимого srtsuperscript
    MsgBox "srtsuperscript L: " & L ' проверка содержимого длины (L) srtsuperscript
    
    Range("A1").Value = strName & srtsuperscript
    Range("A1").Characters(Start:=Len(strName) + 1, Length:=Len(srtsuperscript)).Font.Superscript = True
    
End Sub

Вопрос:
Можно ли произвести то же действие, но при помощи функции, где параметрами будут выступать 2 строки, а возвращаемым значением строка с форматированием?
Код
Function func_formatcell_superscript(strName As String, srtsuperscript As String)

    L = Len(srtsuperscript)

    Dim strTemp As String
    strTemp = strName + srtsuperscript
    
    ' Как произвести формат содержимого String, если Characters и Font работают только с Range
    ' strTemp.Characters(Start:=Len(strName) + 1, Length:=Len(srtsuperscript)).Font.Superscript = True

    func_formatcell_superscript = strTemp

End Function


Изменено: avdoshin - 05.06.2020 17:17:09
 
Доброе время суток
Цитата
avdoshin написал:
а возвращаемым значением строка с форматированием?
Что вы подразумеваете под строкой с форматированием?
 
нельзя
пользуйтесь написанным Sub formatcell_superscript
Программисты - это люди, решающие проблемы, о существовании которых Вы не подозревали, методами, которых Вы не понимаете!
 
Цитата
Что вы подразумеваете под строкой с форматированием?
Обращение к функции из ячейки
=func_formatcell_superscript("TestText";12)

Помещает в ячейку "TestText12", где 12 - Superscript.

strTemp - будет содержать символы, которые в ячейки будут отображатся как Superscript, или цвет шрифта, и т.д.
 
Вы не находите, что между фразами
Цитата
avdoshin написал:
Помещает в ячейку "TestText12", где 12 - Superscript.
и
Цитата
avdoshin написал:
а возвращаемым значением строка с форматированием?
есть некоторая разница? По этому прошу ответить именно на тот вопрос, который я задавал.

Если вы вызваете функцию из процедуры Sub, да в функции можно выполнить команды форматирования ячейки, просто добавьте в функцию ещё аргумент типа Range,
Код
Function func_formatcell_superscript(ByVal RangeCell As Range, strName As String, srtsuperscript As String)
 
    L = Len(srtsuperscript)
 
    Dim strTemp As String
    strTemp = strName + srtsuperscript
     
    ' Как произвести формат содержимого String, если Characters и Font работают только с Range
    RangeCell.Characters(Start:=Len(strName) + 1, Length:=Len(srtsuperscript)).Font.Superscript = True
 
    func_formatcell_superscript = strTemp
 
End Function

'Пример вызова, например для конпки
Public Sub SetSuperscript()
Dim sResult As String
sResult = func_formatcell_superscrip(ActiveCell, "name", "superscript")
End Sub

. При вызове помещайте в него ссылку на ячейку.
Изменено: Андрей VG - 06.06.2020 12:14:17
 
О - я помню, как путался с этой передачей аргументов. Попробую объяснить, как сам понял

avdoshin,
Цитата
Андрей VG: в функции можно выполнить команды форматирования ячейки, просто добавьте в функцию ещё аргумент типа Range
Иными словами, часто функция отличается от процедуры только тем, что может вернуть что-то по завершении, что не мешает ей изменять аргументы, переданные по ссылке ByRef (по-умолчанию и можно не указывать) или просто что угодно
Примеры

Ссылки:
Передача значений переменных из одного макроса в другой. Вызов макроса из макроса
Передача параметров процедурам и функциям в VBA, необязательные (optional) параметры, передача по ссылке (ByRef) и по значению (ByVal), применение ссылок при передаче параметров
Возможно ли в VBA передавать в функцию имена других функций?
Изменено: Jack Famous - 06.06.2020 12:41:50
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
 
Цитата
Андрей VG написал:
Вы не находите, что между фразами есть некоторая разница?
Да разница есть.

Цитата
Андрей VG написал:
По этому прошу ответить именно на тот вопрос, который я задавал.

Андрей VG написал:
Что вы подразумеваете под строкой с форматированием?

Под строкой с форматированием, я имею в виду:
- под строкой -  переменную strTemp as String, значение, которой возвращается функцией func_formatcell_superscript
- под форматированием строки - такое значение записанное в переменную strTemp, которое позволит отобразить “TestText12”, где “12” является Superscript.

Пример, для форматирования строки содержащий Superscript
Convert_Hours - возвращает строку
Convert_Hours2 - возвращает строку с “форматированием” (решение в использовании конректных Unicode символов (h,m,s), вместо Superscript
Код
‘ Convert_Hours
‘ вызов с листа =Convert_Hours(176,7854) -> результат  11h 0m 0,79s 

Function Convert_Hours(Decimal_Deg) As Variant ‘ функция выводит зна
    With Application
        hours_dec = Decimal_Deg / 360 * 24
        hours = Int(hours_dec)

        minutes_dec = hours_dec - hours
        minutes = Int(minutes_dec)

        seconds = minutes_dec - minutes

        Convert_Hours = " " & hours & "h " & minutes & "m " & Round(seconds, 2) & "s "
    End With
End Function

‘ Convert_Hours2
‘ вызов с листа =Convert_Hours(176,7854) -> результат  11h 0m 0,79s, где h,m,s - является Superscript 
Function Convert_Hours2(Decimal_Deg) As Variant
    With Application
        hours_dec = Decimal_Deg / 360 * 24
        hours = Int(hours_dec)

        minutes_dec = hours_dec - hours
        minutes = Int(minutes_dec)

        seconds = minutes_dec - minutes

   ‘ решение в использовании Unicode символов
        Convert_Hours2 = " " & hours & ChrW(&H2B0) & " " & minutes & ChrW(&H1D50) & " " & Round(seconds, 2) & ChrW(&H2E2)
    End With
End Function

Моем примере
Я вызываю макрос,
В котором сначала присваиваю через Value значение конкретную ячейку A2, а затем через Characters обращаюсь к части строки находящейся в ячейке A2 и “форматирую” эти символы как Superscript.

Мне хотелось бы осуществлять данное действие через вызов функции с листа
'=func_formatcell_superscript("TestText";"12")
передавая в нее два аргумента - String,
первый из которых будет выведен обычным шрифтом, а второй в Superscript в ту же ячейку, откуда и происходит вызов функции.

Попробовал Ваш пример, что-то у меня не заработал.

Цитата
Андрей VG написал:
При вызове помещайте в него ссылку на ячейку.
Может быть я не правильно помещаю ссылку?
Изменено: avdoshin - 06.06.2020 22:57:11
 
Цитата
avdoshin написал:
такое значение записанное в переменную strTemp, которое позволит отобразить “TestText12”, где “12” является Superscript.
А как вы себе это представляете? Строка - это всего лишь набор символов. Вы может сохранить Html страницу вашего топика и открыть в блокноте. Там вы увидите этот самый набор символов, который естественно отличается от того, что вы видите в вашем топике.
Да, можно описать текстом же нечто понятное интерпретатору, как нужно представлять на экране данный текст. Те Html Теги и описание стилей, что вы можете найти сохранённой Html странице.
Но! А какое отношение составленная текстовым указанием форматирования строка будет иметь методу Range.Characters? У этого метода два параметра: начало диапазона и число символов. Вы уверены, что метод примет на свой вход некую строку и будет на её основании как-то форматировать текст? Да, метод возвращает объект диапазона символов, но и этот объект не использует некие данные текстовой строки для выполнения форматирования. Поэтому нет смысла создавать такую переменную strTemp - она не позволит, используя Range.Characters, что-то отформатировать в ячейке.

Вопрос, а какое отношение функции Сonvert_Hours, Convert_Hours2 имеют отношение к вопросу вашей темы?

Если вы хотите управлять форматированием ячейки посредством создания текстовой строки, содержащей описание форматирования, понятное некоторому движку, который на основании этого описания будет представлять текст в требуемом виде, то используйте другой метод объекта Range.
Допустим в активной ячейке текст "TestText12", тогда свойство ActiveCell.Value(xlRangeValueXMLSpreadsheet) вернёт xml структуру, которая содержит данные по представлению текста ячейки в состоянии по умолчанию (опускаю не существенную часть структуры xml).
Код
<Cell><Data ss:Type="String">TestText12</Data></Cell>

Переведём 12 в верхний регистр. Получим для того же свойства
Код
<Cell><ss:Data ss:Type="String" xmlns="http://www.w3.org/TR/REC-html40"><Font html:Color="#000000">TestText</Font><Sup><Font html:Color="#000000">12</Font></Sup></ss:Data></Cell>

Думаю понятно, что должна содержать строка текста, чтобы, задать требуемый superscript для заданного набора символов.
Успехов.
Страницы: 1
Наверх