Beh, avevo preparato una risposta ma ora e' in gran parte superata dal tuo messaggio.
ECCOLA LO STESSO, magari c'e' qualche informazione teorica in piu' e una informazione circa la "selezione" di stringhe omogenee.
Ti ripropongo la macro con ricchi commenti
- Codice: Seleziona tutto
Sub mahhh2()
Dim oArr(), LastR As Long, MaxO As Long, nInd As Long
Dim WArr, I As Long, myMatch, Heads
Dim AInd(1 To 12) 'Contiene il puntatore delle 12 colonne di OArr
'
Sheets("5ne").Select
LastR = Cells(Rows.Count, "B").End(xlUp).Row
'Mette in memoria il contenuto di colonna B:
WArr = Range(Cells(2, 2), Cells(LastR, 2)).Value
'L'elenco posizionale delle ruote:
Heads = Array("BA", "CA", "FI", "GE", "MI", "NA", "PA", "RM", "TO", "VE", "RN")
'dimensiona oArr: 12 colonn2 (11 ruote + avanzi), numero righe a crescere:
ReDim oArr(1 To 12, 1 To 1)
'Ciclo di scansione della matrice WARR:
For I = 1 To UBound(WArr)
'Controlla la lunghezza della stringa: min 7 crt
If Len(WArr(I, 1)) > 6 Then
'Analizza le prime 2 lettere e determina la posizione della stringa corrente:
myMatch = Application.Match(Left(WArr(I, 1), 2), Heads, False) 'come funzione Confronta di Excel
If IsError(myMatch) Then myMatch = 12 'Se non l'ha trovata, va tra gli "avanzi"
nInd = AInd(myMatch) + 1 'calcola nuovo Indice
If nInd > MaxO Then 'MaxO contiene la dimensione attuale do OArr
ReDim Preserve oArr(1 To 12, 1 To nInd + 1) '..se serve "allunga OArr
MaxO = nInd '...a aggiorna il nuovo MaxO
End If
oArr(myMatch, nInd) = WArr(I, 1) 'Mette la stringa corrente in OArr, colonna myMatch
AInd(myMatch) = nInd 'Aggiorna l'indice di quella colonna
End If
Next I
'Pulisce B2:Lxx
Sheets("5ne").Range("B2").Resize(LastR, 11).ClearContents
'Pulisce colonna N:
Sheets("5ne").Range("N1").Resize(LastR, 1).ClearContents
'Scrive oArr in B2:Lyy
Sheets("5ne").Range("B2").Resize(UBound(oArr, 2), 11).Value = Application.WorksheetFunction.Transpose(oArr)
'Estrae colonna 12 e la scrive in colonna N:
Sheets("5ne").Range("N2").Resize(UBound(oArr, 2), 1).Value = Application.WorksheetFunction.Index(Application.WorksheetFunction.Transpose(oArr), 0, 12)
End Sub
Non sapendo come sono organizzati e strutturati i tuoi dati la macro esamina una cella alla volta e ne posiziona il contenuto nella colonna 1-11 della matrice oArr in cui creo l'output; la colonna e' determinata tramite un Confronta dell'inizio della cella con l'array HEADS; se la posizione e' indeterminabile quel contenuto va in colonna 12 della matrice oArr
Non conoscendo quante righe max saranno presenti in oArr, la dimensione viene "allungata" all'occorrenza tramire Redim+Preserve
Alla fine scarico in B:L il contenuto delle prime 11 colonne di oArr; poi estraggo la colonna 12 (tramite la funzione Indice di Excel) e la scarico in colonna N
Ti sara' quindi facile eliminare la singola istruzione che scrive gli "avanzi" in colonna N (eliminarli anche da oArr sarebbe una complicazione inutile)
Come detto nei commenti, l'istruzione
If Len(WArr(I, 1)) > 6 Then serve a filtrare le stringhe per una lunghezza minima: visto che non sono riuscito a decodificare la richiesta "Se Stringa mancante la colonna rimane vuota" almeno ignoro le celle che contengono pochi crt (anche se non so se puo' succedere).
Io non so nemmeno se il tuo elenco e' gia' ordinato, cosa che potrebbe suggerire un procedimento diverso, ma non piu' ottimizzato; pertanto la macro procede a sistemare una cella per volta.
La macro si guarda bene dal selezionare le celle, ne' una per una ne' per "stringhe omogenee" (interpretazione mia: che hanno in testa la stessa sigla di ruota). Con 40 celle non sarebbe un problema, ma con 100mila cominceresti ad aspettare 10 minuti.
Siccome pero' questa suddivisione "per stringhe omogenee" esiste nella matrice oArr la puoi estrarre o "puntare" all'occorrenza.
Bisogna pero' tenere presente che in oArr i dati non sono di 12 colonne*N righe, ma di 12 righe*N colonne (perche' Redim Preserve consente di allungare solo "l'ultima" dimensione"
Troverai quindi le info di BA in riga 1, colonna1, colonna2, colonna3,...; quelle di CA in riga 2, colonna1, colonna 2, colonna...; etc
Se vuoi scriverle in una certa posizione puoi fare come faccio con la colonna 12 (gli avanzi) che scrivevo in colonna N; es se vuoi scrivere in B2:Bxx di Foglio1 i risultati di GE, userai
- Codice: Seleziona tutto
Sheets("Foglio1").Range("B2").Resize(UBound(oArr, 2), 1).Value = Application.WorksheetFunction.Index(Application.WorksheetFunction.Transpose(oArr), 0, 4) '4 e' la colonna di GE
Spero ci siano le informazioni che aspettavi...
Ciao