簡體   English   中英

Excel VBA 宏在單元格中用粗體文本替換 Html 粗體標記

[英]Excel VBA Macro Replace Html Bold Tag With Bolded Text In Cell

我有以下幾點:

s = 1
f = 1
For i = 1 To UBound(Split(Range("B17").Value, "<b>"))
    s = InStr(f, Range("B17").Value, ("<b>"))
    f = InStr(s, Range("B17").Value, ("</b>"))
    Range("B17").Characters(s, f - s + 1).Font.FontStyle = "Bold"
Next i

這適用於循環單元格並使所有文本之間 標簽加粗。 但是,這也仍然會在單元格中留下標簽。

我需要一種在特定單元格中加粗並刪除標簽的方法。 我嘗試添加:

Range("B17").Value = Replace(Range("B17").Value, "<b>", "")
Range("B17").Value = Replace(Range("B17").Value, "</b>", "")

但是,這不僅刪除了標簽,還刪除了粗體。

是否有可能做到這一點?

這段代碼在移除標簽之前首先記錄標簽的位置。 然后,在一個單獨的循環中,它將粗體字體應用於標注的文本位置。

Private Sub SetCharsBold(Cell As Range)
    ' 086

    Const Tag       As String = "<b>"       ' tag string: start
    Const Tend      As String = "</b>"      ' tag string: end
    Const Pstart    As Integer = 0          ' vector index of Pos()
    Const Pend      As Integer = 1          ' vector index of Pos()
    
    Dim Cv          As String               ' Cell value
    Dim Cnt         As Integer              ' instances of bold expressions
    Dim Pos()       As Variant              ' string positions: 0 = start, 1 = End
    Dim f           As Integer              ' loop counter: Cnt
    
    Cv = Cell.Value
    Cnt = (Len(Cv) - Len(Replace(Cv, Tag, ""))) / 3
    ReDim Pos(Cnt, Pend)
    For f = 1 To Cnt
        Pos(f, Pstart) = InStr(Cv, Tag)
        Cv = Left(Cv, Pos(f, Pstart) - 1) & Mid(Cv, Pos(f, Pstart) + Len(Tag), Len(Cv))
        Pos(f, Pend) = InStr(Cv, Tend) - 1
        Cv = Left(Cv, Pos(f, Pend)) & Mid(Cv, Pos(f, Pend) + Len(Tend) + 1, Len(Cv))
    Next f
    
    With Cell.Offset(18)
        .Font.Bold = False
        .Value = Cv
        For f = 1 To Cnt
            .Characters(Pos(f, Pstart), Pos(f, Pend) - Pos(f, Pstart) + 1).Font.Bold = True
        Next f
    End With
End Sub 

我以為它有點慢。 因此,我想在它運行時暫停屏幕更新( Application.ScreenUpdating = False ),但又克制住了。 原因是該過程只是格式化單個單元格。 您可能會從另一個過程調用它,該過程循環遍歷列中的所有單元格,依次將每個單元格提供給上述過程。 使用像SetCharsBold Range("F1")這樣的代碼。 屏幕控制應該在那個過程中完成,延遲更新直到它的循環運行。

我忘記從代碼中刪除Cell.Offset(18)並決定將其留在那里再考慮一下。 我不希望代碼覆蓋原始文本。 或許你也有類似的需求。 請調整那條線以適應。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM