Little round about
Option Explicit
Sub SpecialSort()
Dim wsData As Worksheet
Dim rData As Range
Dim i As Long
'set some variables
Set wsData = ActiveWorkbook.Worksheets("Foglio1")
Set rData = Range("E6:O19")
'add a prefix to sort by
' 010 020 030 040 050 060 070 080 090
'"INT|TRANC", "INT|AGGRAFF", "INT|*", "SX-*", "RO-*", "BI-*", "INT|MD-FIN", "INT|IMBALLO", "INT|TRASP"
Application.ScreenUpdating = False
For i = 6 To 19
With wsData.Cells(i, 5)
Select Case .Value
Case "INT|TRANC"
.Value = "010#" & .Value
Case "INT|AGGRAFF"
.Value = "020#" & .Value
Case "INT|MD-FIN"
.Value = "070#" & .Value
Case "INT|IMBALLO"
.Value = "080#" & .Value
Case "INT|TRASP"
.Value = "090#" & .Value
Case Else
If Left(.Value, 4) = "INT|" Then
.Value = "030#" & .Value
ElseIf Left(.Value, 3) = "SX-" Then
.Value = "040#" & .Value
ElseIf Left(.Value, 3) = "RO-" Then
.Value = "050#" & .Value
ElseIf Left(.Value, 3) = "BI-" Then
.Value = "060#" & .Value
End If
End Select
End With
Next i
'sort
With wsData.Sort
.SortFields.Clear
.SortFields.Add Key:=rData.Columns(1), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
.SetRange rData
.Header = xlNo
.MatchCase = False
.Orientation = xlTopToBottom
.SortMethod = xlPinYin
.Apply
End With
'remove prefix
For i = 6 To 19
With wsData.Cells(i, 5)
If Len(.Value) > 0 Then .Value = Right(.Value, Len(.Value) - 4)
End With
Next i
Application.ScreenUpdating = True
End Sub