MS Access находит и выделяет несколько подстрок, которые соответствуют любому значению списка столбцов таблицы в длинном текстовом поле - PullRequest
0 голосов
/ 05 марта 2019

Я новичок, пытающийся выяснить стратегию.

Пример данных Таблица: Ингредиенты Поле: FormulaIngredients Содержание поля (длинный текст в формате RTF): брюква, лук-порей, морковь, пшеница, мука, масло, сахар, яйца, молоко, арахисовое масло, кукурузная мука из цельного зерна, овсяное зерно, капуста, куркума, гвоздика , специи, натуральный говяжий аромат, говяжий фарш.

Таблица: RestrictedTable Столбец с 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 столбца данных. Я хочу сравнить одно поле с таблицей значений и найти несколько совпадений в одном длинном текстовом поле.

    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 ключевых слов в моей таблице, которые я хочу сравнить / найти в поле формы длинного текста, а ЗАМЕНА - поиск с учетом регистра , Есть ли способ сравнить с таблицей значений?

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

1 Ответ

0 голосов
/ 05 марта 2019

Предложите процедуру VBA, которая:

  1. открывает набор записей RestrictedTable

  2. циклически перебирает набор записей и запускает действие UPDATE SQL для таблицы Ingredients

Пример:

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>')"

Не имеет значения, если текст формулы имеет CARROTS, carrots, CArRoTs - все совпадут и будут заменены на carrots. Однако если текст формулы имеет carrot, он не будет совпадать.

Частичное совпадение может не вызывать беспокойства, но если вы хотите быть уверенным в изменении только целых слов, используйте пробел до и после поиска и заменяйте строки: ' carrots '. Если вы не хотите, чтобы milk в buttermilk были выделены.

Если вы не хотите изменять исходные данные, сначала скопируйте в другое поле, а затем используйте это другое поле в инструкции UPDATE. Это можно сделать с помощью оператора UPDATE перед блоком Do While.

db.Execute "UPDATE Ingredients SET FormulaHighlight=FormulaIngredients"

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...