[COLOR="Navy"]Sub[/COLOR] MG07Apr51
[COLOR="Navy"]Dim[/COLOR] Ray
[COLOR="Navy"]Dim[/COLOR] i [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Long[/COLOR]
[COLOR="Navy"]Dim[/COLOR] j [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Long[/COLOR]
[COLOR="Navy"]Dim[/COLOR] jj [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Integer[/COLOR]
[COLOR="Navy"]Dim[/COLOR] ii [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Integer[/COLOR]
[COLOR="Navy"]Dim[/COLOR] Temp [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]String[/COLOR]
[COLOR="Navy"]Dim[/COLOR] Lst [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Integer[/COLOR]
[COLOR="Navy"]Dim[/COLOR] Ac [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Long[/COLOR]
[COLOR="Navy"]Dim[/COLOR] n [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Long[/COLOR]
[COLOR="Navy"]Dim[/COLOR] oTx [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]String[/COLOR]
[COLOR="Navy"]Dim[/COLOR] Q
[COLOR="Navy"]Dim[/COLOR] K
Lst = Cells("1", Columns.Count).End(xlToLeft).Column
Ray = Range(Range("A1"), Range("A" & Rows.Count).End(xlUp)).Resize(, Lst)
[COLOR="Navy"]For[/COLOR] i = 1 To UBound(Ray, 1)
[COLOR="Navy"]For[/COLOR] j = i To UBound(Ray, 1)
jj = IIf(IsNumeric(Mid(Ray(j, 1), 2, 1)), 2, 3)
ii = IIf(IsNumeric(Mid(Ray(i, 1), 2, 1)), 2, 3)
[COLOR="Navy"]If[/COLOR] Left(Ray(j, 1), jj) < Left(Ray(i, 1), ii) [COLOR="Navy"]Then[/COLOR]
[COLOR="Navy"]For[/COLOR] Ac = 1 To Lst
Temp = Ray(i, Ac)
Ray(i, Ac) = Ray(j, Ac)
Ray(j, Ac) = Temp
[COLOR="Navy"]Next[/COLOR] Ac
[COLOR="Navy"]End[/COLOR] If
[COLOR="Navy"]Next[/COLOR] j
[COLOR="Navy"]Next[/COLOR] i
[COLOR="Navy"]With[/COLOR] CreateObject("scripting.dictionary")
.CompareMode = vbTextCompare
[COLOR="Navy"]For[/COLOR] n = 1 To UBound(Ray, 1)
jj = IIf(IsNumeric(Mid(Ray(n, 1), 2, 1)), 1, 2)
oTx = Left(Ray(n, 1), jj)
[COLOR="Navy"]If[/COLOR] Not .Exists(oTx) [COLOR="Navy"]Then[/COLOR]
.Add oTx, Array(n, 0)
[COLOR="Navy"]Else[/COLOR]
Q = .Item(oTx)
Q(1) = n
.Item(oTx) = Q
[COLOR="Navy"]End[/COLOR] If
[COLOR="Navy"]Next[/COLOR]
[COLOR="Navy"]For[/COLOR] [COLOR="Navy"]Each[/COLOR] K [COLOR="Navy"]In[/COLOR] .keys
[COLOR="Navy"]For[/COLOR] i = .Item(K)(0) To .Item(K)(1)
[COLOR="Navy"]For[/COLOR] j = i To .Item(K)(1)
[COLOR="Navy"]If[/COLOR] Val(Mid(Ray(j, 1), Len(K) + 1)) < Val(Mid(Ray(i, 1), Len(K) + 1)) [COLOR="Navy"]Then[/COLOR]
[COLOR="Navy"]For[/COLOR] Ac = 1 To Lst
Temp = Ray(i, Ac)
Ray(i, Ac) = Ray(j, Ac)
Ray(j, Ac) = Temp
[COLOR="Navy"]Next[/COLOR] Ac
[COLOR="Navy"]End[/COLOR] If
[COLOR="Navy"]Next[/COLOR] j
[COLOR="Navy"]Next[/COLOR] i
[COLOR="Navy"]Next[/COLOR] K
[COLOR="Navy"]End[/COLOR] With
Range("A1").Resize(UBound(Ray), Lst) = Ray
[COLOR="Navy"]End[/COLOR] [COLOR="Navy"]Sub[/COLOR]
Now I have a box with Bad Val in it? Don't go to too much trouble I am sure Micks will do the job, besides I will need a code to sort all columns not just the first column. Thanks GTO.
Try this:-
Regards MickCode:[COLOR=Navy]Sub[/COLOR] MG07Apr51 [COLOR=Navy]Dim[/COLOR] Ray [COLOR=Navy]Dim[/COLOR] i [COLOR=Navy]As[/COLOR] [COLOR=Navy]Long[/COLOR] [COLOR=Navy]Dim[/COLOR] j [COLOR=Navy]As[/COLOR] [COLOR=Navy]Long[/COLOR] [COLOR=Navy]Dim[/COLOR] jj [COLOR=Navy]As[/COLOR] [COLOR=Navy]Integer[/COLOR] [COLOR=Navy]Dim[/COLOR] ii [COLOR=Navy]As[/COLOR] [COLOR=Navy]Integer[/COLOR] [COLOR=Navy]Dim[/COLOR] Temp [COLOR=Navy]As[/COLOR] [COLOR=Navy]String[/COLOR] [COLOR=Navy]Dim[/COLOR] Lst [COLOR=Navy]As[/COLOR] [COLOR=Navy]Integer[/COLOR] [COLOR=Navy]Dim[/COLOR] Ac [COLOR=Navy]As[/COLOR] [COLOR=Navy]Long[/COLOR] [COLOR=Navy]Dim[/COLOR] n [COLOR=Navy]As[/COLOR] [COLOR=Navy]Long[/COLOR] [COLOR=Navy]Dim[/COLOR] oTx [COLOR=Navy]As[/COLOR] [COLOR=Navy]String[/COLOR] [COLOR=Navy]Dim[/COLOR] Q [COLOR=Navy]Dim[/COLOR] K Lst = Cells("1", Columns.Count).End(xlToLeft).Column Ray = Range(Range("A1"), Range("A" & Rows.Count).End(xlUp)).Resize(, Lst) [COLOR=Navy]For[/COLOR] i = 1 To UBound(Ray, 1) [COLOR=Navy]For[/COLOR] j = i To UBound(Ray, 1) jj = IIf(IsNumeric(Mid(Ray(j, 1), 2, 1)), 2, 3) ii = IIf(IsNumeric(Mid(Ray(i, 1), 2, 1)), 2, 3) [COLOR=Navy]If[/COLOR] Left(Ray(j, 1), jj) < Left(Ray(i, 1), ii) [COLOR=Navy]Then[/COLOR] [COLOR=Navy]For[/COLOR] Ac = 1 To Lst Temp = Ray(i, Ac) Ray(i, Ac) = Ray(j, Ac) Ray(j, Ac) = Temp [COLOR=Navy]Next[/COLOR] Ac [COLOR=Navy]End[/COLOR] If [COLOR=Navy]Next[/COLOR] j [COLOR=Navy]Next[/COLOR] i [COLOR=Navy]With[/COLOR] CreateObject("scripting.dictionary") .CompareMode = vbTextCompare [COLOR=Navy]For[/COLOR] n = 1 To UBound(Ray, 1) jj = IIf(IsNumeric(Mid(Ray(n, 1), 2, 1)), 1, 2) oTx = Left(Ray(n, 1), jj) [COLOR=Navy]If[/COLOR] Not .Exists(oTx) [COLOR=Navy]Then[/COLOR] .Add oTx, Array(n, 0) [COLOR=Navy]Else[/COLOR] Q = .Item(oTx) Q(1) = n .Item(oTx) = Q [COLOR=Navy]End[/COLOR] If [COLOR=Navy]Next[/COLOR] [COLOR=Navy]For[/COLOR] [COLOR=Navy]Each[/COLOR] K [COLOR=Navy]In[/COLOR] .keys [COLOR=Navy]For[/COLOR] i = .Item(K)(0) To .Item(K)(1) [COLOR=Navy]For[/COLOR] j = i To .Item(K)(1) [COLOR=Navy]If[/COLOR] Val(Mid(Ray(j, 1), Len(K) + 1)) < Val(Mid(Ray(i, 1), Len(K) + 1)) [COLOR=Navy]Then[/COLOR] [COLOR=Navy]For[/COLOR] Ac = 1 To Lst Temp = Ray(i, Ac) Ray(i, Ac) = Ray(j, Ac) Ray(j, Ac) = Temp [COLOR=Navy]Next[/COLOR] Ac [COLOR=Navy]End[/COLOR] If [COLOR=Navy]Next[/COLOR] j [COLOR=Navy]Next[/COLOR] i [COLOR=Navy]Next[/COLOR] K [COLOR=Navy]End[/COLOR] With Range("A1").Resize(UBound(Ray), Lst) = Ray [COLOR=Navy]End[/COLOR] [COLOR=Navy]Sub[/COLOR]
[COLOR="Navy"]Sub[/COLOR] MG11Jul55
[COLOR="Navy"]Dim[/COLOR] nStr [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]String,[/COLOR] num [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Long,[/COLOR] Q [COLOR="Navy"]As[/COLOR] Variant, Ray(), c [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Long[/COLOR]
[COLOR="Navy"]Dim[/COLOR] Rng [COLOR="Navy"]As[/COLOR] Range, Dn [COLOR="Navy"]As[/COLOR] Range
[COLOR="Navy"]Set[/COLOR] Rng = Range(Range("A2"), Range("A" & Rows.Count).End(xlUp))
[COLOR="Navy"]With[/COLOR] CreateObject("scripting.dictionary")
.CompareMode = vbTextCompare
[COLOR="Navy"]For[/COLOR] [COLOR="Navy"]Each[/COLOR] Dn [COLOR="Navy"]In[/COLOR] Rng
num = GetDigits(Dn.Value)
nStr = Left(Dn.Value, Len(Dn.Value) - Len(CStr(num)))
[COLOR="Navy"]If[/COLOR] Not .Exists(nStr) [COLOR="Navy"]Then[/COLOR]
ReDim Ray(0 To Rng.Count)
Ray(0) = num
.Add nStr, Array(Dn, Ray, 0)
[COLOR="Navy"]Else[/COLOR]
Q = .Item(nStr)
[COLOR="Navy"]Set[/COLOR] Q(0) = Union(Q(0), Dn)
Q(2) = Q(2) + 1
Q(1)(Q(2)) = num
.Item(nStr) = Q
[COLOR="Navy"]End[/COLOR] If
[COLOR="Navy"]Next[/COLOR] Dn
[COLOR="Navy"]Dim[/COLOR] K [COLOR="Navy"]As[/COLOR] Variant
[COLOR="Navy"]For[/COLOR] [COLOR="Navy"]Each[/COLOR] K [COLOR="Navy"]In[/COLOR] .keys
.Item(K)(0).Value = Application.Transpose(.Item(K)(1))
.Item(K)(0).Sort .Item(K)(0)(1)
[COLOR="Navy"]For[/COLOR] [COLOR="Navy"]Each[/COLOR] Dn [COLOR="Navy"]In[/COLOR] .Item(K)(0)
Dn.Value = K & Dn.Value
[COLOR="Navy"]Next[/COLOR] Dn
[COLOR="Navy"]Next[/COLOR] K
[COLOR="Navy"]End[/COLOR] With
[COLOR="Navy"]End[/COLOR] [COLOR="Navy"]Sub[/COLOR]
Function GetDigits(strAlNum [COLOR="Navy"]As[/COLOR] String) [COLOR="Navy"]As[/COLOR] Variant
[COLOR="Navy"]Dim[/COLOR] X [COLOR="Navy"]As[/COLOR] [COLOR="Navy"]Long[/COLOR]
[COLOR="Navy"]For[/COLOR] X = 1 To Len(strAlNum)
[COLOR="Navy"]If[/COLOR] Mid(strAlNum, X, 1) Like "#" [COLOR="Navy"]Then[/COLOR] GetDigits = GetDigits & Mid(strAlNum, X, 1)
[COLOR="Navy"]Next[/COLOR]
[COLOR="Navy"]End[/COLOR] Function
Function PadNum(sInp As String, Optional iLen As Long = 1) As String
' shg 2003
' Expands numbers in a string to iLen characters for sorting; e.g.,
' PadNum("13A1U3", 2) returns "13A01U03"
' PadNum("1.2.3.15", 3) returns "001.002.003.015"
' Numbers are not shortened below their minimal representation:
' PadNum("1.123.2.3", 2) = "01.123.02.03"
' Returns unpadded values if iLen <= 1 or omitted
' PadNum("01.123.02.03") = "1.123.2.3"
' Digit strings longer that 15 digits are not modified, because
' formatting would cause loss of digits
' All characters other than digits 0-9 are returned as-is
Dim sFmt As String ' format string
Dim sChr As String ' a character in sInp
Dim iChr As Long ' character index to sInp
Dim sNum As String ' digit string from sInp
sFmt = String(IIf(iLen < 1, 1, IIf(iLen > 15, 15, iLen)), "0")
For iChr = 1 To Len(sInp) + 1 ' the +1 flushes a trailing number
sChr = Mid$(sInp, iChr, 1)
If sChr Like "#" Then
sNum = sNum & sChr
Else
If Len(sNum) Then
PadNum = PadNum & IIf(Len(sNum) <= 15, Format$(sNum, sFmt), sNum)
sNum = vbNullString
End If
PadNum = PadNum & sChr
End If
Next iChr
End Function
A | B | C | |
1 | Before | Sort | |
2 | C1 | C01 | B2: =PadNum(A2, 2) |
3 | C10 | C10 | |
4 | C11 | C11 | |
5 | C12 | C12 | |
6 | C13 | C13 | |
7 | C14 | C14 | |
8 | C15 | C15 | |
9 | C16 | C16 | |
10 | C17 | C17 | |
11 | C18 | C18 | |
12 | C19 | C19 | |
13 | C2 | C02 | |
14 | C3 | C03 | |
15 | C4 | C04 | |
16 | C5 | C05 | |
17 | C6 | C06 | |
18 | C7 | C07 | |
19 | C8 | C08 | |
20 | C9 | C09 | |
21 | CB1 | CB01 | |
22 | CB10 | CB10 | |
23 | CB11 | CB11 | |
24 | CB12 | CB12 | |
25 | CB13 | CB13 | |
26 | CB14 | CB14 | |
27 | CB15 | CB15 | |
28 | CB16 | CB16 | |
29 | CB17 | CB17 | |
30 | CB18 | CB18 | |
31 | CB19 | CB19 | |
32 | CB2 | CB02 | |
33 | CB20 | CB20 | |
34 | CB3 | CB03 | |
35 | CB4 | CB04 | |
36 | CB5 | CB05 | |
37 | CB6 | CB06 | |
38 | CB7 | CB07 | |
39 | CB8 | CB08 | |
40 | CB9 | CB09 |
Daz, I can't quickly see quite how that codes works (Its a long time ago !!), so I've written another one. At the moment its just for column "A", give it a try, if its OK, I'll add to cover other columns.
Regards MickCode:[COLOR=Navy]Sub[/COLOR] MG11Jul55 [COLOR=Navy]Dim[/COLOR] nStr [COLOR=Navy]As[/COLOR] [COLOR=Navy]String,[/COLOR] num [COLOR=Navy]As[/COLOR] [COLOR=Navy]Long,[/COLOR] Q [COLOR=Navy]As[/COLOR] Variant, Ray(), c [COLOR=Navy]As[/COLOR] [COLOR=Navy]Long[/COLOR] [COLOR=Navy]Dim[/COLOR] Rng [COLOR=Navy]As[/COLOR] Range, Dn [COLOR=Navy]As[/COLOR] Range [COLOR=Navy]Set[/COLOR] Rng = Range(Range("A2"), Range("A" & Rows.Count).End(xlUp)) [COLOR=Navy]With[/COLOR] CreateObject("scripting.dictionary") .CompareMode = vbTextCompare [COLOR=Navy]For[/COLOR] [COLOR=Navy]Each[/COLOR] Dn [COLOR=Navy]In[/COLOR] Rng num = GetDigits(Dn.Value) nStr = Left(Dn.Value, Len(Dn.Value) - Len(CStr(num))) [COLOR=Navy]If[/COLOR] Not .Exists(nStr) [COLOR=Navy]Then[/COLOR] ReDim Ray(0 To Rng.Count) Ray(0) = num .Add nStr, Array(Dn, Ray, 0) [COLOR=Navy]Else[/COLOR] Q = .Item(nStr) [COLOR=Navy]Set[/COLOR] Q(0) = Union(Q(0), Dn) Q(2) = Q(2) + 1 Q(1)(Q(2)) = num .Item(nStr) = Q [COLOR=Navy]End[/COLOR] If [COLOR=Navy]Next[/COLOR] Dn [COLOR=Navy]Dim[/COLOR] K [COLOR=Navy]As[/COLOR] Variant [COLOR=Navy]For[/COLOR] [COLOR=Navy]Each[/COLOR] K [COLOR=Navy]In[/COLOR] .keys .Item(K)(0).Value = Application.Transpose(.Item(K)(1)) .Item(K)(0).Sort .Item(K)(0)(1) [COLOR=Navy]For[/COLOR] [COLOR=Navy]Each[/COLOR] Dn [COLOR=Navy]In[/COLOR] .Item(K)(0) Dn.Value = K & Dn.Value [COLOR=Navy]Next[/COLOR] Dn [COLOR=Navy]Next[/COLOR] K [COLOR=Navy]End[/COLOR] With [COLOR=Navy]End[/COLOR] [COLOR=Navy]Sub[/COLOR] Function GetDigits(strAlNum [COLOR=Navy]As[/COLOR] String) [COLOR=Navy]As[/COLOR] Variant [COLOR=Navy]Dim[/COLOR] X [COLOR=Navy]As[/COLOR] [COLOR=Navy]Long[/COLOR] [COLOR=Navy]For[/COLOR] X = 1 To Len(strAlNum) [COLOR=Navy]If[/COLOR] Mid(strAlNum, X, 1) Like "#" [COLOR=Navy]Then[/COLOR] GetDigits = GetDigits & Mid(strAlNum, X, 1) [COLOR=Navy]Next[/COLOR] [COLOR=Navy]End[/COLOR] Function
A | |
---|---|
2 | FASS2400 |
3 | FASS4371 |
4 | FASS4169 |
5 | FASS059 |
6 | FASS1282 |
7 | FASS505 |
8 | FASS596 |
9 | FASS6092 |
10 | FASS2861 |
11 | FASS4550 |
12 | FASS6388 |
13 | FASS6393 |
A | |
---|---|
2 | 2400 |
3 | 4371 |
4 | 4169 |
5 | FASS059 |
6 | 2400 |
7 | 2400 |
8 | 2400 |
9 | 2400 |
10 | 2400 |
11 | 2400 |
12 | 2400 |
13 | 2400 |