Использование регулярных выражений
Если бы вы использовали регулярные выражения, вам нужно было бы определить функцию VBA для создания экземпляра объекта RegExp, установить для свойства pattern
что-то вроде \s\d\s
(whitespace-di git -пробел), а затем вызовите метод Execute
, чтобы получить совпадение (или совпадения), каждый из которых предоставит индекс шаблона в строке. Если вы хотите следовать этому маршруту, здесь - это некоторые существующие примеры для Excel, но манипуляции с RegExp будут идентичны в MS Access.
Вот пример функции, демонстрирующей, как использовать первый результат, возвращаемый методом Execute
:
Public Function RegexInStr(strStr As String, strPat As String) As Integer
With New RegExp
.Multiline = False
.Global = True
.IgnoreCase = False
.Pattern = strPat
With .Execute(strStr)
If .Count > 0 Then RegexInStr = .Item(0).FirstIndex + 1
End With
End With
End Function
Обратите внимание, что в вышеприведенном примере используется раннее связывание, поэтому вам необходимо добавить ссылку на библиотеку Microsoft VBScript Regular Expressions 5.5 в свой файл. project.
Пример оценки немедленного окна:
?InStr("abc 1 123", " 1 ")
4
?RegexInStr("abc 1 123", "\s\w\s")
4
Использование InStr
Альтернатива с использованием встроенного instr
Функция в запросе может быть следующим не элегантным (и, вероятно, очень медленным) запросом:
select
switch
(
instr(rsLegacyList.F1," 0 ")>0,instr(rsLegacyList.F1," 0 ")+1,
instr(rsLegacyList.F1," 1 ")>0,instr(rsLegacyList.F1," 1 ")+1,
instr(rsLegacyList.F1," 2 ")>0,instr(rsLegacyList.F1," 2 ")+1,
instr(rsLegacyList.F1," 3 ")>0,instr(rsLegacyList.F1," 3 ")+1,
instr(rsLegacyList.F1," 4 ")>0,instr(rsLegacyList.F1," 4 ")+1,
instr(rsLegacyList.F1," 5 ")>0,instr(rsLegacyList.F1," 5 ")+1,
instr(rsLegacyList.F1," 6 ")>0,instr(rsLegacyList.F1," 6 ")+1,
instr(rsLegacyList.F1," 7 ")>0,instr(rsLegacyList.F1," 7 ")+1,
instr(rsLegacyList.F1," 8 ")>0,instr(rsLegacyList.F1," 8 ")+1,
instr(rsLegacyList.F1," 9 ")>0,instr(rsLegacyList.F1," 9 ")+1,
true, null
) as intMarkerLocation
from
rsLegacyList
where
rsLegacyList.F1 like "* # *"