› Sviluppare funzionalita su Microsoft Office con VBA › Ordinare Dati tabella
-
AutoreArticoli
-
Ciao ragazzi sono di nuovo a chiedere il vostro aiuto avrei questo codice perfettamente funzionante
Sub SOMMA() Dim rng As Range, r As Range Dim j As Integer Worksheets("Ordine Rame").Select Range("L2").FormulaR1C1 = "=RC[1]+RC[2]" Range("L2").AutoFill Destination:=Range("L2:L29"), Type:=xlFillDefault Range("K2:K29").Value = Range("L2:L29").Value Range("M2:M29").Value = Range("L2:L29").Value Set r = Range("B35:BA35").Find(What:=Range("E11").Value, LookIn:=xlValues, LookAt:=xlWhole) If Not r Is Nothing Then For j = 1 To Range("AM2").End(xlDown).Row - 1 Cells(r.Row + j, r.Column) = Cells(r.Row + j, r.Column) + Range("AM" & j + 1) Next j End If With Sheets("PROVA CARICHI") Set rng = .Range("B35:BA35").Find(What:=.Range("B5").Value, LookIn:=xlValues, LookAt:=xlWhole) 'cerca la settimana rng.Offset(1, 0) = rng.Offset(1, 0) + .Range("H2") 'somma alla cella sottostante il valore rng.Offset(5, 0) = rng.Offset(5, 0) + .Range("N2") 'somma alla cella sottostante il valore rng.Offset(8, 0) = rng.Offset(8, 0) + .Range("O2") 'somma alla cella sottostante il valore rng.Offset(11, 0) = rng.Offset(11, 0) + .Range("P2") 'somma alla cella sottostante il valore rng.Offset(14, 0) = rng.Offset(14, 0) + .Range("Q2") 'somma alla cella sottostante il valore End With Call EsportaDati Worksheets("MASCHERA RICERCA").Select Range("K6").Select MsgBox ("Quantitˆ Filo Aggiunta") Set rng = Nothing: Set r = Nothing Range("M8") = Range("k6") End SubVorrei aggiungere questo pezzo ( che ho registrato quindi sicuramente andrà modificato )
Sub ORDINA() ' ' ORDINA Macro ' ' ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort. _ SortFields.Clear ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort. _ SortFields.Add2 Key:=Range("Tabella2[[#All],[STATORE]]"), SortOn:= _ xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort. _ SortFields.Clear ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort. _ SortFields.Add2 Key:=Range("Tabella2[[#All],[CLIEN]]"), SortOn:= _ xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort. _ SortFields.Clear ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort. _ SortFields.Add2 Key:=Range("Tabella2[[#All],[SCAD]]"), SortOn:= _ xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ActiveWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2").Sort .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Range("A2").Select End SubChe in pratica va ad ordinare i dati della tabella eseguendo un ordine crescente per 3 colonne.
Qualcuno può aiutarmi ?
Grazie mille a tutti
Dimenticavo l'operazione deve essere effettuata prima della call EsportaDati
Ciao, prova a vedere se ho capito (avevo un tuo vecchio allegato così ho fatto delle prove)
Inserisci questo codice dopo End Sub della Sub SOMMA() e prima dell'inizio di Private Sub EsportaDati()
Private Sub Ordina_ElencoOrdini() Dim lo As ListObject Set lo = ThisWorkbook.Worksheets("Elenco Ordini").ListObjects("Tabella2") lo.Sort.SortFields.Clear lo.Sort.SortFields.Add _ Key:=lo.ListColumns(1).Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal lo.Sort.SortFields.Add _ Key:=lo.ListColumns(7).Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal lo.Sort.SortFields.Add _ Key:=lo.ListColumns(8).Range, SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With lo.Sort .Header = xlYes .MatchCase = False .Apply End With Set lo = Nothing End SubPoi nella Sub SOMMA(), prima di Call EsportaDati ci metti questo:
Call Ordina_ElencoOrdiniHo provato a fare come mi hai detto ma non funziona, viene selezionata tutta la tabella contenente i dati da ordinare ( esclusa la riga appena creata ) ma non viene ordinata...
E se provo a cancellare tutti i dati della tabella i dati vengono copiati nella riga 68 invece di partire dalla riga 1... e i dati vengono copiati sempre sulla stessa riga sovrapponendoli....
Prova ad allegare il file con il tentativo che hai fatto nel copiare ed incollare il codice. Eventualmente spiega pure i passaggi che portano a far lanciare la macro SOMMA
Ecco il file allegato...
Ho notato che la data viene inserita in formato diverso da quella originale ( mette prima il mese poi il giorno )
Allegati:
You must be logged in to view attached files.La macro somma viene lanciata premendo il pulsante aggiungi produzione presente nel foglio maschera ricerca
L'ordine che dai alla Tua tabella è differente che riordinare usando le tre scelte assieme.
Inserisci questo codice in un ModuloDopo prima di call EsportaDati inserisci Call Ordina
Sub ORDINA() Dim ws As Worksheet: Set ws = Worksheets("Elenco Ordini") Dim Ur Ur = ws.Range("A" & Rows.Count).End(xlUp).Row ws.Sort.SortFields.Clear ws.Sort.SortFields.Add2 Key:=ws.Range("A1:A" & Ur), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ws.Sort .SetRange Range("A1:H" & Ur) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ws.Sort.SortFields.Clear ws.Sort.SortFields.Add2 Key:=ws.Range("G1:G" & Ur), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ws.Sort .SetRange Range("A1:H" & Ur) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With ws.Sort.SortFields.Clear ws.Sort.SortFields.Add2 Key:=ws.Range("H1:H" & Ur), SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal With ws.Sort .SetRange Range("A1:H" & Ur) .Header = xlYes .MatchCase = False .Orientation = xlTopToBottom .SortMethod = xlPinYin .Apply End With Set ws = Nothing End SubCiao @Ale.1989
andiamo per gradi. Tu hai detto che l'ordinamento della Tabella deve avvenire prima dell'inserimento nel Foglio "Elenco Ordini" però in questo modo è normale che succede che l'ultimo record inserito non verrà ordinato. Quindi penso che devi prima inserire il nuovo record e poi lanciare la procedura di ordinamento della tabella.
Per quanto riguarda la storia della data sbagliata...quello è abbastanza normale e frequente. Sistemiamo quel comportamento così:
nella Sub EsportaDati sostituisci il ciclo For i....Next con questo:
......... ......... For i = LBound(arr) To UBound(arr) If IsDate(wsMR.Range(arr(i)).Value) Then .Cells(urNR + 1, i + 1).Value = CDate(wsMR.Range(arr(i))) .Cells(urNR + 1, i + 1).NumberFormat = "dd/mm/yyyy" Else .Cells(urNR + 1, i + 1).Value = wsMR.Range(arr(i)).Value End If Next i ......... .........Poi togli quel
Range("A1").Selectprima diEnd Withnella Sub Ordina_ElencoOrdini e scrivi subito dopo End With:Worksheets("Elenco Ordini").Activate lo.DataBodyRange.Cells(1, 1).SelectInoltre per migliorare ancora, nella Sub SOMMA inserisci
Application.ScreenUpdating = Falsedopo la dichiarazione delle variabili eApplication.ScreenUpdating = Truepoco prima diEnd SubPoi, il codice che Ordina la Tabella funziona così:
Ordina prima la colonna STATORE dal più piccolo al più grande, poi a parità di dimensioni ordina la colonna CLIEN sempre in ordine alfabetico (quindi se hai 2 STATORE = 110x55 dove uno ha come CLIEN NERI e l'altro CIGNI...verrà ordinato prima CIGNI poi NERI), infine a parità di STATORE e CLIEN, verrà ordinata la colonna SCAD
Perciò è normale che ti potresti trovare nella condizione che nonostante ci siano più STATORI uguali, potrebbe ordinarsi prima la data più recente proprio perché nel frattempo va prima a ordinare la colonna CIEN in ordine alfabetico
Vedo che CIGNI non risulta ordinato, secondo me l'ordine giusto è CLIEN-STATORE-SCAD
Ciao @raffaele53
@Ale.1989 utilizza una ListObject, forse sarebbe meglio sfruttare metodi e proprietà delle ListObject.
Poi io avevo inteso che l'O.P. volesse ordinare prima la colonna A, poi dopo il primo ordinamento, creare il secondo ordinamento in base alla colonna G ed infine, a seguito di questo ulteriore ordinamento, ordinare ancora in base alla colonna H.
Con il tuo metodo ho notato che ordina la colonna A...poi dimentica quest'ordine e passa a ordinare la colonna G, dimentica anche la colonna G e ordina la colonna H.
Quindi si ottiene come risultato che ordina solo per la colonna H.
Almeno così ho notato....
Ciao ragazzi forse ho risolto modificando l'ordine degli ordinamenti delle colonne ( parto dalla colonna 8 poi alla 7 poi alla 1)
Tutto il resto funziona perfettamente, l'unico accorgimento che devo usare e una volta esauriti gli ordini di non cancellare tutte le righe della tabella perché altrimenti mi va in errore.
Allego il file con le modifiche apportate
Allegati:
You must be logged in to view attached files.Quindi volevi che si ordinasse prima per date, poi per Client e infine per Statore?
l'unico accorgimento che devo usare e una volta esauriti gli ordini di non cancellare tutte le righe della tabella perché altrimenti mi va in errore.
Che errore ti da? Hai accennato al fatto che quando cancelli i dati in tabella poi i nuovi inserimenti ripartono non dal rigo 2. Quello accade perché stai utilizzando un ListObject (Tabella). Per gestire il primo rigo vuoto in ListObject ci vuole un approccio diverso. Se il problema è questo...che hai risolto il problema dell'ordinamento (che è l'oggetto della discussione), apri un nuovo Thread che riguarda la gestione del primo rigo vuoto. Al riguardo già dovrei avere una soluzione.
Si l'ordinamento, che prima eseguivo manualmente tramite le frecce, segue queste regole, prima ordina lo statore poi ordina il cliente e infine ordina la data così da avere per prime le righe con scadenza pià ravvicinata e a parità di scadenza il primo cliente in ordine alfabetico e a parità di questi 2 fattori lo statore dal più piccolo al più grande...
Allora procedo alla chiusura di questo thread e ne apro uno solo per la gestione del primo rigo...
-
AutoreArticoli
