VBA(excel)文本框的高级文本编辑

时间:2015-09-22 09:40:33

标签: excel vba excel-vba formatting

序言

最近,我一直在努力研究那些有大量文本和评论的大型Excel电子表格(多个人在单个文档上工作)。一次又一次地编辑它(考虑新注释)非常困难,因为文档导航在某些时候变得非常复杂。所以,我决定我需要一些工具来获取/设置我实际需要的数据(单个单元格内容,相应的评论内容,单元格的按需行的附加数据)。

到目前为止做了什么

幸运的是,开始很容易。我在UserForm中填充了4个文本框(2个只读,2个用于编辑),其中填充了所选注释的数据(按索引),以及一些允许接受/放弃更改并在注释单元格之间导航的按钮。

问题本身

首先,我需要在从单元格中获取文本时保持文本格式。目前我没有采取任何格式,只是文本。我通过Google搜索找到的是我可以逐个字符设置格式,类似于以下伪代码:

For i = 0 to Cells(Row, Col).Text.Length
    MyTextBox.Text(i).FormatOption1 = Cells(Row, Col).Text(i).FormatOption1
    ...
    MyTextBox.Text(i).FormatOptionN = Cells(Row, Col).Text(i).FormatOptionN
Next

但这种方法感觉很愚蠢。所以,问题一是:

有没有办法复制文本的全文格式(字体,B / I / U,颜色,单元格中每个字母的大小)以及文本,从单元格到TextBox以及向后复制,只需一行代码?

其次我实际上需要在UserForm中使用一些格式化工具来在我的表单中进行上述文本格式化,所以问题二是:

有没有办法在UserBox中添加格式化工具(位于Home-&gt;字体菜单或弹出菜单中,当您在单元格中选择一些文本时)以编辑TextBox对象中的文本?< / em>的

P.S。使用Excel 2013

有点补充: 我以某种方式假设如果没有直接的方法去做我在问题中描述的内容 - 必须有一些之前由某人创建的定制工具箱对象(有点像EvenRicherTextBox)。我简直无法相信这个问题永远不会出现,但我不知道我需要使用哪些关键字才能找到该对象。

1 个答案:

答案 0 :(得分:2)

你可以尝试为此创建一个自定义类,这里有一个示例:

类模块代码(将模块命名为&#34; FormattedString&#34;)

Option Base 1

Private Type FSChar
    Letter      As Integer
    Bold        As Boolean
    Italic      As Boolean
    Underline   As Boolean
    Colour      As Long
    Size        As Integer
End Type

Private strCollection() As FSChar
Private strRange        As Excel.Range
Private txt             As String  


Public Property Let FString(value As Excel.Range)

    Set strRange = value
    txt = strRange.text

    ReDim strCollection(1 To Len(strRange.text)) As FSChar

    For i = 1 To Len(strRange.text)
        With strCollection(i)
            .Letter = Asc(Mid(strRange.text, i, 1))
            .Bold = (strRange.Characters(i, 1).Font.Bold = True)
            .Italic = (strRange.Characters(i, 1).Font.Italic = True)
            .Underline = (strRange.Characters(i, 1).Font.Underline = True)
            .Colour = strRange.Characters(i, 1).Font.ColorIndex
            .Size = strRange.Characters(i, 1).Font.Size
        End With
    Next

End Property


Public Property Get FString() As Excel.Range
    Set FString = strRange
End Property


Public Sub WriteFStringToCell(ByRef writeCell As Range)

writeCell.value = txt

    For i = 1 To UBound(strCollection)
        With writeCell.Characters(i, 1).Font
            .Bold = strCollection(i).Bold
            .Italic = strCollection(i).Italic
            .Underline = strCollection(i).Underline
            .ColorIndex = strCollection(i).Colour
            .Size = strCollection(i).Size
        End With
    Next i
End Sub

<强> 实施例
(用A1写一些东西,用不同的格式等格式......)

Sub MacroMan()

Dim testClass As FormattedString
Set testClass = New FormattedString

testClass.FString = Range("A1")

testClass.WriteFStringToCell Range("A2")

End Sub