prettify

2021年3月7日日曜日

セル内の一部文字に色を付けてみる(3)

 YouTubeに投稿した動画内で使用しているコードを貼っておきます。

ご参考までに。

エラー処理など、きちんと作りこんでいないので

コードをコピペして使用するのはオススメしません (m´・ω・`)m ゴメン…

また、実行時の条件によってXMLの形式が破損し、Excelデータを紛失する可能性がありますので、コードの内容を理解したうえでご使用ください。

※コードは自己責任でご使用ください。



【動作条件】
  • Module内にコードが記述されていること
  • キーワードを指定したテーブル名は "キーワードリスト" になっていること
  • キーワードが被っていないこと
  • 選択している範囲は文字を入力しているセルだけになっていること
  • 選択しているセルのCharactersオブジェクトにColor, Bold以外の設定がされていないこと
  • その他、なんプロが気付いていない動作条件を満たしていないこと(´・ω・`)


  1. Public Sub mainWithXml()
  2. Dim objTarget As Range
  3. Set objTarget = Selection
  4. '先にセル内の書式をリセットしておく'
  5. With objTarget.Font
  6. .Color = 0
  7. .Bold = False
  8. End With
  9. Dim objCell As Range
  10. Dim objRngGrp As Range
  11. '100セルずつ処理'
  12. For Each objCell In objTarget.Cells
  13. If objRngGrp Is Nothing Then '1つ目のセル'
  14. Set objRngGrp = objCell
  15. ElseIf objRngGrp.Cells.Count <= 99 Then '2~99個目のセル'
  16. Set objRngGrp = Application.Union(objRngGrp, objCell)
  17. Else '100個目のセル'
  18. Set objRngGrp = Application.Union(objRngGrp, objCell)
  19. Call setColorWithXml(objRngGrp, Application.Range("キーワードリスト"))
  20. Set objRngGrp = Nothing
  21. End If
  22. Next
  23. '100個に満たなかった最後のセル'
  24. If Not objRngGrp Is Nothing Then
  25. Call setColorWithXml(objRngGrp, Application.Range("キーワードリスト"))
  26. End If
  27. End Sub
  28.  
  29.  
  30. 'XMLレベルでセル内の文字色(&Bold)を設定するプロシージャ'
  31. '検索文字列が重複している場合は正常動作しません'
  32. Private Sub setColorWithXml(ByVal objRngGrp As Range, ByVal objRngFindString As Range)
  33. Const FONT_ST = "<Font html:Color=""#[COLOR]"">"
  34. Const FONT_ED = "</Font>"
  35. Const B_ST = "<B>"
  36. Const B_ED = "</B>"
  37. Dim objRng As Range
  38. Dim strXml As String
  39. 'XMLデータ取得'
  40. strXml = objRngGrp.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet)
  41. '先にData要素を置換(リテラル決め打ち)'
  42. strXml = Replace(strXml, "<Data ss:Type=""String"">", _
  43. "<ss:Data ss:Type=""String"" xmlns=""http://www.w3.org/TR/REC-html40"">")
  44. strXml = Replace(strXml, "</Data>", "</ss:Data>")
  45. '検索文字分ループ'
  46. For Each objRng In objRngFindString.Cells
  47. Dim strRep As String
  48. Dim lngColor As Long
  49. 'HTMLカラーに変換'
  50. With objRng.Font
  51. lngColor = (.Color And &HFF) * (2 ^ 16)
  52. lngColor = lngColor + (.Color And &HFF00&)
  53. lngColor = lngColor + ((.Color And &HFF0000) / (2 ^ 16))
  54. End With
  55. 'タグ生成'
  56. strRep = Replace(FONT_ST, "[COLOR]", Right(String(6, "0") & Hex(lngColor), 6))
  57. If objRng.Font.Bold Then strRep = strRep & B_ST
  58. strRep = strRep & objRng.Value
  59. If objRng.Font.Bold Then strRep = strRep & B_ED
  60. strRep = strRep & FONT_ED
  61. '置換処理'
  62. strXml = Replace(strXml, objRng.Value, strRep)
  63. Next
  64. 'XMLデータを書き戻す'
  65. objRngGrp.Value(XlRangeValueDataType.xlRangeValueXMLSpreadsheet) = strXml
  66. End Sub


0 件のコメント:

コメントを投稿

リマインドメール自動送信

お久しぶりです! 1回目のワクチンがほとんど副反応なかったので調子乗ってたら2回目のワクチンで副反応出まくったなんプロです。 約3ヶ月ぶりの動画投稿になっちゃいました😅 いや~、ここまで面倒くさがり屋だと病気なのかな?😆 前回の動画のPowerAutomateやVBScrip...