Selected Answer
Alaa
The attached file contains the revised macro below (heavily commented for your guidance)- it can now be run from a form button called "Collate from other sheets" on the "summary" sheet.
It uses a VBA dictionary (which is alphabetically sorted anyway) whose "key" is the combined values (from columns B and C) and the output (currently blank) will list the combinations plus say where they were found (in column D) - I think that might be useful when you have many rows but you could change the code to avoid that.
To understand a little more about why I used a dictionary, see my recently selected Answer at higlight new data across sheets with matching in another
Note there's a (commented) line in bold below giving you an extra learning point.
Sub CopyRange()
Dim bottomB As Integer
Dim ws As Worksheet
Dim OutDict As Object, Key As Variant, n As Integer, Val As String
'create a new empty dicionary
Set OutDict = CreateObject("scripting.dictionary")
'Loop through sheets
For Each ws In Sheets(Array("A", "B", "C"))
'ws.Activate ' ## no need to activate a worksheet to work on it
bottomB = ws.Range("B" & Rows.Count).End(xlUp).Row
' loop down sheet rows
For n = 2 To bottomB
'create a "key" from B and C with a rare delimiter (¬)
Val = ws.Cells(n, 2) & "¬" & ws.Cells(n, 3)
' if there's no dictionary key like that, add one with no value
If Not OutDict.exists(Val) Then OutDict.Add Key:=Val, Item:=""
' add something to the value for that key (here the worksheet name and cell without $ signs)
OutDict(Val) = OutDict(Val) & ws.Name & "(" & Cells(n, 2).Address(False, False) & "); "
Next n
Next ws
With Sheets("summary")
bottomB = .UsedRange.Rows.Count
'clear existing rows below header (if any)
If bottomB > 1 Then .Range("B2:B" & bottomB).EntireRow.Delete
n = 2
' loop through dictionary and add to row (n)
For Each Key In OutDict
'split values (using delimter ¬), add to cells and draw borders
.Cells(n, 2).Resize(1, 2) = Split(Key, "¬")
'optionally output the dictionary value
.Cells(n, 4) = OutDict(Key)
'draw borders around cells
.Cells(n, 2).Resize(1, 3).Borders.LineStyle = xlContinuous
'increment row counter
n = n + 1
Next Key
' set the column widths to suit contents
.Columns("B:D").AutoFit
' show this sheet
.Activate
End With
' tell user something happened
MsgBox "Items found= " & OutDict.Count
End Sub
Finally, you're using an array of sheet names for your loop- that's fine but if you have just one summary sheet and need to loop through every other sheet (and there are many more than 3), you might want to use this instead (same code extract as above but with changes in bold and comments removed):
'Loop through sheets
For Each ws In ThisWorkbook.Sheets
If ws.Name <> "summary" Then
bottomB = ws.Range("B" & Rows.Count).End(xlUp).Row
For n = 2 To bottomB
Val = ws.Cells(n, 2) & "¬" & ws.Cells(n, 3)
If Not OutDict.exists(Val) Then OutDict.Add Key:=Val, Item:=""
OutDict(Val) = OutDict(Val) & ws.Name & "(" & Cells(n, 2).Address(False, False) & "); "
Next n
End If
Next ws
Hope this helps.