You are here:--Ordinare Dati
Ordinare Dati2019-02-12T17:56:46+02:00

Home Forum Domande su Excel VBA e MACRO Ordinare Dati

  • Autore
    Articoli
  • Avatarfranco56
    Partecipante
      Post totali: 18

      Salve, ho questa  tabella:

      colonna A            colonna B

      codice                   descrizione

      DDT nr.500

      01.01.10               farina 00

      04.01.11               sale

      03.01.01               aceto

      DDT nr.350

      10.10.10               pepe nero

      02.01.08              rosmarino

      01.03.03              pepe rosso

      DDT nr.110

      07.01.00             multicereale

      05.01.05             farina di mais

      Si può avere un ordinamento degli articoli in base ai codici senza modificare le sequenze dei DDT, grazie

       

       

    • everestmiltoneverestmilton
      Partecipante
        Post totali: 6

        Ciao Franco, due cosucce.

        Per aiutare meglio, sarebbe gradito che inserissi il file depurato da tutti gli eventuali dati sensibili.

        “..senza modificare le sequenze DDT”, le cifre sono sempre 3 dopo la sigla, oppure possono essere variabili?

        Ringo

        Excel 2010

        • everestmiltoneverestmilton
          Partecipante
            Post totali: 6

            dimenticavo, quale versione excel usi?

            Ringo

            Excel 2010

        • Avatarfranco56
          Partecipante
            Post totali: 18
          • sidsid
            Moderatore
              Post totali: 718

              Ciao

              Un esempio sicuramente migliorabile

              Sub ORDINA_DDT()
              Dim ws As Worksheet
              Dim nDDT As Integer
              Dim nRiga As Long, j As Long, k As Long
              Dim vTabella As Variant, vArr() As Variant
              Dim rng As Range
              
              Set ws = Sheets("fattura") 'nome tuo foglio
              nRiga = ws.Range("A" & Rows.Count).End(xlUp).Row
              Set rng = ws.Range("B1:B" & nRiga)
              vTabella = rng
              
              'conto i "DDT"
              nDDT = Application.WorksheetFunction.CountIf(rng, "DDT*")
              ReDim Preserve vArr(1 To nDDT, 1 To 2)
              
              'trovo il numero riga delle celle la cui stringa inizia per "DDT",
              'ed imposto i range di ogni DDT
              For j = LBound(vTabella) To UBound(vTabella)
                  If vTabella(j, 1) Like "DDT*" Then
                      k = k + 1
                      If k = 1 Then
                          vArr(k, 1) = j
                      Else
                          vArr(k, 1) = j
                          vArr(k - 1, 2) = j - 1
                      End If
                      If k = nDDT Then
                          vArr(k, 2) = nRiga
                          Exit For
                      End If
                  End If
              Next j
              
              'ordinamento per DDT
              For j = LBound(vArr) To UBound(vArr)
                  ws.Sort.SortFields.Clear
                  ws.Sort.SortFields.Add Key:=ws.Range("A" & vArr(j, 1) + 1 & ":A" & vArr(j, 2)) _
                      , SortOn:=xlSortOnValues, Order:=xlAscending, DataOption:=xlSortNormal
                  With ws.Sort
                      .SetRange ws.Range("A" & vArr(j, 1) & ":B" & vArr(j, 2))
                      .Header = xlYes
                      .MatchCase = False '
                      .Orientation = xlTopToBottom
                      .SortMethod = xlPinYin
                      Application.ScreenUpdating = False
                      .Apply
                      Application.ScreenUpdating = True
                  End With
              Next j
              
              Set rng = Nothing
              Set ws = Nothing
              End Sub
            • Avatarfranco56
              Partecipante
                Post totali: 18

                Ciao Sid,

                non vorrei sbagliare ma il metodo di ordinamento non è supportato in Excel 2003.

              • sidsid
                Moderatore
                  Post totali: 718

                  Infatti hai ragione.
                  Ora non ho il pc sottomano.
                  Appena posso vedo se riesco a trovare una soluzione.

                • sidsid
                  Moderatore
                    Post totali: 718

                    Premeso che non ho più installato il 2003, non ricordo più le istruzioni per ordinare i dati.
                    Dovresti essere così gentile da aiutarmi; sai registrare una macro immagino, quindi dovresti fare questa semplice cosa:
                    – inizia registrazione macro
                    – dal file di esempio che mi hai mandato, seleziona il range A2:B14
                    – ordina la selezione con l’ordine che desideri
                    – stop della registrazione
                    – posta il codice creato

                    In questo moddo dovrei essere in grado di adattare le istruzioni appena create, alla macro che ti ho mandato.
                    Ciao.

                  • Avatarfranco56
                    Partecipante
                      Post totali: 18

                      Sub ordina_range()

                      Range(“A1:B29”).Select
                      Selection.Sort Key1:=Range(“A1”), Order1:=xlAscending, Header:=xlGuess, _
                      OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                      DataOption1:=xlSortNormal
                      End Sub

                      • Questa risposta è stata modificata 6 mesi, 4 settimane fa da Avatar franco56.
                      • Questa risposta è stata modificata 6 mesi, 4 settimane fa da Avatar franco56.
                      • Questa risposta è stata modificata 6 mesi, 4 settimane fa da Avatar franco56.
                    • Avatarfranco56
                      Partecipante
                        Post totali: 18

                        Sub ordina_range()

                        Range(“A1:B29”).Select
                        Selection.Sort Key1:=Range(“A1”), Order1:=xlAscending, Header:=xlGuess, _
                        OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                        DataOption1:=xlSortNormal
                        End Sub

                        • Questa risposta è stata modificata 6 mesi, 4 settimane fa da Avatar franco56.
                      • sidsid
                        Moderatore
                          Post totali: 718

                          Prova così

                          Sub ORDINA_DDT()
                          Dim ws As Worksheet
                          Dim nDDT As Integer
                          Dim nRiga As Long, j As Long, k As Long
                          Dim vTabella As Variant, vArr() As Variant
                          Dim rng As Range
                          
                          Set ws = Sheets("fattura (2)") 'nome tuo foglio
                          nRiga = ws.Range("A" & Rows.Count).End(xlUp).Row
                          Set rng = ws.Range("B1:B" & nRiga)
                          vTabella = rng
                          
                          'conto i "DDT"
                          nDDT = Application.WorksheetFunction.CountIf(rng, "DDT*")
                          ReDim Preserve vArr(1 To nDDT, 1 To 2)
                          
                          'trovo il numero riga delle celle la cui stringa inizia per "DDT",
                          'ed imposto i range di ogni DDT
                          For j = LBound(vTabella) To UBound(vTabella)
                              If vTabella(j, 1) Like "DDT*" Then
                                  k = k + 1
                                  If k = 1 Then
                                      vArr(k, 1) = j
                                  Else
                                      vArr(k, 1) = j
                                      vArr(k - 1, 2) = j - 1
                                  End If
                                  If k = nDDT Then
                                      vArr(k, 2) = nRiga
                                      Exit For
                                  End If
                              End If
                          Next j
                          
                          'ordinamento per DDT
                          For j = LBound(vArr) To UBound(vArr)
                              Set rng = ws.Range("A" & vArr(j, 1) & ":B" & vArr(j, 2))
                              rng.Sort Key1:=rng.Range("A1"), Order1:=xlAscending, Header:=xlGuess, _
                              OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom, _
                              DataOption1:=xlSortNormal
                          Next j
                          
                          Set rng = Nothing
                          Set ws = Nothing
                          End Sub
                        • BySalvBySalv
                          Amministratore del forum
                            Post totali: 505

                            Ciao Prova questo

                            Public Sub OrdE(fg, rp, cop, cof, coo, ord)
                            Dim vert&
                              Application.ScreenUpdating = False
                              Sheets(fg).Select
                              If Cells(rp + 1, cop) = "" Then Exit Sub
                              vert = Cells(Rows.Count, cop).End(xlUp).Row
                              Range(Cells(rp, cop), Cells(vert, cof)).Select
                              If ord = 0 Then
                                  Selection.Sort Key1:=Cells(rp + 1, coo), Order1:=xlAscending, Header:=xlYes, _
                                    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
                              End If
                              If ord = 1 Then
                                  Selection.Sort Key1:=Cells(rp + 1, coo), Order1:=xlDescending, Header:=xlYes, _
                                    OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
                              End If
                              Cells(1, 1).Select
                            End Sub

                            e una macro che accetta parametri, facilmente usabile anche nelle altre macro, il suo comando è questo

                            call OrdE(fg, rp, cop, cof, coo, ord)
                            i parametri sono quelli racchiusi tra parentesi

                            fg = Nome Foglio “Fattura”
                            rp = Riga partenza Compresa l’intestazione
                            cp = Colonna Partenza “in numero”
                            cf = Colonna Fine “in numero” l’ultima colonna dell’elenco
                            coo = Colonna da ordinare “in numero”
                            ord = tipo di ordinamento 0=ascendente, 1=discendente

                            quindi fai la copia in un modulo e quando ti serve scrivi come nel tuo caso, scrivo una macro per lanciarla, ma lo stesso codice puoi inserirlo anche nel VBA

                            Sub Lancia()
                            call OrdE("Fattura",1,1,2,1,0)
                            End Sub 

                            in una macro solo Call ordE(etc…

                            questa è adatta alle versioni precedenti

                            Ciao By Sal :bye:

                          • Avatarfranco56
                            Partecipante
                              Post totali: 18

                              Ciao, la prima funziona la seconda no.
                              Ti chiedo ancora una cosa .L’ordinamento avviene all’interno di ogni blocco ma si possono ordinare i DDT in funzione del numero, grazie.

                            • Avatarfranco56
                              Partecipante
                                Post totali: 18
                              • sidsid
                                Moderatore
                                  Post totali: 718

                                  …….ma si possono ordinare i DDT in funzione del numero, grazie.

                                  Questa la vedo proprio ardua; ci provo ma non garantisco

                                • sidsid
                                  Moderatore
                                    Post totali: 718

                                    ….L’ordinamento avviene all’interno di ogni blocco ma si possono ordinare i DDT in funzione del numero, grazie.

                                    Secondo me c’è una soluzione più semplice che evita anche l’uso di vba; ma devi impostare la tabella in modo differente, e cioè aggiungere una colonna per i DDT.
                                    Vedi immagine 1.

                                    Una volta modificata la tabella:
                                    – la selezioni
                                    – poi fai ordinamento personalizzato (sulle versioni superiori al 2003; per il 2003 non ricordo ma non dovrebbe essere difficile)
                                    Poi inserisci 2 chiavi di ordinameno:
                                    – la prima per DDT (dalla A alla z)
                                    – la seconda per codice (dalla A alla Z)

                                    Il risultato che ottieni nell’immagine 2

                                  Devi essere loggato per rispondere a questa discussione.

                                  Utilizzando il sito, accetti l'utilizzo dei cookie da parte nostra. maggiori informazioni

                                  Questo sito utilizza i cookie per fornire la migliore esperienza di navigazione possibile. Continuando a utilizzare questo sito senza modificare le impostazioni dei cookie o cliccando su "Accetta" permetti il loro utilizzo.

                                  Chiudi