Reputation: 1187
I HAVE UPDATED THIS
Update highlights
Original (slightly changed post)
I am trying to get cell data from three sheets, five cells per sheet for a total of fifteen cells. Remove all zero values. Numerically order the remaining. The insert it into a single cell on another sheet comma delimited. All cell data should contain only positive, whole numbers.
I have provided a sample of what the data looks like and my code below. If there is a better way of approaching this than the way I am attempting I am open to other solutions.
The code below does return an error in AggregateSeptember() the line that returns the error has a comment explaining it. Thank you feelththis.
After execution Sheet 8 L5 should = "1, 9, 29, 37, 50, 61"
I am totally stumped by this and haven't written any VB before, I would appreciate any help with this.
Thanks in advance for your time and consideration, Tim
The DATA below is before VBA runs. After the code runs Sheet8.L5.value = "1, 9, 29, 37, 50, 61" as stated above.)
DATA
Sheet 5
M5 N5 O5 P5 Q5 R5
37 0 0 0 0 0
Sheet 6
M5 N5 O5 P5 Q5 R5
1 9 0 0 0 0
Sheet 7
M5 N5 O5 P5 Q5 R5
29 50 61 0 0 0
Sheet 8
L5
0
DATA
Sub AggregateSeptember()
Dim i As Integer
Dim j As Integer
Dim SeptemberTerm1Aggregate As String
Dim SeptemberTerm1(0 To 14) As Integer
Dim SeptemberTerm2() As Integer
Dim SeptemberCols
SeptemberCols = Array("M5", "N5", "O5", "P5", "Q5")
For i = 0 To 14
If i < 5 Then
If Sheet5.Range(SeptemberCols(i)) <> 0 Then
SeptemberTerm1(i) = Sheet5.Range(SeptemberCols(i))
End If
ElseIf i < 10 Then
If Sheet6.Range(SeptemberCols(i - 5)) <> 0 Then
SeptemberTerm1(i - 5) = Sheet6.Range(SeptemberCols(i - 5))
End If
ElseIf i < 15 Then
If Sheet7.Range(SeptemberCols(i - 10)) <> 0 Then
SeptemberTerm1(i - 10) = Sheet7.Range(SeptemberCols(i - 10))
End If
End If
Next i
' This next line no longer returns an error
SeptemberTerm2 = BubbleSrt(SeptemberTerm1, True)
For j = 0 To 14
If SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & SeptemberTerm2(j)
If j > 0 And j < 14 And SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & ", "
Next j
Sheet8.Range("L5").Value = SeptemberTerm1Aggregate
End Sub
Public Function BubbleSrt(ArrayIn, Ascending As Boolean)
Dim SrtTemp As Variant
Dim i As Long
Dim j As Long
If Ascending = True Then
For i = LBound(ArrayIn) To UBound(ArrayIn)
For j = i + 1 To UBound(ArrayIn)
If ArrayIn(i) > ArrayIn(j) Then
SrtTemp = ArrayIn(j)
ArrayIn(j) = ArrayIn(i)
ArrayIn(i) = SrtTemp
End If
Next j
Next i
Else
For i = LBound(ArrayIn) To UBound(ArrayIn)
For j = i + 1 To UBound(ArrayIn)
If ArrayIn(i) < ArrayIn(j) Then
SrtTemp = ArrayIn(j)
ArrayIn(j) = ArrayIn(i)
ArrayIn(i) = SrtTemp
End If
Next j
Next i
End If
BubbleSrt = ArrayIn
End Function
Upvotes: 1
Views: 105
Reputation: 357
Well, it seems you were faster than me, but here's my solution anway. Just change "Sheet1"
, ..., "Sheet4"
to whatever you need.
Sub AggregateSeptember()
Dim i As Integer ' Counter for Sheets
Dim j As Integer ' Counter for Columns
Dim k As Integer ' Counter for your data
Dim vMySheets As Variant ' Sheets
Dim vSeptemberCols As Variant ' Columns
Dim iCurrent As Integer ' Current data
Dim iSeptemberTerm() As Integer ' Data array
Dim sAggregate As String ' Aggregate string
vMySheets = Array("Sheet1", "Sheet2", "Sheet3")
vSeptemberCols = Array("M5", "N5", "O5", "P5", "Q5", "R5")
ReDim iSeptemberTerm(0 To (UBound(vMySheets) + 1) * (UBound(vSeptemberCols) + 1) - 1)
k = 0
For i = LBound(vMySheets) To UBound(vMySheets)
For j = LBound(vSeptemberCols) To UBound(vSeptemberCols)
iCurrent = ThisWorkbook.Sheets(vMySheets(i)).Range(vSeptemberCols(j)).Value
If iCurrent <> 0 Then
iSeptemberTerm(k) = iCurrent
k = k + 1
End If
Next j
Next i
ReDim Preserve iSeptemberTerm(0 To k - 1) ' This is just to eliminate the unused elements
iSeptemberTerm = BubbleSrt(iSeptemberTerm, True)
For i = LBound(iSeptemberTerm) To UBound(iSeptemberTerm)
sAggregate = sAggregate & iSeptemberTerm(i) & ", "
Next i
sAggregate = Left(sAggregate, Len(sAggregate) - Len(", "))
ThisWorkbook.Sheets("Sheet4").Range("L5").Value = sAggregate
End Sub
A few notes:
"R5"
in SeptemberCols
i
in your second For
)iSeptemberTerm = BubbleSrt(iSeptemberTerm, True)
because of how I declared it (without fixed bounds, so that I can dinamically change it)Upvotes: 1
Reputation: 1187
I have solved it. Although if anyone has any thoughts on a way to do this looping through multiple rows or a more efficient way to accomplish this that would be great.
I have posted the correct code below. I left the two offending lines in but commented out if anyone wants to look. Stupid mistake on my part.
Thank you to anyone who spent any amount of time on this, specifically feelththis.
Sub AggregateSeptember()
Dim i As Integer
Dim j As Integer
Dim SeptemberTerm1Aggregate As String
Dim SeptemberTerm1(0 To 14) As Integer
Dim SeptemberTerm2() As Integer
Dim SeptemberCols
SeptemberCols = Array("M5", "N5", "O5", "P5", "Q5")
For i = 0 To 14
If i < 5 Then
If Sheet5.Range(SeptemberCols(i)) <> 0 Then
SeptemberTerm1(i) = Sheet5.Range(SeptemberCols(i))
End If
ElseIf i < 10 Then
If Sheet6.Range(SeptemberCols(i - 5)) <> 0 Then
'SeptemberTerm1(i - 5) = Sheet6.Range(SeptemberCols(i - 5))
SeptemberTerm1(i) = Sheet6.Range(SeptemberCols(i - 5))
End If
ElseIf i < 15 Then
If Sheet7.Range(SeptemberCols(i - 10)) <> 0 Then
'SeptemberTerm1(i - 10) = Sheet7.Range(SeptemberCols(i - 10))
SeptemberTerm1(i) = Sheet7.Range(SeptemberCols(i - 10))
End If
End If
Next i
' This next line no longer returns an error
SeptemberTerm2 = BubbleSrt(SeptemberTerm1, True)
For j = 0 To 14
If SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & SeptemberTerm2(j)
If j > 0 And j < 14 And SeptemberTerm2(j) > 0 Then SeptemberTerm1Aggregate = SeptemberTerm1Aggregate & ", "
Next j
Sheet8.Range("L5").Value = SeptemberTerm1Aggregate
End Sub
Public Function BubbleSrt(ArrayIn, Ascending As Boolean)
Dim SrtTemp As Variant
Dim i As Long
Dim j As Long
If Ascending = True Then
For i = LBound(ArrayIn) To UBound(ArrayIn)
For j = i + 1 To UBound(ArrayIn)
If ArrayIn(i) > ArrayIn(j) Then
SrtTemp = ArrayIn(j)
ArrayIn(j) = ArrayIn(i)
ArrayIn(i) = SrtTemp
End If
Next j
Next i
Else
For i = LBound(ArrayIn) To UBound(ArrayIn)
For j = i + 1 To UBound(ArrayIn)
If ArrayIn(i) < ArrayIn(j) Then
SrtTemp = ArrayIn(j)
ArrayIn(j) = ArrayIn(i)
ArrayIn(i) = SrtTemp
End If
Next j
Next i
End If
BubbleSrt = ArrayIn
End Function
Upvotes: 0