提取名字和姓氏

时间:2019-03-25 19:43:52

标签: ms-access

我在表中有一个全名的数据。这些名称包含“姓氏,名字中间名”,我需要从全名中提取名字,姓氏和中间名并将它们存储在不同的字段中。

例如,我在表中的全名是-

  • 威廉姆斯,罗伯特·克

  • 温彻斯特(Sam T)

我需要将它们存储为

FirstName        Last_Name       MName
Robert            Williams         K
Sam               Winchester       T

我正在女士访问权限的某些表上执行此操作。谁能帮我实现这个目标。

2 个答案:

答案 0 :(得分:0)

您可以执行此操作,但前提是您的数据一致。

威廉姆斯,罗伯特

罗伯特

那么,每个全名都输入得很好吗?以我的经验,这是非常罕见的。

因此,这里面临的挑战不是代码或将全部3个部分拆分出来的更新,而是处理没有全部3个设置的数据。

以下代码应该可以工作,并且会尝试处理丢失的部分,但是该代码的工作方式在很大程度上取决于全名数据的质量和一致性。

因此,此代码可以放在标准代码模块中,并将每一行数据处理到字段中。您可以将光标放在代码模块中的任何位置,然后按f5键,它将运行。

我很强烈(但实际上很强)建议您在数据库副本上测试他的代码,以防万一将数据弄得无法修复。

Sub SpltNames()

  Dim rstData    As DAO.Recordset
  Dim strTable   As String

  Dim vBuf       As Variant        ' array to hold 3 parts
  Dim vBuf2      As Variant        ' for first and middle initials

  Set rstData = CurrentDb.OpenRecordset("tblCustomers")

  Do While rstData.EOF = False

     rstData.Edit

     ' split the 3 parts into the 3 fields.
     If InStr(rstData!FullName, ",") = 0 Then
        ' name has no , so assume just a last name
        rstData!Last_name = Trim(rstData!FullName)
     Else
        ' data has a , - split into parts
        vBuf = Split(rstData!FullName, ",")
        Select Case UBound(vBuf)
           Case 0
              ' no comma, assume just a last name
              rstData!Last_name = vBuf(0)
           Case 1
              ' 2 values, like Kallal, Albert, or Kallal, Albert D.
              rstData!Last_name = Trim(vBuf(0))

              ' take second part, and check for space for middle
              vBuf2 = Split(Trim(vBuf(1)), " ")

              Select Case UBound(vBuf2)
                 Case 0
                    ' no middle, just take first name
                    rstData!FirstName = Trim(vBuf2(0))
                 Case 1
                    ' a space between first and middle, save both
                    rstData!FirstName = Trim(vBuf2(0))
                    rstData!MName = Trim(vBuf2(1))
              End Select
        End Select
    End If
    rstData.Update    ' save data
    rstData.MoveNext  ' move on to next recod
 Loop

 rstData.Clone

 MsgBox "done processing"


End Sub

答案 1 :(得分:0)

这是非VBA解决方案的尝试:

YourTable

更改+--------------------+ | Name | +--------------------+ | Williams, Robert K | | Winchester, Sam T | | Smith, John | | Jack A | | Harry | | ,Thomas T | +--------------------+ 以适合您的表名。

假设

  • 如果没有逗号,则表示该名称是名字(可能是中间名)。

  • 假定中间的首字母始终为1个字符

示例

给出示例数据:

+--------+------------+-------+
| FName  |   LName    | MName |
+--------+------------+-------+
| Robert | Williams   | K     |
| Sam    | Winchester | T     |
| John   | Smith      |       |
| Jack   |            | A     |
| Harry  |            |       |
| Thomas |            | T     |
+--------+------------+-------+

上面的查询将产生:

{{1}}