I had a great time with this challenge! I spent most of my time trying to find a way that wouldn’t take forever to go through the 10000-some lines of data. At first I was using copy and paste and that took forever, so instead I swapped to using varibles and it finishes in seconds now. I also created a separate function beneath the macro that checks whether or not the new sheet has already been created so the code doesn’t try and create a duplicate sheet. I had a lot of fun with it!
Also, for those without a lot of VBA experience, a pivot table could also prove a useful tool in this scenario!
Option Explicit
Sub sort_data()
Dim lrow As Long
Dim newlrow As Long
Dim yr As Integer
Dim dt As Date
Dim rev As Worksheet
Dim newWS As Worksheet
Dim x As Integer
Dim op As Double
Dim hi As Double
Dim low As Double
Dim cl As Double
Dim vol As Double
Dim inc As Integer
lrow = ActiveSheet.Cells(Rows.Count, 1).End(xlUp).Row
Set rev = ThisWorkbook.Sheets(1)
For x = 2 To lrow
dt = rev.Cells(x, 1).Value
yr = year(dt)
'''' 1980s
If yr >= 1980 And yr <= 1989 Then
If WorksheetExists("1980s") Then
Set newWS = Worksheets("1980s")
op = rev.Cells(x, 2).Value
hi = rev.Cells(x, 3).Value
low = rev.Cells(x, 4).Value
cl = rev.Cells(x, 5).Value
vol = rev.Cells(x, 6).Value
inc = rev.Cells(x, 7).Value
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow + 1, 1).Value = dt
newWS.Cells(newlrow + 1, 2).Value = op
newWS.Cells(newlrow + 1, 3).Value = hi
newWS.Cells(newlrow + 1, 4).Value = low
newWS.Cells(newlrow + 1, 5).Value = cl
newWS.Cells(newlrow + 1, 6).Value = vol
newWS.Cells(newlrow + 1, 7).Value = inc
Else
Set newWS = ThisWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
newWS.Name = "1980s"
rev.Select
Cells(x, 1).EntireRow.Copy
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow, 1).PasteSpecial
End If
End If
'''' 1990s
If yr >= 1990 And yr <= 1999 Then
If WorksheetExists("1990s") Then
Set newWS = Worksheets("1990s")
op = rev.Cells(x, 2).Value
hi = rev.Cells(x, 3).Value
low = rev.Cells(x, 4).Value
cl = rev.Cells(x, 5).Value
vol = rev.Cells(x, 6).Value
inc = rev.Cells(x, 7).Value
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow + 1, 1).Value = dt
newWS.Cells(newlrow + 1, 2).Value = op
newWS.Cells(newlrow + 1, 3).Value = hi
newWS.Cells(newlrow + 1, 4).Value = low
newWS.Cells(newlrow + 1, 5).Value = cl
newWS.Cells(newlrow + 1, 6).Value = vol
newWS.Cells(newlrow + 1, 7).Value = inc
Else
Set newWS = ThisWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
newWS.Name = "1990s"
rev.Select
Cells(x, 1).EntireRow.Copy
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow, 1).PasteSpecial
End If
End If
'''' 2000s
If yr >= 2000 And yr <= 2009 Then
If WorksheetExists("2000s") Then
Set newWS = Worksheets("2000s")
op = rev.Cells(x, 2).Value
hi = rev.Cells(x, 3).Value
low = rev.Cells(x, 4).Value
cl = rev.Cells(x, 5).Value
vol = rev.Cells(x, 6).Value
inc = rev.Cells(x, 7).Value
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow + 1, 1).Value = dt
newWS.Cells(newlrow + 1, 2).Value = op
newWS.Cells(newlrow + 1, 3).Value = hi
newWS.Cells(newlrow + 1, 4).Value = low
newWS.Cells(newlrow + 1, 5).Value = cl
newWS.Cells(newlrow + 1, 6).Value = vol
newWS.Cells(newlrow + 1, 7).Value = inc
Else
Set newWS = ThisWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
newWS.Name = "2000s"
rev.Select
Cells(x, 1).EntireRow.Copy
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow, 1).PasteSpecial
End If
End If
'''' 2010s
If yr >= 2010 And yr <= 2019 Then
If WorksheetExists("2010s") Then
Set newWS = Worksheets("2010s")
op = rev.Cells(x, 2).Value
hi = rev.Cells(x, 3).Value
low = rev.Cells(x, 4).Value
cl = rev.Cells(x, 5).Value
vol = rev.Cells(x, 6).Value
inc = rev.Cells(x, 7).Value
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow + 1, 1).Value = dt
newWS.Cells(newlrow + 1, 2).Value = op
newWS.Cells(newlrow + 1, 3).Value = hi
newWS.Cells(newlrow + 1, 4).Value = low
newWS.Cells(newlrow + 1, 5).Value = cl
newWS.Cells(newlrow + 1, 6).Value = vol
newWS.Cells(newlrow + 1, 7).Value = inc
Else
Set newWS = ThisWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
newWS.Name = "2010s"
rev.Select
Cells(x, 1).EntireRow.Copy
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow, 1).PasteSpecial
End If
End If
'''' 2020s
If yr >= 2020 And yr <= 2029 Then
If WorksheetExists("2020s") Then
Set newWS = Worksheets("2020s")
op = rev.Cells(x, 2).Value
hi = rev.Cells(x, 3).Value
low = rev.Cells(x, 4).Value
cl = rev.Cells(x, 5).Value
vol = rev.Cells(x, 6).Value
inc = rev.Cells(x, 7).Value
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow + 1, 1).Value = dt
newWS.Cells(newlrow + 1, 2).Value = op
newWS.Cells(newlrow + 1, 3).Value = hi
newWS.Cells(newlrow + 1, 4).Value = low
newWS.Cells(newlrow + 1, 5).Value = cl
newWS.Cells(newlrow + 1, 6).Value = vol
newWS.Cells(newlrow + 1, 7).Value = inc
Else
Set newWS = ThisWorkbook.Worksheets.Add(after:=Worksheets(Worksheets.Count))
newWS.Name = "2020s"
rev.Select
Cells(x, 1).EntireRow.Copy
newlrow = newWS.Cells(Rows.Count, 1).End(xlUp).Row
newWS.Cells(newlrow, 1).PasteSpecial
End If
End If
Application.CutCopyMode = False
DoEvents
Next x
Beep
End Sub
Function WorksheetExists(sheetName As String) As Boolean
Dim ws As Worksheet
For Each ws In ThisWorkbook.Worksheets
If ws.Name = sheetName Then
WorksheetExists = True
Exit Function
End If
Next ws
WorksheetExists = False
End Function