I didn't look at the other portion. But VBA doesn't use & for And. You have to
use And.
Maybe...
Option Explicit
Sub Concat()
Dim Iloop As Long
Dim Numrows As Long
'Dim Counter As Long
Application.ScreenUpdating = False
Numrows = Range("A65536").End(xlUp).Row
Range("A1:G" & Numrows).Select
Selection.Sort _
key1:=Range("G1"), Order1:=xlAscending, _
Header:=xlYes, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
Selection.Sort _
key1:=Range("D1"), Order1:=xlAscending, _
key2:=Range("E1"), Order2:=xlAscending, _
key3:=Range("F1"), Order3:=xlAscending, _
Header:=xlYes, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
Selection.Sort _
key1:=Range("A1"), Order1:=xlAscending, _
key2:=Range("B1"), Order2:=xlAscending, _
key3:=Range("C1"), Order3:=xlAscending, _
Header:=xlYes, OrderCustom:=1, _
MatchCase:=False, Orientation:=xlTopToBottom
For Iloop = Numrows To 2 Step -1
If Cells(Iloop, "A").Value = Cells(Iloop - 1, "A").Value _
And Cells(Iloop, "B").Value = Cells(Iloop - 1, "B").Value _
And Cells(Iloop, "G").Value = Cells(Iloop - 1, "G").Value Then
Cells(Iloop - 1, "C").Value _
= Cells(Iloop - 1, "C").Value & ", " & Cells(Iloop, "C").Value
Rows(Iloop).Delete
End If
Next Iloop
Range("A1").Select
Application.ScreenUpdating = True
End Sub
I changed Integer to Long--it actually speeds up the processing and I commented
out the counter variable. I didn't see it used in this code. And I like to
specify the property that I'm using (.value) even if it is the default.
savvysam wrote:
>
> Thanks, Dave! Hmm, after giving it a try it doesn't seem to be combining the
> entries at all now. But, at least no errors, and it's definitely sorting
> properly... Here's what I've got now:
>
> Sub Concat()
>
> Dim Iloop As Integer
> Dim Numrows As Integer
> Dim Counter As Integer
>
> Application.ScreenUpdating = False
>
> Numrows = Range("A65536").End(xlUp).Row
> Range("A1:G" & Numrows).Select
>
> Selection.Sort _
> key1:=Range("G1"), Order1:=xlAscending, _
> Header:=xlYes, OrderCustom:=1, _
> MatchCase:=False, Orientation:=xlTopToBottom
>
> Selection.Sort _
> key1:=Range("D1"), Order1:=xlAscending, _
> key2:=Range("E1"), Order2:=xlAscending, _
> key3:=Range("F1"), Order3:=xlAscending, _
> Header:=xlYes, OrderCustom:=1, _
> MatchCase:=False, Orientation:=xlTopToBottom
>
> Selection.Sort _
> key1:=Range("A1"), Order1:=xlAscending, _
> key2:=Range("B1"), Order2:=xlAscending, _
> key3:=Range("C1"), Order3:=xlAscending, _
> Header:=xlYes, OrderCustom:=1, _
> MatchCase:=False, Orientation:=xlTopToBottom
>
> For Iloop = Numrows To 2 Step -1
> If Cells(Iloop, "A") = Cells(Iloop - 1, "A") & Cells(Iloop, "B") =
> Cells(Iloop - 1, "B") & _
> Cells(Iloop, "G") = Cells(Iloop - 1, "G") Then
> Cells(Iloop - 1, "C") = Cells(Iloop - 1, "C") & ", " & Cells(Iloop, "C")
> Rows(Iloop).Delete
> End If
> Next Iloop
>
> Range("A1").Select
>
> Application.ScreenUpdating = True
>
> End Sub
>
> "Dave Peterson" wrote:
>
> > That giant (incorrect) sort statement could be replaced with these 3 sort
> > statements:
> >
> > Selection.Sort _
> > key1:=Range("G1"), Order1:=xlAscending, _
> > Header:=xlYes, OrderCustom:=1, _
> > MatchCase:=False, Orientation:=xlTopToBottom
> >
> > Selection.Sort _
> > key1:=Range("D1"), Order1:=xlAscending, _
> > key2:=Range("E1"), Order2:=xlAscending, _
> > key3:=Range("F1"), Order3:=xlAscending, _
> > Header:=xlYes, OrderCustom:=1, _
> > MatchCase:=False, Orientation:=xlTopToBottom
> >
> > Selection.Sort _
> > key1:=Range("A1"), Order1:=xlAscending, _
> > key2:=Range("B1"), Order2:=xlAscending, _
> > key3:=Range("C1"), Order3:=xlAscending, _
> > Header:=xlYes, OrderCustom:=1, _
> > MatchCase:=False, Orientation:=xlTopToBottom
> >
> >
> >
> > savvysam wrote:
> > >
> > > (This level of VB is a bit over my head, sorry.) Are you saying that the
> > > sort keys I have in my code should be no more than 3? And if so, can you
> > > give me an example of a sort command for D, E, F? Thanks for your help!!
> > >
> > > S
> > >
> > > "Dave Peterson" wrote:
> > >
> > > > Just like from the user interface, you only get 3 keys to sort by.
> > > >
> > > > But you can do multiple sorts (manually or in code) to get the order you want.
> > > >
> > > > So use 3 sort commands.
> > > >
> > > > First sort by column G, then sort by D, E, F, and finally sort by A, B, and C.
> > > >
> > > >
> > > >
> > > > savvysam wrote:
> > > > >
> > > > > Hey there!
> > > > >
> > > > > So, I have an automated report that I get in Excel that reports various
> > > > > production milestones, alpha, beta, ship date, etc. Each product has up to 5
> > > > > versions on the report, denoted by text in one of the columns. I want to
> > > > > combine all entries of a product that has consistent dates in 4 columns.
> > > > > This would leave only instances of the product with unique milestones, with
> > > > > the version columnconcatenating as needed. So, in essence of 7 columns I
> > > > > want 6 of them to match, and if they do, they should become one with all
> > > > > versions listed in column C. I've gotten help on this board, but the code
> > > > > that I have now gives me runtime errors. (I've gotten the 400 error, 1004,
> > > > > and another that says application or object based error.)
> > > > >
> > > > > Any ideas for what I can do? TIA!
> > > > >
> > > > > Here is my code:
> > > > >
> > > > > Sub Concat()
> > > > >
> > > > > Dim Iloop As Integer
> > > > > Dim Numrows As Integer
> > > > > Dim Counter As Integer
> > > > >
> > > > > Application.ScreenUpdating = False
> > > > >
> > > > > Numrows = Range("A65536").End(xlUp).Row
> > > > > Range("A1:G" & Numrows).Select
> > > > > Selection.Sort key1:=Range("A1"), Order1:=xlAscending, _
> > > > > Key2:=Range("B1"), Order2:=xlAscending, Key3:=Range("C1"), _
> > > > > Order3:=xlAscending, key4:=Range("D1"), Order4:=xlAscending, _
> > > > > key5:=Range("E1"), Order5:=xlAscending, key6:=Range("F1"),
> > > > > Order6:=xlAscending, _
> > > > > key7:=Range("G1"), Order7:=xlAscending, Header:=xlYes, OrderCustom:=1, _
> > > > > MatchCase:=False, Orientation:=xlTopToBottom
> > > > > For Iloop = Numrows To 2 Step -1
> > > > > If Cells(Iloop, "A") = Cells(Iloop - 1, "A") & Cells(Iloop, "B") &
> > > > > Cells(Iloop - 1, "B") & Cells(Iloop, "D") = Cells(Iloop - 1, "D") _
> > > > > & Cells(Iloop, "E") = Cells(Iloop - 1, "E") & Cells(Iloop, "F") =
> > > > > Cells(Iloop - 1, "F") & Cells(Iloop, "G") = Cells(Iloop - 1, "G") Then
> > > > > Cells(Iloop - 1, "C") = Cells(Iloop - 1, "C") & ", " & Cells(Iloop, "C")
> > > > > Rows(Iloop).Delete
> > > > > End If
> > > > > Next Iloop
> > > > >
> > > > > Range("A1").Select
> > > > >
> > > > > Application.ScreenUpdating = True
> > > > >
> > > > > End Sub
> > > >
> > > > --
> > > >
> > > > Dave Peterson
> > > >
> >
> > --
> >
> > Dave Peterson
> >
--
Dave Peterson
Bookmarks