Solved

Populate Excel sheets based on criteria from import sheet using VBA

Posted on 2016-07-22
7
58 Views
Last Modified: 2016-07-25
I have an excel workbook with a worksheet call "Import".  The data is refreshed from a sharepoint list.  The data structure is similar to this:

ID      Loc      Start Date      End Date      Group
44      CA      5/6/2017      5/8/2017      A
33      TX      6/8/2017      6/10/2017      B
34      NM      9/1/2017      9/3/2017      C
33      DC      9/1/2017      9/3/2017      B
33      TX      6/8/2017      6/10/2017      B
34      NM      9/1/2017      9/3/2017      C
33      DC      9/1/2017      9/3/2017      B
33      TX      6/8/2017      6/10/2017      B
34      NM      9/1/2017      9/3/2017      C
33      DC      9/1/2017      9/3/2017      B

I would like to create VBA to go through each imported row of data and populate 3 additional worksheet tabs (Group A) (Group B) and (Group C) with only the  matching criteria.

For example Worksheet labeled "Group B" be recreated and look like this:

ID Loc      Start Date      End Date      Group
33      TX      6/8/2017      6/10/2017      B
33      DC      9/1/2017      9/3/2017      B
33      TX      6/8/2017      6/10/2017      B
33      DC      9/1/2017      9/3/2017      B
33      TX      6/8/2017      6/10/2017      B
33      DC      9/1/2017      9/3/2017      B

Thanks for any help//suggestions.
0
Comment
Question by:robbdfw
  • 4
  • 3
7 Comments
 
LVL 28

Expert Comment

by:Subodh Tiwari (Neeraj)
ID: 41725277
Please try this...
In the attached, click the button on Import Sheet called Split Data to run the code to get the desired output.
Sub SplitData()
Dim sws As Worksheet, dws As Worksheet
Dim lr As Long, i As Long, j As Long
Dim dict As Object
Dim x, y
Application.ScreenUpdating = False
Set sws = Sheets("Import")
lr = sws.Cells(Rows.Count, 1).End(xlUp).Row
Set dict = CreateObject("Scripting.Dictionary")
x = sws.Range("E2:E" & lr).Value

For i = 1 To UBound(x, 1)
   dict.Item(x(i, 1)) = x(i, 1)
Next i
y = dict.items
For i = 0 To UBound(y)
   With sws.Rows(1)
      On Error Resume Next
      Set dws = Sheets(y(i))
      dws.Cells.cle
      On Error GoTo 0
      If dws Is Nothing Then Sheets.Add(after:=Sheets(Sheets.Count)).Name = "Group " & y(i)
      Set dws = ActiveSheet
      .AutoFilter field:=5, Criteria1:=y(i)
      sws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy dws.Range("A1")
      dws.Columns.AutoFit
      dws.Range("A1").CurrentRegion.Borders.Color = vbBlack
   End With
   Set dws = Nothing
Next i
Set dict = Nothing
sws.AutoFilterMode = 0
sws.Activate
Application.ScreenUpdating = True
End Sub

Open in new window

Split-Data.xlsm
0
 

Author Comment

by:robbdfw
ID: 41725920
Worked like a charm, however when I added additional columns of data I kept getting a VBA 400 error.  I kept the Group in column E, howevered added about 10 columns to the right. Columns F-Column P. Would that be the cause of the problem?
0
 
LVL 28

Expert Comment

by:Subodh Tiwari (Neeraj)
ID: 41725935
No. That shouldn't be the case.
Did you tweak the code at your end?
It would be helpful if you can upload the workbook along with the code in question.
0
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 

Author Comment

by:robbdfw
ID: 41727963
I have attached a worksheet that includes your code as well as a couple of lines with the import tab as it comes in from our share point site.
 
ID      Loc  Start      End          Group
17      TX      7/25/16      8/24/17      A
18      CA      6/24/16      6/29/16      B
19      CA      7/25/16      8/24/17      C
20      TX      6/24/16      6/29/16      D
21      CA      7/25/16      8/24/17      A
22      CA      6/24/16      6/29/16      D
23      TX      7/25/16      8/24/17      B
24      CA      6/24/16      6/29/16      C
25      CA      7/25/16      8/24/17      D
26      TX      6/24/16      6/29/16      D
27      CA      7/25/16      8/24/17      D
28      CA      6/24/16      6/29/16      D
29      TX      7/25/16      8/24/17      D
30      CA      6/24/16      6/29/16      B
31      CA      7/25/16      8/24/17      D
32      TX      6/24/16      6/29/16      C
33      CA      7/25/16      8/24/17      D
34      CA      6/24/16      6/29/16      D
35      TX      7/25/16      8/24/17      D
36      CA      6/24/16      6/29/16      D
37      CA      7/25/16      8/24/17      D
38      TX      6/24/16      6/29/16      D
39      CA      7/25/16      8/24/17      C
40      CA      6/24/16      6/29/16      D
41      TX      7/25/16      8/24/17      D
42      CA      6/24/16      6/29/16      D
43      CA      7/25/16      8/24/17      D
44      TX      6/24/16      6/29/16      D
45      CA      7/25/16      8/24/17      E
SampleData.xlsm
0
 
LVL 28

Accepted Solution

by:
Subodh Tiwari (Neeraj) earned 500 total points
ID: 41728008
The code was not working as your data is formatted as an Excel Table.
Also you need to place this code on a standard module not on ThisWorkbook module as you have done in the sample file.

Please try this.....


Sub SplitData()
Dim sws As Worksheet, dws As Worksheet
Dim lr As Long, i As Long, j As Long
Dim dict As Object
Dim x, y
Dim tbl As ListObject
Application.ScreenUpdating = False
Set sws = Sheets("Import")
lr = sws.Cells(Rows.Count, 1).End(xlUp).Row
Set tbl = sws.ListObjects("Table_owssvr")
Set dict = CreateObject("Scripting.Dictionary")
x = sws.Range("E2:E" & lr).Value

For i = 1 To UBound(x, 1)
   dict.Item(x(i, 1)) = x(i, 1)
Next i
y = dict.items
For i = 0 To UBound(y)
   With tbl.Range
      On Error Resume Next
      Set dws = Sheets(y(i))
      dws.Cells.Clear
      On Error GoTo 0
      If dws Is Nothing Then Sheets.Add(after:=Sheets(Sheets.Count)).Name = "Group " & y(i)
      Set dws = ActiveSheet
      .AutoFilter Field:=5, Criteria1:=y(i)
      sws.Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Copy dws.Range("A1")
      dws.Columns.AutoFit
      dws.Range("A1").CurrentRegion.Borders.Color = vbBlack
   End With
   Set dws = Nothing
Next i
Set dict = Nothing
tbl.Range.AutoFilter Field:=5
sws.Activate
Application.ScreenUpdating = True
End Sub

Open in new window

SampleData.xlsm
1
 

Author Closing Comment

by:robbdfw
ID: 41728227
It worked perfectly!  Thank you for all your help.  I appreciate your assistance.
0
 
LVL 28

Expert Comment

by:Subodh Tiwari (Neeraj)
ID: 41728280
You're welcome. Glad I could help. :)
0

Featured Post

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Introduction While answering a recent question (http:/Q_27311462.html), I created an alternative function to the Excel Concatenate() function that you might find useful.  I tested several solutions and share the results in this article as well as t…
Some code to ensure data integrity when using macros within Excel. Also included code that helps secure your data within an Excel workbook.
The viewer will learn how to simulate a series of sales calls dependent on a single skill level and learn how to simulate a series of sales calls dependent on two skill levels. Simulating Independent Sales Calls: Enter .75 into cell C2 – “skill leve…
This Micro Tutorial will demonstrate on a Mac how to change the sort order for chart legend values and decrpyt the intimidating chart menu.

910 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

20 Experts available now in Live!

Get 1:1 Help Now