在文本框中使单词加粗

Posted

技术标签:

【中文标题】在文本框中使单词加粗【英文标题】:Making a word bold in a textbox 【发布时间】:2018-06-12 12:58:22 【问题描述】:

Stack Overflow 中的新功能,我正在使用 VBA 在 Excel 中构建一个宏。基本上我有一个包含多个选项卡的文件,其中包含表格中的信息,这些表格中有文本,并且该文本中的一些单词是粗体并在每个选项卡中重复(比如说所有者和进程)。我确实根据他们之前在列表框中选择的表格行在位于表单中的文本框中显示此信息,文本显示正确,但它忽略文本格式(粗体和斜体)。有没有办法像在表格中一样在文本框中显示文本格式?

希望我已经说得够清楚了。

【问题讨论】:

如果你的意思是用户窗体上的文本框,那么没有。 您应该能够加粗 MSForms.TextBox(例如Me.TextBox1.Font.Bold = True)的(整个)内容,但不能仅将其应用于特定单词/字符。 @Macho-Zuniga - 添加了一个答案,演示了通过简单的 html 格式和 UserForm 中的 Webbrowser 控件 解决方法,正如您确认使用的那样一个 MSForms 控件(文本框)。 @Macho-Zuniga - 请通过将最佳解决方案标记为已接受来帮助其他开发人员确定一个好的或有用的答案(请参阅 ***.com/help/someone-answers ***.com/help/someone-answers)。我建议也看看“如何创建最小、完整和可验证的示例 (MCVE)”(***.com/help/mcve ***.com/help/mcve>)。 【参考方案1】:

Shape 文本框的典型示例(不是 ActiveX)

Sub BoxMaker()
    ActiveSheet.Shapes.AddTextbox(msoTextOrientationHorizontal, 217.5, 51#, _
        482.25, 278.25).Select
    Selection.Name = "SPLASH"
    Selection.Characters.Text = "Please Wait for Macro"
    With Selection.Characters(Start:=1, Length:=21).Font
        .Name = "Arial"
        .FontStyle = "Regular"
        .Size = 36
        .Strikethrough = False
        .Superscript = False
        .Subscript = False
        .OutlineFont = False
        .Shadow = False
        .Underline = xlUnderlineStyleNone
        .ColorIndex = xlAutomatic
    End With

    Selection.Characters(Start:=8, Length:=4).Font.Bold = True

    Selection.HorizontalAlignment = xlCenter
    Selection.VerticalAlignment = xlCenter
End Sub

您可以将文本框中的文本设置为类似于单元格中的文本。

【讨论】:

我怀疑 OP 要求的是 MSForms.Textbox 而不是你演示的那个。 @shrivallabha.redij 你可能是对的。你有任何可以发布的替代代码吗?? 我没有任何替代代码,但感觉至少用TextBox控制是不可能的。 Afaik,这仅适用于 Shapes.Textbox,不适用于 MSForms.Textbox(或任何 MSForms 想一想......)。无论哪种方式,从帖子来看,OP 使用 MSForms.Textbox 似乎是因为这是他遇到的第一个,而不是因为他特别需要。 所有,感谢您的回复,是的,实际上我正在使用 MSForms.TextBox【参考方案2】:

在用户窗体中使用 Webbrowser 控件的可能解决方法

由于您的评论:“...实际上我正在使用 MSForms.TextBox

一种可能的解决方法是使用 b 标记创建一个简单的 HTML 文件(例如,普通文本中的 blablabold text ...)用于粗体文本并加载将其放入 Webbrowser 控件(需要参考 Microsoft Internet Controls),例如通过 WebBrowser1.Navigate ThisWorkbook.Path & "\topic.htm"。

由于 HTML 通常使用 utf-8 编码,我演示了一种使用系统函数 WideCharToMultiByte(API 调用)的方法。

使用帮助函数的示例调用(API 调用)

' declare and assign simple html string
  Dim htmlstring as String
  htmlstring = "<html><body><div>Normal text <b>bold text</b> further text</div></body></html>"
' write html file via helper procedure  
  writeUtf8 htmlstring, ThisWorkbook.Path & "\topic.htm"
' load html file into WebBrowswer control
  Me.WebBrowser1.Navigate ThisWorkbook.Path & "\topic.htm"

辅助程序

我建议为这些辅助函数编写一个单独的代码模块:

Option Explicit  ' declaration head of separate code module

' Declare API Function
Private Declare Function WideCharToMultiByte Lib "kernel32.dll" ( _
  ByVal CodePage As Long, _
  ByVal dwFlags As Long, _
  ByVal lpWideCharStr As Long, _
  ByVal cchWideChar As Long, _
  ByVal lpMultiByteStr As Long, _
  ByVal cbMultiByte As Long, _
  ByVal lpDefaultChar As Long, _
  ByVal lpUsedDefaultChar As Long) As Long


Public Sub writeUtf8(ByVal s As String, ByVal datei As String)
' Purpose: save HTML String in utf-8 mode 
' Note:    called by  writeUtf8 htmlstring, thisworkbook.path & "\topic.htm"
Dim file As Integer
Dim B() As Byte
  file = FreeFile
  Open datei For Binary Access Write Lock Read Write As #file
  getUtf8 s, B
  Put #file, , B
  Close #file
End Sub

Private Sub getUtf8(ByRef s As String, ByRef B() As Byte)
' Note: called by above helper function; uses API call (see declaration head)
Const CP_UTF8 As Long = 65001
Dim len_s As Long
Dim ptr_s As Long
Dim size As Long
  Erase B
  len_s = Len(s)
  If len_s = 0 Then _
    err.Raise 30030, , "Len(WideChars) = 0"
  ptr_s = StrPtr(s)
  size = WideCharToMultiByte(CP_UTF8, 0, ptr_s, len_s, 0, 0, 0, 0)
  If size = 0 Then _
    err.Raise 30030, , "WideCharToMultiByte() = 0"
  ReDim B(0 To size - 1)
  If WideCharToMultiByte(CP_UTF8, 0, ptr_s, len_s, VarPtr(B(0)), size, 0, 0) = 0 Then _
    err.Raise 30030, , "WideCharToMultiByte(" & Format$(size) & ") = 0"
End Sub

【讨论】:

以上是关于在文本框中使单词加粗的主要内容,如果未能解决你的问题,请参考以下文章

在报表的文本框中按公式加粗部分文本 (ms Access 2016)

在文本框中,保护第一个单词,但允许添加/编辑这些单词之后的文本

如何在运行时在android中使部分文本加粗?

显示与 ipad 应用中文本框中输入的单词对应的内容

如何在文本框中阅读两个单词,它们之间有一个:[关闭]

动态地,在运行时,如何在 WPF 中更改文本框中某些单词的颜色?