VBA代码通过Windows登录用户ID自动过滤数据?

时间:2015-04-07 00:09:01

标签: excel vba excel-vba

我获得了运行sql server存储过程的VBA代码,将数据导入excel。

EX:Excel数据:

Id     Division     Department     Scale
1      North        IT             8.5
2      South        Finance        8.0
3      North        Finance        8.0
4      West         IT             8.5
5      East         Finance        8.0
6      South        IT             8.5

现在我的情况是:

如果North中的一个用户运行VBA宏,则excel结果应仅显示Division北。如果来自South的用户运行VBA宏,则excel结果应仅显示Division南。

EX:如果来自South的一个用户运行VBA宏,则结果如

Id     Division     Department     Scale
2      South        Finance        8.0
6      South        IT             8.5

如何按Division设置用户以过滤VBA中的数据。

我的用户数量有限,大多数是4-6位用户。有没有办法使用他们的Windows凭据来过滤excel中的数据,通过在VBA中添加一些代码?

任何帮助?

3 个答案:

答案 0 :(得分:3)

由于您拥有少量用户,因此您可以直接在VBA项目中对其进行硬编码。为此,我将使用Dictionary对象。字典是一种将数据存储在键值对中的方法。

让我们深入研究一些代码。

Sub Test()

    Dim dict As Object
    Dim key As Variant
    Dim user As String
    Dim region As String

    Set dict = CreateObject("Scripting.Dictionary")

    'Add your username / region
    'pairs to the dictionary object
    dict.Add "user1", "South"
    dict.Add "user2", "North"
    dict.Add "user3", "South"
    dict.Add "user4", "West"
    '.. etc

    'Get the username of the currently logged-in person
    user = Environ("username")

    'Loop through dictionary to find the
    'region which matches the username
    For Each key In dict.Keys
        If key = user Then
            region = dict.Item(key)
        End If
    Next key

    'If the username is not found, we should
    'exit the subroutine.  You could display
    'a messagebox or something similar
    If region = vbNullString Then
        MsgBox "Invalid username!", vbCritical, "Invalid Username"
        Exit Sub
    End If

    'From hereon out you would do as you
    'normally do, passing in the variable
    'region as one of your parameters


End Sub

如果您不希望用户查看其他用户分配到哪个区域,则应使用密码保护您的VBA代码。您可以转到工具 - >来执行此操作。 VBAProject属性... - >保护并勾选“锁定项目以供查看”框并输入密码。

我应该补充一点,使用这种字典方法有局限性。例如,如果需要将一个用户分配到多个区域,则这将不起作用,因为每个键,值对必须是唯一的。

如果是这种情况,我会考虑处理这个服务器端。您可以创建一个具有用户名,区域对的新sql表。然后,您可以将用户名作为参数传递给SQL存储过程,并使用该参数来控制过程返回的结果。这最终可能更令人满意。

答案 1 :(得分:1)

是的。 Environ(“用户名”)给出了windows登录,对于4-6个用户,你甚至可以硬编码北方和南方的映射,或者当然把它设置为excel中的范围,或者数据库表和查找方式。

答案 2 :(得分:1)

  

您的答案就在Answer

我认为您需要这样的解决方案:

  • 您需要一个至少包含UserNameDirection列的数据集 指定方向的任何用户。

  • 现在您拥有了允许您查找特定用户的UserName = Environ("username")

  • 从您的数据集中找到Direction之后,您应该按照该线索过滤所有工作表,例如隐藏不在该方向的行。

  • 如果您想要一个过滤器使他或她无法访问其他行的文件开启者,您还需要编写一些代码来保护该数据表。

    < / LI>