用户权限数据转换为用户组列表(1/3) - VBA

实例需求:如下是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公式

你可能感兴趣的:(数据清洗,数组,VBA,数量整理,数据清洗,用户列表,合并数据,分组合并)