Написал макрос, склеивает 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 написал: Помещает в ячейку "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: в функции можно выполнить команды форматирования ячейки, просто добавьте в функцию ещё аргумент типа Range
Иными словами, часто функция отличается от процедуры только тем, что может вернуть что-то по завершении, что не мешает ей изменять аргументы, переданные по ссылке ByRef (по-умолчанию и можно не указывать) или просто что угодно
Примеры
Код
' процедуры и функция ChangeRange*, вызванные из этой родительской процедуры, дадут абсолютно одинаковый результат
sub t()
ChangeRange1 range("A1:B2")
ChangeRange2
if not ChangeRange3 range("A1:B2") then exit sub
end sub
' только эта изменяет ПЕРЕДАННЫЙ аргумент (то есть можно передавать любые диапазоны и она их закрасит жёлтым)
sub ChangeRange1(rng as range)
rng.interior.color=vbyellow
end sub
' а эта работает с диапазоном, прописанным ВНУТРИ неё и только с ним
sub ChangeRange2()
range("A1:B2").interior.color=vbyellow
end sub
' а это уже функция и она, в отличие от ChangeRange1, ДОПОЛНИТЕЛЬНО может ВЕРНУТЬ значение (в родительскую процедуру в данном случае)
' в данном случае я записал в неё проверку на количество ячеек передаваемого диапазона и она вернёт True только, если всё ок
function ChangeRange3(rng as range) as boolean
if rng.Count<>2 then msgbox "Передай 2 ячейки!",vbcritical,"УЧИ ИНСТРУКЦИЮ":exit function
rng.interior.color=vbyellow
ChangeRange=true
end fubction
' если в дочерних процедурах есть какие-то проверки или вероятность ошибки/невыполнения, то удобнее сделать их функциями, возвращающими исход исполнения (булево истина/ложь)
' естественно, функция может ВЕРНУТЬ практически всё, что угодно - число, текст, массив, диапазон и т.д.
Во всех делах очень полезно периодически ставить знак вопроса к тому, что вы с давних пор считали не требующим доказательств (Бертран Рассел) ►Благодарности сюда◄
Андрей 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 написал: такое значение записанное в переменную strTemp, которое позволит отобразить “TestText12”, где “12” является Superscript.
А как вы себе это представляете? Строка - это всего лишь набор символов. Вы может сохранить Html страницу вашего топика и открыть в блокноте. Там вы увидите этот самый набор символов, который естественно отличается от того, что вы видите в вашем топике. Да, можно описать текстом же нечто понятное интерпретатору, как нужно представлять на экране данный текст. Те Html Теги и описание стилей, что вы можете найти сохранённой Html странице. Но! А какое отношение составленная текстовым указанием форматирования строка будет иметь методу Range.Characters? У этого метода два параметра: начало диапазона и число символов. Вы уверены, что метод примет на свой вход некую строку и будет на её основании как-то форматировать текст? Да, метод возвращает объект диапазона символов, но и этот объект не использует некие данные текстовой строки для выполнения форматирования. Поэтому нет смысла создавать такую переменную strTemp - она не позволит, используя Range.Characters, что-то отформатировать в ячейке.
Вопрос, а какое отношение функции Сonvert_Hours, Convert_Hours2 имеют отношение к вопросу вашей темы?
Если вы хотите управлять форматированием ячейки посредством создания текстовой строки, содержащей описание форматирования, понятное некоторому движку, который на основании этого описания будет представлять текст в требуемом виде, то используйте другой метод объекта Range. Допустим в активной ячейке текст "TestText12", тогда свойство ActiveCell.Value(xlRangeValueXMLSpreadsheet) вернёт xml структуру, которая содержит данные по представлению текста ячейки в состоянии по умолчанию (опускаю не существенную часть структуры xml).