Solved

Creating multiple worksheets using AD data

Posted on 2009-04-01
8
427 Views
Last Modified: 2012-05-06
Looking for a script that will run through an OU extract the users and place them on separate worksheets within a single workbook based on department name.
0
Comment
Question by:WaywardS0n
  • 5
  • 3
8 Comments
 
LVL 65

Expert Comment

by:RobSampson
Comment Utility
Hi there.

This will hopefully do the job for you, so far without saving or closing the resultant Excel file.

If you want that done, let me know.

For this to work for your particular OU, you'll need to set this line
Set objOU = GetObject("LDAP://OU=TestUsers,OU=TestOU," & strDNSDomain)

to match your OU path, in reverse order.  For example, the above refers to
domain.com/TestOU/TestUsers

Regards,

Rob.
Set objRootDSE = GetObject("LDAP://RootDSE")

strDNSDomain = objRootDSE.Get("defaultNamingContext")

Set objOU = GetObject("LDAP://OU=TestUsers,OU=TestOU," & strDNSDomain)

objOU.Filter = Array("User")

Set objList = CreateObject("Scripting.Dictionary")

For Each objUser In objOU

	strDept = UCase(objUser.Department)

	If objList.Exists(strDept) = True Then

		objList(strDept) = objList(strDept) & ";" & objUser.samAccountName

	Else

		objList.Add strDept, objUser.samAccountName

	End If

Next

Set objExcel = CreateObject("Excel.Application")

objExcel.Visible = True

Const xlUp = -4162

Set objWB = objExcel.Workbooks.Add

While objWB.Sheets.Count > 1

	objWB.Sheets(objWB.Sheets.Count).Delete

Wend

For Each strDept In objList

	If objWB.Sheets(1).Name = "Sheet1" Then objWB.Sheets(1).Name = strDept

	boolSheetFound = False

	For intSheet = 1 To objWB.Sheets.Count

		If objWB.Sheets(intSheet).Name = strDept Then

			boolSheetFound = True

			Exit For

		End If

	Next

	If boolSheetFound = False Then

		objWB.Sheets.Add , objWB.Sheets(objWB.Sheets.Count)

		objWB.Sheets(objWB.Sheets.Count).Name = strDept

	End If

	intLastRow = objWB.Sheets(strDept).Cells(65536, 1).End(xlUp).Row

	If intLastRow = 1 Then

		objWB.Sheets(strDept).Cells(intLastRow, 1).Value = "Username"		

	End If

	arrUsers = Split(objList(strDept), ";")

	For Each strUser In arrUsers

		intLastRow = intLastRow + 1

		objWB.Sheets(strDept).Cells(intLastRow, 1).Value = strUser

	Next

Next

Open in new window

0
 

Author Comment

by:WaywardS0n
Comment Utility
The problem I'm having is it appears objOU is returning an empty collection.
I'm sure the ldap path is correct as I use it in a miriad of other scripts.
(w,x,y,z are used for obscurity)

--------------------------------------------------------------------
Set objOU = GetObject("LDAP://ou=WAMC,ou=NARMC,dc=wwww,dc=xx,dc=yyyy,dc=zzz")
objOU.Filter = Array("user")
wscript.echo objOU.count
Set objList = CreateObject("Scripting.Dictionary")
For Each objUser In objOU
  strDept = UCase(objUser.Department)
  wscript.echo strDept
--------------------------------------------------------------------
I'm using the 1st wscript.echo  to try to show number of items returned by the query.
that wscript.echo line returns an error 8004001 error: Not Implemented.

The 2nd wscript.echo is used to see if I actually have a value in strDept. The script never sees that line. I'm still working with it.
Any help would be appreciated.
0
 
LVL 65

Expert Comment

by:RobSampson
Comment Utility
Hmmm, OK, without filtering the OU then, let's see what "class" of objects are in there....

Set objOU = GetObject("LDAP://ou=WAMC,ou=NARMC,dc=wwww,dc=xx,dc=yyyy,dc=zzz")
objOU.Filter = Array("user")
For Each objUser In objOU
   WScript.Echo objUser.Name & " - " & objUser.Class
Next

I've never had much success with the Count property. I just loop through it an increment a manual counter....

Regards,

Rob.
0
 
LVL 65

Accepted Solution

by:
RobSampson earned 500 total points
Comment Utility
Oh, I wasn't meant to include the filter.....

Set objOU = GetObject("LDAP://ou=WAMC,ou=NARMC,dc=wwww,dc=xx,dc=yyyy,dc=zzz")
For Each objUser In objOU
   WScript.Echo objUser.Name & " - " & objUser.Class
Next

Regards,

Rob.
0
Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

 

Author Comment

by:WaywardS0n
Comment Utility
Thank you for your assistance. While I had to tweak the code, it did the tricks. Another outstanding job.. Thanks...
0
 
LVL 65

Expert Comment

by:RobSampson
Comment Utility
No problem. Thanks for the grade.

So did you end up having to use
If objUser.Class = "user" Then

??

Regards,

Rob.
0
 

Author Comment

by:WaywardS0n
Comment Utility
Actually I just made a SQL call through LDAP to AD (instead of the getobject) and then fed the record set into the scripting dictionary and your code did the rest! By using SQL I was able to filter and sort before feeding the data into the dictionary. I'm sure your way works great and I'm not saying my way is better. Sometimes we have to go with what we are familiar with. I was stuck on a clean way to add, rename and populate the individual sheets. The method you laid out was simple, clean and efficient.
0
 
LVL 65

Expert Comment

by:RobSampson
Comment Utility
LOL!  No problem at all!  Good thinking!

Regards,

Rob.
0

Featured Post

Highfive Gives IT Their Time Back

Highfive is so simple that setting up every meeting room takes just minutes and every employee will be able to start or join a call from any room with ease. Never be called into a meeting just to get it started again. This is how video conferencing should work!

Join & Write a Comment

Recently I finished a vbscript that I thought I'd share.  It uses a text file with a list of server names to loop through and get various status reports, then writes them all into an Excel file.  Originally it was put together for our Altiris server…
Welcome back!  My apologies for taking so long to write part two of this series; it's been a long time coming!  As I promised in Part 1, this article will focus on how to locate those elusive AD properties that you are searching for.  Why is this us…
Polish reports in Access so they look terrific. Take yourself to another level. Equations, Back Color, Alternate Back Color. Write easy VBA Code. Tighten space to use less pages. Launch report from a menu, considering criteria only when it is filled…
When you create an app prototype with Adobe XD, you can insert system screens -- sharing or Control Center, for example -- with just a few clicks. This video shows you how. You can take the full course on Experts Exchange at http://bit.ly/XDcourse.

743 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question

Need Help in Real-Time?

Connect with top rated Experts

16 Experts available now in Live!

Get 1:1 Help Now