【问题标题】:Advanced text editing for VBA (excel) textboxVBA (excel) 文本框的高级文本编辑
【发布时间】:2015-09-22 09:40:32
【问题描述】:

序言

最近,我一直在处理包含大量文本和 cmets 的大型 Excel 电子表格(多人处理单个文档)。一次又一次地编辑它是非常困难的(考虑到新的笔记),因为文档导航在某些时候变得非常复杂。所以,我决定我需要一些工具来获取/设置我在某一时刻实际需要的数据(单个单元格内容、相应的评论内容、单元格行的额外数据)。

到目前为止做了什么

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

问题本身

首先,当我从单元格中获取文本时,我需要保持文本格式。目前我没有采取任何格式,只是文本。我通过谷歌搜索发现我可以逐个字符设置格式,有点像下面的伪代码:

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 并向后复制,只需一行代码?

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

有没有办法将格式化工具(位于 Home->Font 菜单中的工具,或者当您在单元格中选择一些文本时弹出菜单)添加到 UserForm 以编辑 TextBox 对象中的文本? em>

附:使用 Excel 2013

补充一点: 我以某种方式假设,如果没有直接的方法来做我在问题中描述的事情 - 必须有一些以前由某人创建的定制工具箱对象(类似于 EvenRicherTextBox)。我简直不敢相信这个问题从未出现过,但我不知道我需要使用什么关键字才能找到该对象。

【问题讨论】:

  • 可能有一种方法可以做到这一点,但它会占用大量代码。 vba 中没有“格式”标签,格式的每一部分都是一个单独的代码字符串。您所追求的格式类型是否相当有限,即粗体、斜体、基本字体等 - 或者您是否正在寻找相当多的种类?如果您在两个单元格之间记录复制格式,它将让您了解某些格式可能需要的 VBA 命令。
  • 这里出了点问题。 MyTextBox.Font.Bold = Cells(Row,Col).Font.Bold,这非常适合我,(以及斜体和下划线选项),不需要遍历每个字符文本。是否有任何特定选项不能以这种方式工作??
  • 哦,也许我明白了,每个单元格中有很多行,每行都有不同的格式,对吧?
  • @A.S.H 它可能不仅仅是一条线。我可以在其中一行中突出显示单词,甚至是一个字母。它看起来更像是 MS Word 文本,而不是适合 excel 的内容。
  • @Trum 从理论上讲,我在第二个问题中谈到的菜单可以由我自己制作,因为我们在 Cell 和 TextBox 对象的对象和方法中获得了所有功能。但是,对已经在原始程序中实现的东西进行电玩似乎是一条错误的道路。

标签: vba excel formatting


【解决方案1】:

您可以尝试为此创建一个自定义类,以下是它的外观示例:

类模块代码(将模块命名为“FormattedString”)

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

【讨论】:

  • 这通常是我想要避免的方法。无论如何,感谢您的解释,如果没有其他问题,我想我会使用它。您对第二个问题也有任何想法吗?那个似乎要复杂得多。
  • 我想有人已经提到了 RTF 工具——这可能是最好的选择。您可以通过 winAPI 创建一系列上下文菜单,但如果您有任何错误,那么再见工作簿.....
猜你喜欢
  • 2023-03-20
  • 2019-09-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多