Solved

Populate Excel sheets based on criteria from import sheet using VBA

Posted on 2016-07-22
7
63 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 29

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 29

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
Netscaler Common Configuration How To guides

If you use NetScaler you will want to see these guides. The NetScaler How To Guides show administrators how to get NetScaler up and configured by providing instructions for common scenarios and some not so common ones.

 

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 29

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 29

Expert Comment

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

Featured Post

Master Your Team's Linux and Cloud Stack!

The average business loses $13.5M per year to ineffective training (per 1,000 employees). Keep ahead of the competition and combine in-person quality with online cost and flexibility by training with Linux Academy.

Question has a verified solution.

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

Suggested Solutions

Describes a method of obtaining an object variable to an already running instance of Microsoft Access so that it can be controlled via automation.
Do you use a spreadsheet like Microsoft's Excel?  Have you ever wanted to link out to a non excel file on your computer or network drive?  This is the way I found to do it!
The viewer will learn how to use a discrete random variable to simulate the return on an investment over a period of years, create a Monte Carlo simulation using the discrete random variable, and create a graph to represent the possible returns over…
Although Jacob Bernoulli (1654-1705) has been credited as the creator of "Binomial Distribution Table", Gottfried Leibniz (1646-1716) did his dissertation on the subject in 1666; Leibniz you may recall is the co-inventor of "Calculus" and beat Isaac…

770 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