MS Access查找并突出显示与长文本字段中的任何表列列表值匹配的多个子字符串

时间:2019-03-05 13:39:23

标签: html ms-access access-vba richtextbox

我是一个尝试制定策略的初学者。

样本数据 表:成分 字段: FormulaIngredients 字段内容(长文本,纯文本):大头菜,韭菜,胡萝卜,小麦,面粉,黄油,糖,鸡蛋,牛奶,花生酱,玉米地面粗粉,全麦燕麦,白菜,姜黄,丁香,香料,天然牛肉风味,碎牛肉。

:受限制的表 具有100个要比较的值的列:RestrictedItem 示例列值: 牛奶 烘烤 勺 萝卜 芥末 蒸汽

所需结果:想要突出显示/更改FormulaIngredients字段中与表列中任何〜100值匹配的匹配字体:RestrictedItem。想象一下斜体字是红色的。

大头菜,韭菜,胡萝卜,小麦,面粉,黄油,糖,鸡蛋,牛奶,花生酱,碎玉米粉,全谷物燕麦,白菜,姜黄,丁香,香料,天然牛肉风味,碎牛肉,芥末酱。

或者,将FormulaIngredients的内容复制并替换到新字段,该字段将红色应用于与“表列:RestrictedItem”相匹配的单词。

我已经探索过...

InStr 问题:我不想将信息字符串传递给表单/报表,也不想在乎该子字符串的位置,我想找到所有这些,无论如何都可以。

Dim strTemp, strTempEnd As String
Dim strSearch As String

strSearch = Me.OpenArgs

If InStr(1, Me.Text0, strSearch) <> 0 Then
    strTemp = Left(Me.Text0, InStr(1, Me.Text0, strSearch) - 1)
    strTempEnd = Mid(Me.Text0, Len(strTemp) + Len(strSearch) + 1)
    strTemp = strTemp & "<font color=red>" & strSearch & "</font>"
    strTemp = strTemp & strTempEnd

    Me.Text0 = strTemp
End If

HTML 问题:该解决方案比较2列数据。我想将一个字段与一个值表进行比较,并在一个Long Text字段中找到多个匹配项。

    Public Function MyCompare(c1t As Variant, c2t As Variant)

  Dim strResult    As String
  Dim s        As String
  Dim i        As Integer
  Dim bolSame     As Boolean

  If IsNull(c1t) Or IsNull(c2t) Then Exit Function

  bolSame = True

  For i = 1 To Len(c2t)
   s = Mid(c2t, i, 1)
   If Mid(c1t, i, 1) = s Then
    If bolSame = False Then
      bolSame = True
      s = "</strong></font>" & s
     End If
   Else
     If bolSame = True Then
      bolSame = False
      s = "<font color=red><strong>" & s
     End If
   End If
   strResult = strResult & s
  Next

  If bolSame = False Then
   strResult = strResult & "</strong></font>"
  End If
  MyCompare = strResult

End Function

VBA 问题:我必须在我的长文本表单字段中输入要比较/搜索的表中的所有100个关键字,而REPLACE是区分大小写的搜索。有没有办法与值表进行比较?

Me.{ControlName}.Value = Replace(Me.{ControlName}.Value _
                               , "red", "<font color=red>red</font>")

1 个答案:

答案 0 :(得分:0)

建议的VBA程序:

  1. 打开RestrictedTable的记录集

  2. 遍历记录集并在“成分”表上运行UPDATE操作SQL

示例:

Dim db As DAO.Database  
Dim rs As DAO.Recordset  
Set db = CurrentDb  
Set rs = db.OpenRecordset("SELECT * FROM RestrictedTable")  
Do While Not rs.EOF  
    db.Execute "UPDATE Ingredients SET FormulaIngredients = Replace([FormulaIngredients], '" & rs!RestrictedItem & "', '<font color=red>" & rs!RestrictedItem & "</font>')"  
    rs.MoveNext  
Loop

我使用静态参数进行了快速测试,并且可以正常工作。

CurrentDb.Execute "UPDATE Ingredients SET FormulaIngredients = Replace([FormulaIngedients], 'carrots', '<font color=red>carrots</font>')"

公式文本是否具有CARROTScarrotsCArRoTs都无关紧要-都将匹配并替换为carrots。但是,如果公式文本具有carrot,则将不匹配。

可能不需要担心部分匹配,但是如果要确保仅更改整个单词,请在搜索前后使用空格并替换字符串:' carrots '。除非您要突出显示milk中的buttermilk

如果您不想更改原始数据,请首先复制到另一个字段,然后在UPDATE语句中使用该另一个字段。这可以通过在Do While块之前使用UPDATE语句来完成。

db.Execute "UPDATE Ingredients SET FormulaHighlight=FormulaIngredients"