Разделить Фамилию Имя и Отчество в запросе на доступ - PullRequest
1 голос
/ 01 марта 2020

У меня есть Полное имя Поле, которое я хотел бы разделить и удалить второе имя из имени.

Имена похожи на:

Смит, Джеймс D -> Результат будет : Смит, Джеймс

Доу, Джон Сноу -> Результат будет: Доу, Джон

Вот что я сделал, но не уверен, что мне не хватает, чтобы удалить отчество

FName: Mid([Employee] & "",InStr(1,[Employee] & " ",",")+1)
Lname: Left([Employee] & "",InStr(1,[Employee] & "",",")+(InStr(1,[Employee] & "",",")>0))  

Смит, Джеймс Д -> Я получаю -> FName: Джеймс Д

Доу, Джон Сноу -> Я получаю -> FName: Джон Сноу

Ответы [ 3 ]

3 голосов
/ 01 марта 2020

Согласованность структуры имеет решающее значение при манипулировании строками. Предполагая, что всегда будет 3 и только 3 части для каждого имени, а 3-я часть - отчество / инициал и после запятой нет пробелов, рассмотрим:

LastFirst: Left([Employee], InStrRev([Employee]," ")-1)

Last: Left([Employee], InStr([Employee],",")-1)

First: Mid(Left([Employee], InstrRev([Employee]," ")-1), Instr([Employee],",")+1)

Middle: Mid([Employee], InStrRev([Employee], " ")+1)

Если какое-либо из предположений не выполняется, то создайте пользовательскую функцию VBA. Например, чтобы разрешить отсутствие среднего инициала / имени:

Function GetNamePart(strPart As String, strName As String) As Variant
Select Case StrPart
   Case "Last" 
      GetNamePart = Left(strName, InStr(strName,",")-1)
   Case "First"
      If InStrRev(strName, " ") > 0 Then
         GetNamePart = Mid(Left([Employee], InstrRev([Employee]," ")-1), Instr([Employee],",")+1)
      Else
         GetNamePart = Mid(strName, InStr(strName, ",")+1)
      End If 
   Case "Middle"
      If InStrRev(strName, " ") > 0 Then
         GetNamePart = Mid([Employee], InStrRev([Employee], " ")+1)
      Else
         GetNamePart = Null
      End If
End Select
End Function

Вызовите эту функцию из запроса или текстового поля, например: GetNamePart("Last",[Employee])

Чем больше отклонений от предположений, тем сложнее код. Достаточно вариаций, и это может стать практически невозможным для автоматизации.

Существует более одного способа структурировать этот код. Может быть полезен объект Array или Collection.

1 голос
/ 03 марта 2020

Следующая простая функция удаляет второе имя и возвращает только фамилию и имя, даже если в полном имени нет среднего имени или нескольких средних имен:

Public Function FixName(fullName) As String
    Dim last() As String
    Dim first() As String

    last = Split(fullName, ",")
    FixName = last(0)

    first = Split(last(1), " ")
    FixName = FixName & ", " & first(0)
End Function
0 голосов
/ 03 марта 2020

Не проверял, но не подойдет ли это вам? Внутри функции vba publi c.

'First word being first name
FName= split([employee], ",")(0)

'Second word being the last name. This will throw `indexOutOfRange` error if employee name is only one word. Use `on error resume next` to silently ignore?
LName = split(replace([employee], ",", " "))(1) 

Вы не можете использовать разделение напрямую в ms доступ sql, но это не мешает вам создать пользовательскую функцию разделения.

Public function FnSplit(text as variant, index as integer, optional d as string = " ") as string
    If nz(len(text),0) = 0 then exit function
    On error resume next
    FnSplit = split(text,d)(index)
End function

И используйте в своем sql

Select
   FnSplit([employee],0) as fName,
   FnSplit(replace([employee], ",", " "),1) as lName 
From
   Your table

Очевидно, что это просто еще один способ выполнить ту же работу, что и предыдущие ответы

...