Solved

Populate Excel sheets based on criteria from import sheet using VBA

Posted on 2016-07-22
7
80 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
[X]
Welcome to Experts Exchange

Add your voice to the tech community where 5M+ people just like you are talking about what matters.

  • Help others & share knowledge
  • Earn cash & points
  • Learn & ask questions
  • 4
  • 3
7 Comments
 
LVL 31

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 31

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
MS Dynamics Made Instantly Simpler

Make Your Microsoft Dynamics Investment Count  & Drastically Decrease Training Time by Providing Intuitive Step-By-Step WalkThru Tutorials.

 

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 31

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 31

Expert Comment

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

Featured Post

Industry Leaders: We Want Your Opinion!

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

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

Freeze panes is an option within all variants of Excel to enable parts of a sheet to remain stationary when the cursor is in another part of the sheet. This is a very useful feature which is overlooked or under used.
When you see single cell contains number and text, and you have to get any date out of it seems like cracking our heads.
This Micro Tutorial will demonstrate how to use longer labels with horizontal bar charts instead of the vertical column chart.
Many functions in Excel can make decisions. The most simple of these is the IF function: it returns a value depending on whether a condition you describe is true or false. Once you get the hang of using the IF function, you will find it easier to us…

691 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