在VBA函数中返回带有上标字符的字符串

时间:2016-11-24 07:21:30

标签: excel string vba excel-vba superscript

我在Excel中有一个宏,它将小数度值(右上升)转换为天文小时角度,小时(h),分钟(m)和秒(s)。 有没有办法,用上标缩写h,m,s?

返回字符串

这是我的Excel宏:

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

因此,例如在单元格A1中,我写176.7854和单元格B1 =Convert_Hours(A1)。将11h 0m 0.79s写入单元格B1。但我想要的是:11 h 0 m 0.79 s

我不想(!)想要用VBA引用一些选定的单元格,然后应用c.Font.Superscript = True之类的东西,这是在VBA中搜索上标字符串时的标准答案。我的函数Convert_Hours()应该自己返回一个格式化的字符串。

提前谢谢!

2 个答案:

答案 0 :(得分:3)

由于字符串只能包含没有格式化的单个字符,因此在没有格式化的情况下实现此目的的唯一方法是找到代表上标小写字母的Unicode字符。

上标拉丁字母没有完整的Unicode块。所以我们需要从不同的块中获取它们。我们可以在Latin_script_in_Unicode中找到概述。

我们可以在Spacing Modifier Letters中找到ʰ和。。我们可以在Phonetic Extensions中找到。

如果我们找到了这些字符,我们必须知道如何将它们连接到VBA中的字符串中。为此,可以使用ChrW函数。它需要字符的十进制代码。

所以

...
Convert_Hours = " " & hours & ChrW(688) & " " & minutes & ChrW(7504) & " " & Round(seconds, 2) & ChrW(738)
...

几乎可以得到你想要的东西。但是上标字母的大小会有所不同,因为它们来自不同的Unicode块。所以我更喜欢在字符串中使用默认字母并稍后格式化它们的上标。当然,这不能在用户定义函数(UDF)中完成。

根据@arcadeprecinct

的评论
...
Convert_Hours = " " & hours & ChrW(&H2B0) & " " & minutes & ChrW(&H1D50) & " " & Round(seconds, 2) & ChrW(&H2E2)
...

也可以使用十六进制。

答案 1 :(得分:0)

简单的建议总是为我工作:(1)转到编程选项卡并开始录制MACRO; (2)选择具有先前添加的字符串的单元格; (3)单击公式字段(屏幕上方),选择字符串的一部分并将其标记为上标; (4)停止录制并查看生成的代码。这将告诉你如何做到这一点。

这是我刚刚生成的一个例子:

    Sub Macro1()
    '
    ' Macro1 Macro
    '

    '
        ActiveCell.FormulaR1C1 = "asd sad ads asd asd asd "
        With ActiveCell.Characters(Start:=1, Length:=12).Font
            .Name = "Arial"
            .FontStyle = "Regular"
            .Size = 11
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
            .ThemeFont = xlThemeFontMinor
        End With
        With ActiveCell.Characters(Start:=13, Length:=7).Font
            .Name = "Arial"
            .FontStyle = "Bold"
            .Size = 11
            .Strikethrough = False
            .Superscript = True
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
            .ThemeFont = xlThemeFontMinor
        End With
        With ActiveCell.Characters(Start:=20, Length:=5).Font
            .Name = "Arial"
            .FontStyle = "Regular"
            .Size = 11
            .Strikethrough = False
            .Superscript = False
            .Subscript = False
            .OutlineFont = False
            .Shadow = False
            .Underline = xlUnderlineStyleNone
            .ThemeColor = xlThemeColorLight1
            .TintAndShade = 0
            .ThemeFont = xlThemeFontMinor
        End With
        Range("D4").Select
    End Sub

希望这会对你有所帮助。