Reputation: 293
I have an input sheet ("by month") where the user inputs data into some cells and then sorts that data into two separate spreadsheets ("ordersbyLOGdate" and "ordersbySHIPdate") - as you can guess these spreadsheets contain the same data but sort them differently (by log date and then by ship date).
I can read and store the data fine, however when sorting the data and placing it in a spreadsheet, it doesn't end up where I want it to go, can anyone see what I'm missing here?
Sub Button1_Click()
Dim countR As Long
Dim countLoop As Long
countLoop = 1
countR = firstBlankRow(ThisWorkbook.Worksheets("by month"))
countR = countR - 1
Dim colL As String
Dim company As String
Dim orderNumb As String
Dim oDate As Date
Dim total As Double
Dim orderStatus As String
Dim shipMethod As String
Dim sDate As Date
Dim orderStock As String
For i = 2 To countR 'countR is the first row down with nothing in it (leng = 0) and then - 1 (to get the next row up)... that's how many rows have inputs in them that need to be stored
ThisWorkbook.Worksheets("by month").Activate
company = Range("A" & i).Value
orderNumb = Val(Range("B" & i).Value)
oDate = Range("C" & i).Value
total = Val(Range("D" & i).Value)
orderStatus = (Range("E" & i).Value)
shipMethod = Range("I" & Count).Value
sDate = Range("J" & i).Value
orderStock = Range("K" & i).Value
Dim LL As Long
LL = Range("D" & Rows.Count).End(xlUp).Row + 1 + 1
ThisWorkbook.Worksheets("ordersbyLOGdate").Activate
Dim rowN As Integer
rowN = 2
Do Until Range("C" & rowN).Value >= oDate Or rowN = 10000 '10,000 stops infinite row checking
rowN = rowN + 1
Loop 'once loop finishes we should have found a place to insert data, insert a row and place data inside the row
If Range("C" & rowN).Value = oDate Then
Range("A" & rowN).EntireRow.Insert
Range("A" & rowN).Value = company
Range("B" & rowN).Value = orderNumb
Range("C" & rowN).Value = oDate
Range("D" & rowN).Value = total
Range("E" & rowN).Value = orderStatus
Range("I" & rowN).Value = shipMethod
Range("J" & rowN).Value = sDate
Range("K" & rowN).Value = orderStock
End If
If Range("C" & rowN).Value > oDate Then
Debug.Print ("compare date is GREATER than oDate, - 1 from rowN and insert data there")
Range("A" & rowN).EntireRow.Insert
Range("A" & rowN).Value = company
Range("B" & rowN).Value = orderNumb
Range("C" & rowN).Value = oDate
Range("D" & rowN).Value = total
Range("E" & rowN).Value = orderStatus
Range("I" & rowN).Value = shipMethod
Range("J" & rowN).Value = sDate
Range("K" & rowN).Value = orderStock
End If
If rowN = 10000 Then
MsgBox ("ERROR")
Exit Sub
End If
ThisWorkbook.Worksheets("ordersbySHIPdate").Activate
rowN = 2
Do Until Range("C" & rowN).Value >= sDate Or rowN = 10000
rowN = rowN + 1
Loop
If Range("C" & rowN).Value = sDate Then
Range("A" & rowN).EntireRow.Insert
Range("A" & rowN).Value = company
Range("B" & rowN).Value = orderNumb
Range("C" & rowN).Value = oDate
Range("D" & rowN).Value = total
Range("E" & rowN).Value = orderStatus
Range("I" & rowN).Value = shipMethod
Range("J" & rowN).Value = sDate
Range("K" & rowN).Value = orderStock
End If
If Range("C" & rowN).Value > sDate Then
Range("A" & rowN).EntireRow.Insert
Range("A" & rowN).Value = company
Range("B" & rowN).Value = orderNumb
Range("C" & rowN).Value = oDate
Range("D" & rowN).Value = total
Range("E" & rowN).Value = orderStatus
Range("I" & rowN).Value = shipMethod
Range("J" & rowN).Value = sDate
Range("K" & rowN).Value = orderStock
End If
If rowN = 10000 Then
MsgBox ("ERROR")
Exit Sub
End If
Next
ThisWorkbook.Worksheets("ordersbyLOGdate").Activate 'start sorting data into its proper place
rowN = 2 'start at the first row of data, a heading is placed in row 1
Dim check As Boolean
check = True
Dim blankRows As Integer
blankRows = 0
Dim startR As Long
Dim endR As Long
startR = 0
endR = 0
Do Until blankRows = 15
If Range("J" & rowN).Value <> "" Then
blankRows = 0
If check = True Then
startR = rowN
endR = Range("D" & rowN).End(xlDown).Row
endR = endR - 1
Range("D" & rowN).Formula = "=SUM(D" & startR & ":D" & endR & ")"
check = False
End If
rowN = rowN + 1
Else
blankRows = blankRows + 1
If check = False Then
check = True
End If
End If
Loop
check = True
blankRows = 0
startR = 0
endR = 0
rowN = 2
ThisWorkbook.Worksheets("ordersbySHIPdate").Activate
Do Until blankRows = 15
If Range("J" & rowN).Value <> "" Then
blankRows = 0
If check = True Then
startR = rowN
endR = Range("D" & rowN).End(xlDown).Row
endR = endR - 1
Range("D" & rowN).Formula = "=SUM(D" & startR & ":D" & endR & ")"
check = False
End If
rowN = rowN + 1
Else
blankRows = blankRows + 1
If check = False Then
check = True
End If
End If
Loop
ThisWorkbook.Worksheets("by month").Activate
MsgBox ("DONE!")
End Sub
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
Function firstBlankRow(ws As Worksheet) As Long
Dim rw As Range
For Each rw In ws.UsedRange.Rows
If rw.Address = ws.Range(rw.Address).SpecialCells(xlCellTypeBlanks). _
Address Then
firstBlankRow = rw.Row
Exit For
End If
Next
If firstBlankRow = 0 Then
firstBlankRow = ws.Cells.SpecialCells(xlCellTypeLastCell). _
Offset(1, 0).Row
End If
End Function
Please disregard the random variables that aren't used (not all the macro is pasted here, just the parts I'm having trouble with)
Any help would be greatly appreciated (and of course, if my attempt at this can be improved upon, I am very welcoming to any tips :) )
Thanks in advance!
Upvotes: 0
Views: 1076
Reputation: 2260
As promised, I took a few minutes to go through your code and improved a few things.
Sub Button1_Click()
Dim colL As String, company As String, orderNumb As String
Dim orderStatus As String, shipMethod As String, orderStock As String
Dim countR As Long, countLoop As Long, LL As Long
Dim startR As Long, endR As Long
Dim oDate As Date, sDate As Date
Dim total As Double
Dim wb As Workbook, wsMonth As Worksheet
Dim i As Integer, x As Integer, lastRow As Integer, rowN As Integer
Dim check As Boolean
Dim blankRows As Integer
Set wb = ThisWorkbook
Set wsMonth = wb.Worksheets("by month")
Set wsLog = wb.Worksheets("ordersbyLOGdate")
Set wsShip = wb.Worksheets("ordersbySHIPdate")
countR = wsMonth.Cells(wsMonth.Rows.Count, 1).End(xlUp).Row
countLoop = 1
For i = 2 To countR
company = wsMonth.Range("A" & i)
orderNumb = Val(wsMonth.Range("B" & i))
oDate = wsMonth.Range("C" & i)
total = Val(wsMonth.Range("D" & i))
orderStatus = wsMonth.Range("E" & i)
shipMethod = wsMonth.Range("I" & Count)
sDate = wsMonth.Range("J" & i)
orderStock = wsMonth.Range("K" & i)
LL = wsMonth.Range("D" & wsMonth.Rows.Count).End(xlUp).Row + 2
rowN = 2
lastRow = wsLog.Cells(wsLog.Rows.Count, 3).End(xlUp).Row
Do Until wsLog.Range("C" & rowN) >= oDate
If rowN > lastRow Then
MsgBox "ERROR"
Exit Sub
End If
rowN = rowN + 1
Loop
If wsLog.Range("C" & rowN) >= oDate Then
If wsLog.Range("C" & rowN) > oDate Then
Debug.Print "compare date is GREATER than oDate, - 1 from rowN and insert data there"
End If
wsLog.Rows(rowN).Insert
wsLog.Range("A" & rowN) = company
wsLog.Range("B" & rowN) = orderNumb
wsLog.Range("C" & rowN) = oDate
wsLog.Range("D" & rowN) = total
wsLog.Range("E" & rowN) = orderStatus
wsLog.Range("I" & rowN) = shipMethod
wsLog.Range("J" & rowN) = sDate
wsLog.Range("K" & rowN) = orderStock
End If
rowN = 2
lastRow = wsShip.Cells(wsShip.Rows.Count, 3).End(xlUp).Row
Do Until wsShip.Range("C" & rowN) >= sDate
If rowN > lastRow Then
MsgBox "ERROR"
Exit Sub
End If
rowN = rowN + 1
Loop
If wsShip.Range("C" & rowN) >= sDate Then
wsShip.Rows(rowN).Insert
wsShip.Range("A" & rowN) = company
wsShip.Range("B" & rowN) = orderNumb
wsShip.Range("C" & rowN) = oDate
wsShip.Range("D" & rowN) = total
wsShip.Range("E" & rowN) = orderStatus
wsShip.Range("I" & rowN) = shipMethod
wsShip.Range("J" & rowN) = sDate
wsShip.Range("K" & rowN) = orderStock
End If
Next
MysteryFunk (wsLog)
MysteryFunk (wsShip)
wsMonth.Activate
MsgBox ("DONE!")
End Sub
Function MysteryFunk(sheetName As Workheet)
Dim rowN As Long, blankRows As Long, startR As Long, endR As Long
Dim check As Boolean
rowN = 2
check = True
blankRows = 0
startR = 0
endR = 0
Do Until blankRows = 15
If ws.Range("J" & rowN) <> "" Then
blankRows = 0
If check = True Then
startR = rowN
endR = ws.Range("D" & rowN).End(xlDown).Row
endR = endR - 1
ws.Range("D" & rowN).Formula = "=SUM(D" & startR & ":D" & endR & ")"
check = False
End If
rowN = rowN + 1
Else
blankRows = blankRows + 1
If check = False Then
check = True
End If
End If
Loop
End Function
Function Col_Letter(lngCol As Long) As String
Dim vArr
vArr = Split(Cells(1, lngCol).Address(True, False), "$")
Col_Letter = vArr(0)
End Function
I used some workbook/worksheet objects to make sure we're working with the right .Range
s.
I removed the "firstBlankRow" function and went ahead and used some solid built-in VBA functionality.
I removed all the .Value
s as it's used by default when attributing a range to a variable (without using something like Set rng = Range("...")
)
I modified some sections to allow the code to be less repetitive and still perform the same actions.
I grouped all the Dim
s at the top.
I'm not sure exactly what the (now named) "MysteryFunk" does; seems to add a partial sum when it finds some "valid" blank line. Also not sure where you meant to sort the data, but as answered earlier, simply use the Excel .Sort
function.
Upvotes: 0
Reputation: 21
I think it is better to add all the data to the last part then sort it after, using this code:
ActiveWorkbook.Worksheets("ordersbyLOGdate").Activate
ActiveWorkbook.Worksheets("ordersbyLOGdate").Sort.SortFields.Clear
ActiveWorkbook.Worksheets("ordersbyLOGdate").Sort.SortFields.Add Key:=Range("C1:C" & rowN) _
, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
With ActiveWorkbook.Worksheets("ordersbyLOGdate").Sort
.SetRange Range("A1:K" & rowN)
.Header = xlYes
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
Upvotes: 1