实例需求:如下是AD用户的列表,每个用户拥有该应用程序的只读或读写权限,现在需要创建新的AD用户组,并根据用户当前的权限,将这些用户添加到相应的组中。
当前数据集:
Safe | UserName | Read permissions | RW permissions |
---|---|---|---|
Safe1 | User1 | Yes | Yes |
Safe1 | User2 | Yes | No |
Safe1 | User3 | Yes | Yes |
Safe1 | User4 | Yes | No |
Safe2 | User1 | Yes | Yes |
Safe2 | User2 | Yes | No |
Safe2 | User3 | Yes | Yes |
Safe2 | User4 | Yes | No |
整理后输出数据集:
Safe | AD | Group Userlist |
---|---|---|
Safe1 | Safe1-ReadGroup | User1,User2,User3,User4 |
Safe1 | Safe1-RWGroup | User1,User3 |
Safe2 | Safe2-ReadGroup | User1,User2,User3,User4 |
Safe2 | Safe2-RWGroup | User1,User3 |
Sub demo()
Dim aData, Dic, sPerm, sKey, i
Dim oSht As Worksheet, sShtName As String
aData = Sheets("Sheet1").[a1].CurrentRegion.Value
Set Dic = CreateObject("scripting.dictionary")
For i = 2 To UBound(aData)
If aData(i, 3) = "Yes" Then
sKey = aData(i, 1) & "-ReadGroup"
If Dic.Exists(sKey) Then
Dic(sKey) = Dic(sKey) & "," & aData(i, 2)
Else
Dic(sKey) = aData(i, 2)
End If
End If
If aData(i, 4) = "Yes" Then
sKey = aData(i, 1) & "-RWGroup"
If Dic.Exists(sKey) Then
Dic(sKey) = Dic(sKey) & "," & aData(i, 2)
Else
Dic(sKey) = aData(i, 2)
End If
End If
Next i
sShtName = "Output"
On Error Resume Next
Set oSht = Sheets(sShtName)
On Error GoTo 0
If oSht Is Nothing Then
Set oSht = Sheets.Add
oSht.Name = "Output"
Else
oSht.Cells.Clear
oSht.Select
End If
[a1:c1] = Array("Safe", "AD Group", "UserList")
aData = Dic.keys
Range("B2").Resize(Dic.Count, 1).Value = Application.Transpose(aData)
Range("C2").Resize(Dic.Count, 1).Value = Application.Transpose(Dic.items)
For i = 0 To UBound(aData)
aData(i) = Split(aData(i), "-")(0)
Next
Range("A2").Resize(Dic.Count, 1).Value = Application.Transpose(aData)
Columns("A:C").EntireColumn.AutoFit
End Sub
【代码解析】
第4行代码将原始数据读取到数组中。
第5行代码创建字典对象以保存数据。
第6~23行循环处理每行数据。
第7~14行代码根据Read permissions
列,并将用户名添加到对应键的值中。
第8行代码判断用户是否具备读Read permissions
权限。
第9行代码判断字典对象中是否已经有相应的用户组。
- 如果存在,第10行代码将用户追加到用户列表中。
- 如果不存在,第10行代码将创建新用户组,并将用户添加到用户列表中。.
与此类似,第15~22行代码根据RW permissions
列,并将用户名添加到对应键的值中。
第24行代码设置输出工作表名称。
第25~34行代码查结果输出表是否存在,不存在则创建新表。
第35行代码向结果表写入表头。
第36行代码获取字典的键列表。
第37行代码将键列表写入结果表AD列。
第38行代码将字典的值列表写入结果Group Userlist列。
第39~41行代码从字典键值中提取Safe列信息。
第42行代码将Safe列写入输出表。
第43行代码设置自动列宽。
小结:
当需要对数据进行分组处理时,字典对象是一个很好的选择。使用字典对象可以方便地按照键值存储分组信息,通过拼接键的方式可以灵活生成不同的分组。
相关系列博文链接:
用户权限数据转换为用户组列表(1/3) - VBA
用户权限数据转换为用户组列表(2/3) - Power Query
用户权限数据转换为用户组列表(3/3) - Excel PY公式