|
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
|
|
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
|
|
Rank: Member
Iscritto dal : 4/23/2010 Posts: 20
|
Iniziano sempre per "0"
|
|
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
|
|
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
|
|
Rank: Member
Iscritto dal : 4/23/2010 Posts: 20
|
...
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve non hai letto la risposta successiva. saluti giap
|
|
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!!
|
|
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!! PS Grazie ancora per il tuo aiuto sto imparando un sacco di cose.
|
|
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
|
|
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!!!
|
|
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
|
|
Rank: Member
Iscritto dal : 4/23/2010 Posts: 20
|
Vediamo se così riesco a spiegarmi!! 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
|
|
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
|
|
Rank: Member
Iscritto dal : 4/23/2010 Posts: 20
|
La, provo subito.
FUNZIONA ALLA PERFEZIONE!!
Grazie
|
|
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
|
|
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
|
|
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?
|
|
Guest |