【问题标题】:Replace Bold Font with html bold tags around text将粗体字体替换为文本周围的 html 粗体标签
【发布时间】:2017-12-18 12:46:48
【问题描述】:

我正在尝试创建 Excel VBA 代码来查找粗体文本并在找到的文本周围添加 html 粗体标记。

示例:
查找:“这个粗体字”和
替换为:“This <b>bold</b> word”(html标签和word都需要加粗)

注意:粗体文本在非粗体文本的单元格内,只应替换粗体文本。

我还需要换一种方式。意思是查找带有或不带有粗体字体的粗体标签 (<b></b>),并删除标签并确保文本为粗体。

找到了this,看起来很接近,但我对ActiveDocument.Tables(1).Select.Wrap = wdFindStop 有疑问。

我还发现了this,它可能有助于查找/替换文本而不会丢失粗体格式,但不完全是我需要的。对于我想要做的事情来说,这可能有点矫枉过正。

我正在做一些事情。

Sub removeboldaddHtml()
    lastrow = Range("A1").End(xlDown).Row
    For i = 1 To lastrow
        msg = ""
        For j = 1 To Len(Cells(i, 1))
            If Range("A" & i).Characters(j, 1).Font.Bold = True Then
                msg = msg & Mid(Cells(i, 1), j, 1)
            End If
        Next j ' next character
        If msg <> "" Then
            Cells(i, "B").Value = "<b>" & msg & "</b>"
        End If
    Next i ' next row
End Sub

【问题讨论】:

  • 您是在 Excel 还是 Word 中工作?
  • 我认为正则表达式可能会有所帮助,但我不确定。
  • 您需要遍历单元格的字符集合并检查每个字符以查看粗体格式的开始和结束位置。如果您在执行过程中添加/删除“”,这并不简单,因为您必须在添加/删除时不断调整索引。
  • Robin,正在尝试创建 Excel VBA 宏以在另一个 excel 中查找/替换文本。
  • Tim,你有什么例子可以提供给我吗?

标签: html excel vba


【解决方案1】:

下面的代码相当粗糙、不优雅且耗费资源。但无论如何可能会有所帮助(对于您问题的第一部分)。只有当粗体是连续的时它才会起作用(它不会为 forlike 这样的东西起作用)。数据位于工作表“Sheet1”的 A 列(以下代码中只有第 1 到 3 行)。 已编辑,以粗体显示标签和标签之间的文本。

Private Sub CommandButton1_Click()
    Dim MyStringLength  As Integer
    Dim OriginalString As String
    Dim MyRow As Long
    Dim StartPos As Integer
    Dim EndPos As Integer


        For MyRow = 1 To 3 'Adjust to your row number
            StartPos = 0
            EndPos = 0
            MyStringLenght = Len(Worksheets("Sheet1").Cells(MyRow, 1))
            For i = 1 To MyStringLenght
                If Worksheets("Sheet1").Cells(MyRow, 1).Characters(i, 1).Font.Bold = True Then
                    If StartPos = 0 Then
                        StartPos = i
                    End If
                    EndPos = i
                End If
            Next
            OriginalString = Worksheets("Sheet1").Cells(MyRow, 1)
            Worksheets("Sheet1").Cells(MyRow, 2) = StartPos
            Worksheets("Sheet1").Cells(MyRow, 3) = EndPos
            Worksheets("Sheet1").Cells(MyRow, 4) = Left(OriginalString, StartPos - 1) & "<b>" & Mid(OriginalString, StartPos, EndPos - StartPos + 1) & "</b>" & Right(OriginalString, MyStringLenght - EndPos)
            Worksheets("Sheet1").Cells(MyRow, 4).Characters(StartPos, EndPos - StartPos + 7).Font.Bold = True
        Next
End Sub

【讨论】:

  • 感谢您的快速回复,但我认为我很清楚。我需要用非粗体字体替换单元格中的粗体字体。我也无法让你的宏工作。
  • 1) 在您的问题中,您说“html 标签和单词都需要加粗”。如果您不希望替换为粗体,只需删除行Worksheets("Sheet1").Cells(MyRow, 4).Characters(StartPos, EndPos - StartPos + 7).Font.Bold = True。 2)宏对我有用。也许您可以添加哪一行不工作的详细信息(可能使用 F8 单步执行代码)。
  • 另一个前任。将:“单元格内的一些随机示例 text”替换为:“单元格内的一些随机示例 text”。我需要在替换后将“文本”一词和 html 标签加粗。这是行不通的: Worksheets("test").Cells(MyRow, 4) = Left(OriginalString, StartPos - 1) & "" & Mid(OriginalString, StartPos, EndPos - StartPos + 1) & "" & Right(OriginalString, MyStringLenght - EndPos)
  • 这就是完整的代码应该做的。第一行有示例文本吗?如果单元格为空代码将失败(无处理错误)。当然,发布的代码不是替换,而是将输出写入另一列(#4)......
  • 很高兴它成功了。请标记为已接受...!另一方面,我现在很着急(没时间写代码),但我认为你可以使用InStr。该函数在字符串中找到一个子字符串(在您的情况下为&lt;b&gt;&lt;/b&gt;)并返回该位置。知道位置后,在中间的字符中添加粗体(类似于我的代码的最后一行),然后删除左侧或右侧的三个字符。
【解决方案2】:

添加标签示例:

Sub Tester()
    AddTags Range("A1")
End Sub

Sub AddTags(c As Range)

    Dim p As Long, isB As Boolean
    Do
        p = p + 1
        If p > Len(c.Value) Then Exit Do

        If c.Characters(p, 1).Font.Bold And Not isB Then
            'entering a bolded section
            c.Characters(p, 0).Insert "<b>"
            c.Characters(p, 3).Font.Bold = True
            isB = True
            p = p + 3 'skip the tag you just added
        ElseIf Not c.Characters(p, 1).Font.Bold And isB Then
            'leaving a bolded section
            c.Characters(p, 0).Insert "</b>"
            c.Characters(p, 4).Font.Bold = True
            isB = False
            p = p + 4 'skip the tag you just added
        End If
    Loop
    'close any open tag
    If isB Then c.Characters(p, 0).Insert "</b>"
End Sub

【讨论】:

  • 不错!更短、更清晰且适用于非连续粗体字。
  • 所以这对于小型演示非常有用,但是当我尝试为其提供一个范围 (Range("C2:D50")) 时,它会中断。我也尝试在 Range 循环中使用 For each 框,但是代码要么挂起,要么执行一些奇怪的更改,例如将每个字母放在单元格内的新行中。有时它只是跳过粗体文本。有什么想法吗?
  • 我看不到你尝试了什么,所以我没有有用的建议。最好用你当前的代码发布一个新问题,描述一下到底是什么不工作,以及一个返回这篇文章的链接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-10
  • 2020-12-23
  • 2011-08-21
相关资源
最近更新 更多