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

Excel ordinare lettere numeri Opzioni
marpar
Inviato: Thursday, May 06, 2010 1:18:23 PM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Hai ragione, volevo essere più preciso invece mi sono spiegato come un libro chiuso....
Forse un file grafico renderà tutto più chiaro:




Vorrei che le celle riquadrate in rosso non venissero scritte nel file emn.emn e/o *.emn.
Ciao

a10n11
Inviato: Thursday, May 06, 2010 2:32:21 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
dall'immagine non si legge quanto necessario per capire.

Le righe segnate in rosso, hanno tutte lo stesso valore?
Iniziano sempre con un carattere particolare?
occupano solo la prima colonna?
saluti
Giap

marpar
Inviato: Thursday, May 06, 2010 2:41:49 PM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Iniziano sempre per "0"
a10n11
Inviato: Thursday, May 06, 2010 2:49:50 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
prova a modificare questa parte della macro:

For n = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(n, 1).Value = """0""" Then Exit For
Buffer = Buffer & Cells(n, 1).Value & vbCrLf
Next n

Ho messo il ciclo sulla colonna A prevedendo che i dati da riversare siano sulla colonna A e non la colonna C
come nella macro originaria.

saluti
Giap

a10n11
Inviato: Thursday, May 06, 2010 2:54:50 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
meglio ancora nel caso che i caratteri "0" non siano il valore conplessivo della cella ma solo i caratteri iniziali:

For n = 1 To Cells(Rows.Count, 1).End(xlUp).Row
If Cells(n, 1).Value = """0""" Or Left(Cells(n, 1), 3) = """0""" Then Exit For
Buffer = Buffer & Cells(n, 1).Value & vbCrLf
Next n

saluti
Giap

marpar
Inviato: Thursday, May 06, 2010 3:07:58 PM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
...
a10n11
Inviato: Thursday, May 06, 2010 3:18:05 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
non hai letto la risposta successiva.
saluti
giap

marpar
Inviato: Thursday, May 06, 2010 3:25:10 PM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Ho moficato la macro sia perchè gestisto la colonna O e non la A e poi perchè faccio riferimento a file *.emn, ma purtroppo continua ad inserire anche le stringhe che cominciano per "0"


Sub RIMPIAZZA()
Dim f As Integer
Dim RigaTesto As String
Dim Buffer As String
miapath = ActiveWorkbook.Path
ChDir miapath
fs = Dir("*.emn")
f = FreeFile
Open fs For Input As #f
Do While Not EOF(f)
Input #f, RigaTesto
If RigaTesto <> ".PLACEMENT" Then
Buffer = Buffer & RigaTesto & vbCrLf
End If
If RigaTesto = ".PLACEMENT" Then
CTRL = True
Exit Do
End If
Loop
Buffer = Buffer & ".PLACEMENT" & vbCrLf
For n = 1 To Cells(Rows.Count, 15).End(xlUp).Row 'modificata uso colonna O
If Cells(n, 15).Value = """0""" Or Left(Cells(n, 15), 3) = """0""" Then Exit For 'modificata uso colonna O
Buffer = Buffer & Cells(n, 15).Value & vbCrLf 'modificata uso colonna O
Next n
Do While Not EOF(f)
Input #f, RigaTesto
If RigaTesto = ".END_PLACEMENT" Then CTRL = False
If Not CTRL Then
Buffer = Buffer & RigaTesto & vbCrLf
End If
Loop
Close f
Open fs For Output As #f
Print #f, Buffer
Close f
End Sub


Si!! Non avevo letto, adesso è perfetta!!
marpar
Inviato: Thursday, May 06, 2010 3:37:39 PM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Tornando alla macro che ordina lettere e numeri che funziona a meraviglia!!
Qualora volessi apportare due mofiche:
1. Usare come colonne d'appoggio non B-C ma E-F poichè le prime quattro sono occupate dai dati.
2. Come avviene per ordina con riferimento colonna C (vedi immagine) ordinare anche A-B-D, questo semplificherebbe molto la mia MACRO generale nella quale al momento faccio uso della funzione "INDICE - CONFRONTA" proprio perchè non riesco a riordinare adeguatamente i dati che devo comfrontare con un altro file.



Spero di essermi spiegato!!Anxious

PS Grazie ancora per il tuo aiuto sto imparando un sacco di cose.

a10n11
Inviato: Thursday, May 06, 2010 7:33:18 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
questa che segue è la parte da cambiare:

....
Cl.Offset(0, 5).Value = NR
Cl.Offset(0, 4).Value = ABC
NR = ""
ABC = ""
Next
Set Area = Nothing
Set Area = .Range("A1", .Range("F1").End(xlDown))
Area.Sort Key1:=Range("E1"), Order1:=xlAscending, Key2:=Range("F1") _
, Order2:=xlAscending
.........
saluti
Giap

marpar
Inviato: Friday, May 07, 2010 8:53:04 AM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Grazie x la dritta ma le cose da modificare erano un po' di più, le evidenzio così che tu possa verificarle velocemente.


Sub Ordina_EMN()
Dim Area As Range, AreaO As Range
Dim Cl As Range, i As Long, ABC As String, NR As String
Application.ScreenUpdating = False
With Sheets("foglio1")
Set Area = .Range("c1", .Range("c1").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 = Mid(Cl, 1, 1)
End If
Next
Cl.Offset(0, 3).Value = NR
Cl.Offset(0, 2).Value = ABC
NR = ""
ABC = ""
Next
Set Area = Nothing
Set Area = .Range("A1", .Range("F1").End(xlDown))
Area.Sort Key1:=Range("E1"), Order1:=xlAscending, Key2:=Range("F1") _
, Order2:=xlAscending
Set Area = Nothing
Columns("E:F").ClearContents
End With
Application.ScreenUpdating = True
End Sub



Riordina ma purtroppo male (magari nel provare a sistemarlo ho fatto casino), credo che uno dei motivi ci era sfuggitto in precedenza perchè non contemplato nella lista alfanumerica (vedi immagine sotto per chiarezza).
Quando la stringa alfanumerica inizia con 2 lettere seguite da numeri non viene riordinata correttamente.



CN1E andrebbe alla fine dei componenti C e non in quella posizione.
Come si può sistemare la macro?
Ciao

PS C'è anche altro, guardando C1 e C2 è chiaro che C1R andrebbe dopo e naturalmente soffrono dello stesso problema tutti i componenti che seguono!!!


a10n11
Inviato: Friday, May 07, 2010 9:41:20 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
marpar ha scritto:
Grazie x la dritta ma le cose da modificare erano un po' di più, le evidenzio così che tu possa verificarle velocemente.


Salve
Fin dall'inizio la macro gestata la colonna A se cambi la posizione della tabella io non posso essere nella tua testa.
per la cancellazione delle colonne di appoggio ci sei arrivato da solo.


marpar ha scritto:

Riordina ma purtroppo male (magari nel provare a sistemarlo ho fatto casino), credo che uno dei motivi ci era sfuggitto in precedenza perchè non contemplato nella lista alfanumerica (vedi immagine sotto per chiarezza).
Quando la stringa alfanumerica inizia con 2 lettere seguite da numeri non viene riordinata correttamente.
CN1E andrebbe alla fine dei componenti C e non in quella posizione.
Come si può sistemare la macro?
Ciao


Non era sfuggito! non era stato dichiarato che potesse esserci una situazione di quel tipo.
fai questa modifica:

If IsNumeric(Mid(Cl, i, 1)) Then
NR = NR & Mid(Cl, i, 1)
Else
ABC = ABC & Mid(Cl, i, 1)
End If


marpar ha scritto:

PS C'è anche altro, guardando C1 e C2 è chiaro che C1R andrebbe dopo e naturalmente soffrono dello stesso problema tutti i componenti che seguono!!!


????

Saluti
Giap


marpar
Inviato: Friday, May 07, 2010 10:27:40 AM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Vediamo se così riesco a spiegarmi!!Anxious

Allego un file dove nelle colonne ABCD ci sono i dati da riordinare come arrivano dal file e nella colonna F il risultato che si dovrebbe ottenere (nel file è presente una macro che riporta tutte le modifiche fino ad ora).

Ciao Grazie


a10n11
Inviato: Saturday, May 08, 2010 10:10:22 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
nella speranza che il file allegato rappresenti tutte le variabile della costruzione del codice, questa che segue è la modifica della macro.
Nota che ho aggiunto anche la colonna G come area di appoggio quindi accertati che sia vuota.
Se accetti un consiglio da uno che conosce la gestione dei codici aziendali, taglia le mani a chi ha costruito la chiave di lettura dei tuoi codici.

Sub Ordina_EMN()
Dim Area As Range, AreaO As Range
Dim Cl As Range, i As Long, ABC As String, NR As String
Application.ScreenUpdating = False
With Sheets("foglio1")
Set Area = .Range("c1", .Range("c1").End(xlDown))
For Each Cl In Area
If Not IsNumeric(Right(Cl, 1)) Then
LABC = Right(Cl, 1)
Else: LABC = "Z"
End If
For i = 1 To Len(Cl)
If IsNumeric(Mid(Cl, i, 1)) Then
NR = NR & Mid(Cl, i, 1)
Else
par = IIf(Len(Cl) >= 5, 3, 2)
If i <= par Then
ABC = ABC & Mid(Cl, i, 1)
End If
End If
Next
Cl.Offset(0, 3).Value = NR
Cl.Offset(0, 2).Value = ABC
Cl.Offset(0, 4).Value = LABC
NR = ""
ABC = ""
Next
Set Area = Nothing
Set Area = .Range("A1", .Range("G1").End(xlDown))
Area.Sort Key1:=.Range("E1"), Order1:=xlAscending, Key2:=.Range("F1") _
, Order2:=xlAscending, Key3:=.Range("G1"), Order1:=xlAscending
Set Area = Nothing
.Columns("E:G").ClearContents
End With
Application.ScreenUpdating = True
End Sub
saluti
Giap

marpar
Inviato: Saturday, May 08, 2010 11:08:06 AM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
La, provo subito.

FUNZIONA ALLA PERFEZIONE!!

Grazie
marpar
Inviato: Tuesday, May 11, 2010 11:56:03 AM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Funziona tutto tranne un piccolo particolare, succede una cosa strana con la macro Sub RIMPIAZZA().
Una zona del file, che tra l'altro non dovrebbe essere interessata dalle modifiche perché posizionata prima dei due delimitatori (".PLACEMENT" e ".END_PLACEMENT") viene modificata cosi:

Da:
"*.pcb" MM

Diventa:
*.pcb
MM

Purtroppo non è un problema da poco perchè quel MM determina in fase di import, del file generato, un errore di scala nel software CAD.
Credo che abbia a che fare con la codifica del file, questo simbolo (") in excel viene interpretato come "qualificatore di testo" (vedi immagine sitto), ho fatto una prova stupida, ho aggiunto un punto davanti a "*.pcb" MM ---> ."*.pcb" MM, così viene formattato correttamente ma la presenza di quel punto genera comunque l'errore in fase di import nel programma CAD (non considerando il fatto che dovrei editarlo manualmente).

Idee?
Ciao
a10n11
Inviato: Tuesday, May 11, 2010 2:16:19 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
dall'help del programma in merito all'istruzione Input

"Nota Con l'instruzione Input # non utilizzare stringhe in cui sono incorporate virgolette doppie. La stringa "1,2""X", ad esempio, viene analizzata come se se si trattasse di due stringhe complete distinte."

pertanto l'unica soluzione che mi viene in mente è quella di anteporre un apice (') al doppio apice.

saluti
Giap



marpar
Inviato: Tuesday, May 11, 2010 2:38:12 PM

Rank: Member

Iscritto dal : 4/23/2010
Posts: 20
Grazie Giap. Ma l'apice (') dovrei aggiungerlo a manina?

Ho fatto una prova scema, ho registrato una macro facendo finta di importare un file di testo >> Delimitato >> Qualificatore di testo >> nessuno.

Questo è il listato:
Commenta:
Sub qualificatore()
Workbooks.OpenText Filename:= _
"C:\Documents and Settings\Administrator\Desktop\PROVA FINALE\Intestazione.txt" _
, Origin:=xlMSDOS, StartRow:=1, DataType:=xlDelimited, TextQualifier:= _
xlNone
, ConsecutiveDelimiter:=False, Tab:=True, Semicolon:=False, Comma _
:=False, Space:=False, Other:=False, FieldInfo:=Array(1, 1), _
TrailingMinusNumbers:=True
End Sub


Esiste il modo di implementare Textqualifier nella macro RIMPIAZZA?
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.