单元格格式

时间:2016-05-17 09:50:45

标签: excel vba userform

有关Excel格式的简短问题。

我目前正在开发基于用户表单的协议工具。 userform基本上由两个输入窗口组成,一个用于加载exisitng项目符号,另一个用于添加新点。

此外,我希望在每个项目符号点添加粗体字的日期。我通过搜索日期出现的字符串中的位置(通过instrrev),然后将接下来的10个字符的字体更改为粗体字体来实现。

现在它在创建一个新的项目符号时工作得非常好,但是当我向现有主题添加一个额外的点或者当我更改一个旧的项目符号点时(然后整个文本是粗体),它总是会混乱。谁知道为什么会这样?

Private Sub Fertig_Click()
    Dim neu As String
    Dim i As Integer
    neu = Date & ": " & mitschrieb_neu.Value


    'No Changes
    If mitschrieb_neu.Value = "" And mitschrieb_alt.Value = ActiveCell.Value Then
        Unload Me
        Exit Sub
    End If

    'First bullet point
    If mitschrieb_neu.Value <> "" And ActiveCell.Value = "" Then
        ActiveCell.Value = neu
        i = InStrRev(ActiveCell.Value, Date)
        ActiveCell.Characters(i, 10).Font.Bold = True
        Unload Me
        Exit Sub
    End If

    'New bullet point
    If mitschrieb_neu.Value <> "" And ActiveCell.Value <> "" Then
        ActiveCell.Value = ActiveCell.Value & Chr(10) & neu
        i = InStrRev(ActiveCell.Value, Date)
        ActiveCell.Characters(i, 10).Font.Bold = True
        Unload Me
        Exit Sub
    End If

    'Changed an old bullet point
    If mitschrieb_neu.Value = "" And mitschrieb_alt.Value <> ActiveCell.Value Then
        ActiveCell.Value = mitschrieb_alt.Value
        Unload Me
        Exit Sub
    End If

End Sub

1 个答案:

答案 0 :(得分:0)

执行此操作后:

ActiveCell.Value = ActiveCell.Value & Chr(10) & neu

单元格的Bold设置变得统一 - 它会删除子字符串格式的任何知识。

因此,解决方案是在循环中解析整个值,并识别所有日期并使它们变为粗体。

与此同时,我建议一些方法来减少代码的重复,并将所有不同的情况(第一个子弹,而不是第一个子弹,仅修改)合并为一种通用方式:

Private Sub Fertig_Click()
    Dim neu As String
    Dim i As Integer

    'No Changes
    If mitschrieb_neu.Value = "" And mitschrieb_alt.Value = ActiveCell.Value Then
        Unload Me
        Exit Sub
    End If

    ' Join the old value with the new value and put a linefeed 
    ' in between only if both are not empty.
    ' Also insert the date before the new value, if it is not empty
    ActiveCell.Value = mitschrieb_alt.Value _
        & IIf(mitschrieb_alt.Value <> "" And mitschrieb_neu.Value <> "", Chr(10), "") _
        & IIf(mitschrieb_neu.Value <> "", Date & ": " & mitschrieb_neu.Value, "")

    ActiveCell.Font.Bold = False ' start with removing all bold
    ' Search for all colons and put prededing date in bold (if it is a date)
    i = InStr(ActiveCell.Value, ": ")
    Do While i
        ' Make sure to only put in bold when it is a date, otherwise skip this ":"
        If i > 10 And IsDate(Mid(ActiveCell.Value, i - 10, 10)) Then
            ActiveCell.Characters(i - 10, 10).Font.Bold = True
        End If
        ' find next
        i = InStr(i + 1, ActiveCell.Value, ": ")
    Loop

    Unload Me
End Sub