You are here:Home-Domande su Excel VBA e MACRO-Ordinare Dati
Ordinare Dati2019-02-12T17:56:46+01:00

Home Forum Domande su Excel VBA e MACRO Ordinare Dati

Taggato: 

Visualizzazione 14 filoni di risposte
  • Autore
    Post
    • Avatarfranco56
      Partecipante
        Post totali: 19

        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 365

          • everestmiltoneverestmilton
            Partecipante
              Post totali: 6

              dimenticavo, quale versione excel usi?

              Ringo

              Excel 365

          • Avatarfranco56
            Partecipante
              Post totali: 19
            • sidsid
              Moderatore
                Post totali: 754

                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: 19

                  Ciao Sid,

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

                • sidsid
                  Moderatore
                    Post totali: 754

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

                  • sidsid
                    Moderatore
                      Post totali: 754

                      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: 19

                        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 2 anni, 7 mesi fa da Avatarfranco56.
                        • Questa risposta è stata modificata 2 anni, 7 mesi fa da Avatarfranco56.
                        • Questa risposta è stata modificata 2 anni, 7 mesi fa da Avatarfranco56.
                      • Avatarfranco56
                        Partecipante
                          Post totali: 19

                          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 2 anni, 7 mesi fa da Avatarfranco56.
                        • sidsid
                          Moderatore
                            Post totali: 754

                            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: 884

                              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:

                              Ciao By Sal (8-)
                              se ti piace la soluzione aiuta a sostenere il Forum con una DONAZIONE a piacere, Grazie

                            • Avatarfranco56
                              Partecipante
                                Post totali: 19

                                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: 19
                                • sidsid
                                  Moderatore
                                    Post totali: 754

                                    …….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: 754

                                      ….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

                                  Visualizzazione 14 filoni di risposte
                                  • Devi essere connesso per rispondere a questo topic.