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
我收到一份报告,其中有一个包含用户角色和相应用户信息的多值字段。一共有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