MS Access 根据条件从多值字段中提取元素

MS Access extracting elements from multi-valued field based on condition

我收到一份报告,其中有一个包含用户角色和相应用户信息的多值字段。一共有6个角色,每行数据可以有多个人在同一个角色下操作。我正在使用 MS Access 2013 进行数据操作。

ID  Data    Users
1   Data1   Supervisor (MICROSOFT OUTLOOK; microsoftoutlook@example.com 9999999999) Admin Assistant (WATER BOTTLE; waterbottle@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999)
2   Data2   Supervisor (COMPUTER MONITOR; computermonitor@example.com; 9999999999) Admin Assistant (MICROSOFT EXCEL; microsoftexcel@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999); Analyst (ORANGE PURPLE; orangepurple@example.com; 999999991)
3   Data3   Supervisor (GREEN BLUE; greenblue@example.com; 9999999999) Admin (MICROSOFT ACCESS; microsoftaccess@example.com, 9999999999) Analyst (ORANGE PURPLE; orangepurple@example.com; 999999999); Analyst (YELLOW BLACK; yellowblack@example.com; 999999991)

以上是截断和替换的数据集。在 ID = 2 和 3 中,有 2 位分析师。可能会有 2 "Admin Assistants" 的情况。 Users 的格式与列出的完全相同。个别用户也可以跨多行列出,有时也可以在不同的角色下列出。

我不一定需要拆分数据,但我确实需要根据 Data 列挑选出某些角色。如果Data = [Certain Condition],则拉入某个用户角色。例如,如果 Data = "Completed",我需要提取该行的所有 "Supervisors"。如果 Data = "In progress",我需要提取该行的所有 "Analysts"。还有其他条件用于确定要拉取哪个角色和用户。我需要为该行提取用户角色和与该角色关联的用户。我想为 "Ownership Role" 和 "Current Ownership" 创建 2 个新列。 "Ownership Role" 是用户角色,"Current Ownership" 应该包含与该行的该角色关联的所有用户。

如果您有任何问题或需要任何说明,请告诉我。感谢您花时间阅读本文。

更新

下面是我想要的结果。

ID  Data    Ownership Role  Current Ownership   Users
1   Completed   Supervisor  MICROSOFT OUTLOOK   Supervisor (MICROSOFT OUTLOOK; microsoftoutlook@example.com 9999999999) Admin Assistant (WATER BOTTLE; waterbottle@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999)
2   In Progress Analyst GREEN BLUE, ORANGE PURPLE   Supervisor (COMPUTER MONITOR; computermonitor@example.com; 9999999999) Admin Assistant (MICROSOFT EXCEL; microsoftexcel@example.com, 9999999999) Analyst (GREEN BLUE; greenblue@example.com; 999999999); Analyst (ORANGE PURPLE; orangepurple@example.com; 999999991)
3   Initiated   Admin   MICROSOFT ACCESS    Supervisor (GREEN BLUE; greenblue@example.com; 9999999999) Admin (MICROSOFT ACCESS; microsoftaccess@example.com, 9999999999) Analyst (ORANGE PURPLE; orangepurple@example.com; 999999999); Analyst (YELLOW BLACK; yellowblack@example.com; 999999991)

更新 2019-05-10 由于我未能正确解释问题并设置示例数据集,我将根据 June7 的答案和示例数据行发布案例。

Case "Initiated"
    strRole = "Main Admin Assistant"
Case "Drafted"
    strRole = "Financial Analyst"
Case "Rated"
    strRole = "Contractor Rep"
Case "Reviewed"
    strRole = "Assessing Official"
Case "Finalized"
    strRole = "Reviewing Official"

示例数据 - 这全部在 Excel 中的 1 个单元格中,每个元素在该单元格中的不同行上。在右括号之后,据我所知没有 space,因此下一个用户角色立即开始。

Supervisor (ERGO KB; ergokb@example.com; (999) 999-9999)Team Lead (WIDE SCREEN; widescreen@example.com; 9999999999)Team Rep (CELL PHONE; cellphone@example.com; 999-999-9999)Team Rep (CLICK PEN; clickpen@example.com; (999) 999-9999)Main Admin Assistant (WIRED MOUSE; wiredmouse@example.com; 999-999-9999)Main Admin Assistant (PHONE CHARGER; phonecharger@example.com; 9999999999)Financial Analyst (WATER BOTTLE; waterbottle@example.com; (999) 999-9999)Financial Analyst (CLEAR TAPE; cleartape@example.com; 999-999-9999)Human Resources (POST IT NOTE; postitnote@example.com; 999-999-9999)

对于下面的每个状态,我想要关联的用户角色。

Status      User Role
Initiated   Main Admin Assistant
Drafted     Financial Analyst
Rated       Team Rep
Reviewed    Financial Analyst
Finalized   Human Resources
Completed   Completed

真正想要的结果

Status      User Role               Users
Initiated   Main Admin Assistant    WIRED MOUSE, PHONE CHARGER
Drafted     Financial Analyst       WATER BOTTLE, CLEAR TAPE
Rated       Team Rep                CELL PHONE, CLICK PEN
Reviewed    Financial Analyst       WATER BOTTLE, CLEAR TAPE
Finalized   Human Resources         POST IT NOTE
Completed   Completed               Completed

解析字符串时,结构的一致性至关重要。例如,在 ID 2 和 3 的最后两个元素之间有一个 semi-colon after ),但在其他元素之后没有 semi-colon。额外的 semi-colon 使编程逻辑复杂化。由于评论说 semi-colon 是一个拼写错误,并且后面没有 space),代码反映了结构中的这些更正。

这是一个让您入门的函数。将此过程放在通用模块中,可以从查询或文本框调用它。

Function GetUsers(strData As String, strUsers As String) As String
Dim aryS As Variant, x As Integer, strRole As String, strNames As String
aryS = Split(strUsers, ")")
Select Case strData
    Case "Initiated"
        strRole = "Main Admin Assistant"
    Case "Drafted"
        strRole = "Financial Analyst"
    Case "Rated"
        strRole = "Team Rep"
    Case "Reviewed"
        strRole = "Financial Analyst"
    Case "Finalized"
        strRole = "Human Resources"
End Select
For x = 0 To UBound(aryS) - 1
    If strRole = Left(aryS(x), InStr(aryS(x), "(") - 2) Then
        strNames = strNames & Mid(aryS(x), InStr(aryS(x), "(") + 1, InStr(aryS(x), ";") - 1 - InStr(aryS(x), "(")) & ", "
    End If
Next
If strNames <> "" Then GetUsers = Left(strNames, Len(strNames) - 2)
End Function

与其通过数据计算来确定角色,不如建议使用 table 来定义这些关联。在查询中包含 table 然后将 Role 传递给函数而不是数据,并且不需要 Case 块。

修改代码以处理不一致的 phone 数字结构,该数字结构有时会导致以前的代码失败以及相似角色名称的可能性(我可能应该以这种方式开始):

Function GetUsers(strData As String, strUsers As String) As String
Dim strRole As String, strNames As String
Select Case strData
    Case "Initiated"
        strRole = "Main Admin Assistant ("
    Case "Drafted"
        strRole = "Financial Analyst ("
    Case "Rated"
        strRole = "Team Rep ("
    Case "Reviewed"
        strRole = "Financial Analyst ("
    Case "Finalized"
        strRole = "Human Resources ("
    Case "Completed"
        strRole = "Financial Analyst Jr ("
End Select
Do While InStr(strUsers, strRole) > 0
    strUsers = Mid(strUsers, InStr(strUsers, strRole))
    strNames = strNames & Mid(strUsers, InStr(strUsers, "(") + 1, InStr(strUsers, ";") - Len(strRole) - 1) & ", "
    strUsers = Mid(strUsers, 2)
Loop
If strNames <> "" Then GetUsers = Left(strNames, Len(strNames) - 2)
End Function