【问题标题】:Subscript vs. Superscript conflict下标与上标冲突
【发布时间】:2020-03-24 02:20:16
【问题描述】:

背景:

我正在尝试编写一个模块来连接字符串及其格式。因此,我正在查看所有可能重要的 Font 属性,包括 SubscriptSuperscript


样本数据:

想象一下A1


示例代码:

Sub Test()

With Sheet1.Range("B1")
    .Value = .Offset(0, -1).Value
    For x = 1 To .Characters.Count
        .Characters(x, 1).Font.Subscript = .Offset(0, -1).Characters(x, 1).Font.Subscript
        .Characters(x, 1).Font.Superscript = .Offset(0, -1).Characters(x, 1).Font.Superscript
    Next x
End With

End Sub

结果:


问题:

如果我使用 F8 逐步浏览此代码,我可以看到应该是下标的字符变成了下标,但在传递上标值时会丢失它的属性值.反之亦然,这意味着上标属性保持不变。

这个过程是一个更大的过程的一部分,例如我试图转换这个:

Sub ConcatStringsWithFormat()

Dim dict As Object: Set dict = CreateObject("Scripting.Dictionary")
Dim props(9) As Variant, arr As Variant
Dim rng As Range
Dim x As Long, y As Long: y = 0

Set rng = Sheet1.Range("A1:A3")
With Application
    .Trim (rng)
    arr = rng: arr = .Transpose(.Index(arr, 0, 1))
End With
    
For Each cell In rng
    If Len(cell) > 0 Then
        y = y + 1
        For x = 1 To cell.Characters.Count
            props(0) = cell.Characters(x, 1).Font.Bold
            props(1) = cell.Characters(x, 1).Font.ColorIndex
            props(2) = cell.Characters(x, 1).Font.FontStyle
            props(3) = cell.Characters(x, 1).Font.Italic
            props(4) = cell.Characters(x, 1).Font.Size
            props(5) = cell.Characters(x, 1).Font.Strikethrough
            props(6) = cell.Characters(x, 1).Font.Subscript
            props(7) = cell.Characters(x, 1).Font.Superscript
            props(8) = cell.Characters(x, 1).Font.TintAndShade
            props(9) = cell.Characters(x, 1).Font.Underline
            dict.Add y, props
            y = y + 1
        Next x
    End If
Next cell

With Sheet1.Cells(1, 2)
    .Value = Application.Trim(Join(arr, " "))
    For x = 1 To .Characters.Count
        If Mid(.Value, x, 1) <> " " Then
            .Characters(x, 1).Font.Bold = dict(x)(0)
            .Characters(x, 1).Font.ColorIndex = dict(x)(1)
            .Characters(x, 1).Font.FontStyle = dict(x)(2)
            .Characters(x, 1).Font.Italic = dict(x)(3)
            .Characters(x, 1).Font.Size = dict(x)(4)
            .Characters(x, 1).Font.Strikethrough = dict(x)(5)
            .Characters(x, 1).Font.Subscript = dict(x)(6)
            .Characters(x, 1).Font.Superscript = dict(x)(7)
            .Characters(x, 1).Font.TintAndShade = dict(x)(8)
            .Characters(x, 1).Font.Underline = dict(x)(9)
        End If
    Next x
End With

End Sub

导致:

如您所见,丢失的只是下标属性。关于为什么会发生这种情况以及如何克服这个问题的任何想法?很明显,如果您手动尝试,单元格将允许两个属性在不同字符上为真。

【问题讨论】:

    标签: excel vba fonts subscript superscript


    【解决方案1】:

    在设置这些属性之前进行测试:

    Sub Test()
    
    With Sheet1.Range("B2")
        .Value = .Offset(0, -1).Value
        For x = 1 To .Characters.Count
          If .Offset(0, -1).Characters(x, 1).Font.Subscript Then
             .Characters(x, 1).Font.Subscript = True
          ElseIf .Offset(0, -1).Characters(x, 1).Font.Superscript Then
             .Characters(x, 1).Font.Superscript = True
          End If
        Next x
    End With
    
    End Sub
    

    【讨论】:

    • 啊,呃。感谢 Rory,在我的模块中实现为 If dict(x)(6) = True ThenElseIf dict(x)(7) = True Then。关于为什么该属性被重置为空的任何想法?最初我想避免使用IF,因为我可以从一个字符中读取这两个属性就好了。然而,实施是另一回事。
    • 我猜在程序员看来,将任一属性设置为False 就等于说“这应该是普通文本”
    • 我刚刚发现交换两行也解决了这个问题:S....
    • @JvdV 是的,看起来上标具有某种优先级。如果其中有任何类型的上标(即使它是末尾的一个字母并且单元格的所有其余部分都是下标),它始终是在格式单元格对话框中选择的部分上标选项。
    【解决方案2】:

    刚刚发现换行会得到正确的结果:


    错误

    With Sheet1.Range("B1")
        .Value = .Offset(0, -1).Value
        For x = 1 To .Characters.Count
            .Characters(x, 1).Font.Subscript = .Offset(0, -1).Characters(x, 1).Font.Subscript
            .Characters(x, 1).Font.Superscript = .Offset(0, -1).Characters(x, 1).Font.Superscript
        Next x
    End With
    

    With Sheet1.Range("B1")
        .Value = .Offset(0, -1).Value
        For x = 1 To .Characters.Count
            .Characters(x, 1).Font.Superscript = .Offset(0, -1).Characters(x, 1).Font.Superscript
            .Characters(x, 1).Font.Subscript = .Offset(0, -1).Characters(x, 1).Font.Subscript
        Next x
    End With
    

    换行工作。除了在单元格设置下这些属性也在彼此下方之外没有其他解释。

    【讨论】:

      猜你喜欢
      • 2019-08-15
      • 2014-11-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-11-10
      • 2013-10-25
      • 2020-04-02
      相关资源
      最近更新 更多