Aiutamici Forum
Benvenuto Ospite Cerca | Topic Attivi | Utenti | | Log In | Registra

Ordinamento dati alfanumerici in Excel Opzioni
p.mael
Inviato: Thursday, February 21, 2008 4:31:50 PM
Rank: Member

Iscritto dal : 12/12/2000
Posts: 1
Buongiorno a tutti.
Ho una semplice (ma complicata per me) domanda.
Devo ordinare in Excel dei dati misti tra lettere e numeri, ma l'ordinamento standard non fa al caso mio: mi spiego.

Da una serie di dati, ad esempio 1 2 3 4 5 11 50 111 1A 1B 1C 2A 2B 2C 11A 11B etc... l'ordinamento standard mi propone questa sequenza: 1 11 111 11A 11B 1A 1B 1B 2 2A 2B 2C 3 4 5 50.
Quella di cui io ho invece bisogno è prettamente numerica, come se la lettera dopo il numero non contasse, ovvero: 1 1A 1B 1C 2 2A 2B 2C 3 4 5 11 11A 11B 50 111.

Mi hanno detto che con una macro è possibile farlo, ma non ci ho mai messo mano. Chi di voi risolve per primo il mio dilemma?
Grazie a tutti per la collaborazione.
Sponsor
Inviato: Thursday, February 21, 2008 4:31:50 PM

 
a10n11
Inviato: Thursday, February 21, 2008 10:10:35 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
una macro potrebbe essere quella che segue:
La macro considera che i valori da ordinare siano nella colonna A e che le colonne B e C siano vuote perchè vengono utilizzate come appoggio dalla macro. Quindi per vedere il funzionamento prova a inserire in un foglio vuoto (Foglio1) i valori di prova
1 2 3 4 5 11 50 111 1A 1B 1C 2A 2B 2C 11A 11B da cella A1 in giù esegui la macro e vedi se il risultato è quello voluto.

Sub OrdinaNumeriLettere()
Dim Area As Range, AreaO As Range
Dim Cl As Range, i As Long, ABC As String, NR As String
With Sheets("foglio1")
Set Area = .Range("a1", .Range("a1").End(xlDown))
For Each Cl In Area
For i = 1 To Len(Cl)
If IsNumeric(Mid(Cl, i, 1)) Then
NR = NR & Mid(Cl, i, 1)
Else
ABC = ABC & Mid(Cl, i, 1)
End If
Next
Cl.Offset(0, 1).Value = NR
Cl.Offset(0, 2).Value = ABC
NR = ""
ABC = ""
Next
Set Area = Nothing
Set Area = .Range("B1", .Range("d1").End(xlDown))
Area.Sort Key1:=Range("B1"), Order1:=xlAscending

Set AreaO = .Range("B1", .Range("B1").End(xlDown))
For Each Cl In AreaO
If Cl.Offset(0, 1).Value <> "" Then
Cl.Offset(0, -1).Value = Cl.Value & Cl.Offset(0, 1).Value
Else
Cl.Offset(0, -1).Value = Cl.Value
End If
Next Cl
Area.ClearContents
Set Area = Nothing
Set AreaO = Nothing
End With
End Sub

saluti
Andrea

p.mael
Inviato: Friday, February 22, 2008 9:13:44 AM
Rank: Member

Iscritto dal : 12/12/2000
Posts: 1
Grazie Andrea,
Ho provato la macro ma per ora non ci siamo per alcune cose che non avevo segnalato per non complicare troppo.
Provo a spiegarmi meglio.

Innanzitutto, c'è una seconda colonna che devo ordinare tenendola linkata alla prima.
Inoltre ho anche delle celle con sole lettere e con lettere + numeri.
Faccio l'esempio reale e non teorico come avevo inizialmente scritto, così da essere il piu' chiaro possibile: sono 2 colonne

codice pagina
2846 A1-10
11150001 A1-15
10 A1-20
1680FG A1-20
1473 A1-20
G5 A/B A2-10
G5 C A2-10
G4 A A2-20
G4 B A2-30
351ZB A2-300
SP1 A3-10
GAB B1-20

ora ordinata per pagina, devo ordinarla per codice:

10 A1-20
351ZB A2-300
1473 A1-20
1680FG A1-20
2864 A1-10
11150001 A1-15
G4 A A2-20
G4 B A2-30
G5 A/B A2-10
G5 C A2-10
GAB B1-20
SP1 A3-10


In sostanza l'ordine deve essere prima numerico (ignorando le lettere dopo il codice), poi alfabetico-numerico, poi alfabetico-alfabetico.

Grazie ancora.



Brick wall note: nonostante metta tanti spazi NON si riesce a capire che codice e pagina sono 2 colonne diverse!!! La pagina inizia per A1 A2 A3 B1 (nell'esempio)


a10n11
Inviato: Friday, February 22, 2008 10:10:53 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
Salve
sarebbe utile postare sempre le domande spiegando tutto senza limitarsi a delle esemplificazioni che poi si dimostrano
non pertinenti o incomplete.
Prova ad eseguire questo codice. (In questo caso la colonna d'appoggio è la colonna "C")


Sub OrdinaNumeriLettere()
Dim Area As Range
Dim Cl As Range, i As Long, NR As String
Dim ctr As Boolean
With Sheets("foglio1")
Set Area = .Range("a1", .Range("a1").End(xlDown))
For Each Cl In Area
For i = 1 To Len(Cl)
If i = 1 And Not IsNumeric(Mid(Cl, i, 1)) Then
Cl.Offset(0, 2).Value = Cl.Value
ctr = 1
Exit For
End If
If IsNumeric(Mid(Cl, i, 1)) Then
NR = NR & Mid(Cl, i, 1)
End If
Next
If Not ctr Then
Cl.Offset(0, 2).Value = NR
NR = ""
End If
ctr = 0
Next
Set Area = Nothing
Set Area = .Range("A1", .Range("C1").End(xlDown))
Area.Sort Key1:=Range("C1"), Order1:=xlAscending
Columns(3).ClearContents
Set Area = Nothing
End With
End Sub

saluti
Andrea


p.mael
Inviato: Friday, February 22, 2008 11:31:22 AM
Rank: Member

Iscritto dal : 12/12/2000
Posts: 1
Caro Andrea Applause
Ho già provato e funziona alla perfezione !!!

Grazie 1000!
Buona giornata.
Utenti presenti in questo topic
Guest


Salta al Forum
Aggiunta nuovi Topic disabilitata in questo forum.
Risposte disabilitate in questo forum.
Eliminazione tuoi Post disabilitata in questo forum.
Modifica dei tuoi post disabilitata in questo forum.
Creazione Sondaggi disabilitata in questo forum.
Voto ai sondaggi disabilitato in questo forum.

Main Forum RSS : RSS

Aiutamici Theme
Powered by Yet Another Forum.net versione 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.