Visualizzazione dei risultati da 1 a 5 su 5
  1. #1
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188

    Excel - come allineare due tabelle

    Ho due tabelle che in parte contengono dati confrontabili, ma ciascuna ha un po' di righe diverse.

    Mi piacerebbe poter allineare le righe comuni, inserendo degli spazi bianchi dove necessario.

    Esempio:
    codice:
    INPUT
    tabellaA          tabellaB
    pippo   2         tizio   1
    pluto   5         caius   3
    paper   6         pluto   5
    topol   7         topol   7
    
    
    OUTPUT
    (tabella unica)
                      tizio   1
    pippo   2
                      caius   3
    pluto   5         pluto   5
    paper   6
    topol   7         topol   7
    Le due tabelle di input possono essere in due fogli diversi, oppure nello stesso foglio.
    La chiave e` il numero che sta in una colonna dedicata di ciascuna colonna (sono valori numerici).
    le due tabelle sono gia` ordinate secondo la chiave.
    Ci sono altre colonne che mi interessa affiancare (non riportate nell'esempio).
    in una tabella ci sono 1400 righe, nell'altra piu` di 2000, per cui non e` pensabile fare il lavoro a mano.

    So programmare (in passato ho usato basic, C, Assembler, ed altri linguaggi) ma non sono molto ferrato in VBA, anche se qualche modifica mi sento di farla ed in passato ho usato qualche macro di Excel.
    Quello che non so fare e` impostare il lavoro, e trovare le funzioni corrette da utilizzare.

    Grazie a chi mi dara` una mano.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  2. #2
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    UP

    Mi basta un indizio di come iniziare o cosa cercare.
    grazie
    Michele
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  3. #3
    Ciao Mich,
    il tuo è un classico problema di avanzamento a due file che in VBA risolverei così (nelle mie prove avevo la tabella A nelle prime due colonne del foglio 1, la tabella B nelle prime due colonne del foglio 2 e la tabella risultato nelle prime quattro colonne del foglio3):

    codice:
    Private Sub CommandButton1_Click()
    
       ind_1 = 1
       ind_2 = 1
       ind_out = 0
       fine_1 = False
       fine_2 = False
          
       Do While (Not fine_1) Or (Not fine_2)
          ind_out = ind_out + 1
          If Sheets("Foglio1").Cells(ind_1, 2) < Sheets("Foglio2").Cells(ind_2, 2) Or _
             Sheets("Foglio2").Cells(ind_2, 2) = "" _
          Then
             Sheets("Foglio1").Range(Sheets("Foglio1").Cells(ind_1, 1), Sheets("Foglio1").Cells(ind_1, 2)).Copy Destination:=Sheets("Foglio3").Cells(ind_out, 1)
             ind_1 = ind_1 + 1
          Else
             If Sheets("Foglio1").Cells(ind_1, 2) > Sheets("Foglio2").Cells(ind_2, 2) Or _
                Sheets("Foglio2").Cells(ind_2, 2) = "" _
             Then
                Sheets("Foglio2").Range(Sheets("Foglio2").Cells(ind_2, 1), Sheets("Foglio2").Cells(ind_2, 2)).Copy Destination:=Sheets("Foglio3").Cells(ind_out, 3)
                ind_2 = ind_2 + 1
             Else
                Sheets("Foglio1").Range(Sheets("Foglio1").Cells(ind_1, 1), Sheets("Foglio1").Cells(ind_1, 2)).Copy Destination:=Sheets("Foglio3").Cells(ind_out, 1)
                Sheets("Foglio2").Range(Sheets("Foglio2").Cells(ind_2, 1), Sheets("Foglio2").Cells(ind_2, 2)).Copy Destination:=Sheets("Foglio3").Cells(ind_out, 3)
                ind_1 = ind_1 + 1
                ind_2 = ind_2 + 1
             End If
          End If
       
          If Sheets("Foglio1").Cells(ind_1, 2) = "" Then
             fine_1 = True
          End If
          
          If Sheets("Foglio2").Cells(ind_2, 2) = "" Then
             fine_2 = True
          End If
       
       Loop
          
    End Sub
    Per utilizzarlo devi andare nella scheda Sviluppo di excel (se non la vedi vai nelle opzioni e spunta la casellina che la fa visualizzare) e inserire un pulsante active-x nel foglio in cui vuoi ottenere la tabella di output. Inserito il pulsante ci clicchi sopra due volte e incolli il codice nell’area di lavoro che ti si aprirà. Fatto questo torni a excel, clicchi sull’icona con la squadretta per uscire dalla modalità di progettazione e clicchi una volta sul pulsante per eseguire il codice.

    Il codice come dicevo è un semplice bilanciamento che confronta le due chiavi (ordinate), porta in output quella più piccola o entrambe se sono uguali e avanza sul/sui file che ha scritto in output.

    In questo caso non si tratta di file ma di tabelle di dati ma il concetto è lo stesso.

    Quando uno dei due file è terminato imposta il relativo flag di fine e continua a scaricare l’altro.

    Dal Do While esce quando entrambi sono terminati.

    Ind_1 e ind_2 sono gli indici di esplorazione delle due tabelle di input mentre ind_out è l’indice di scrittura della tabella di out. Praticamente puntano alle righe che si stanno leggendo o a quella che si sta scrivendo.

    La funzione Cells individua una cella passandole la riga e la colonna (chiaramente colonna A = 1, colonna B = 2 ecc…) quindi, ad esempio la cella C5 si può individuare con Cells(5,3).

    Range invece individua un insieme rettangolare di celle e necessita dei due angoli (alto/sinistra e basso/destra). Gli angoli posso essere anche delle celle individuate con Cells.

    Mi sembra che le cose principali siano queste.

    Se ti serve altro chiedi pure ma in questo periodo non ho molto tempo e può darsi che ti faccia aspettare un po’ prima di rispondere.

    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  4. #4
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Intanto ti ringrazio molto.
    Sembra una spiegazione completa, ma ora non ho tempo e devo rimandare le prove.

    Mi faccio vivo appena ho testato.
    Grazie ancora.
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

  5. #5
    Utente di HTML.it
    Registrato dal
    Sep 2001
    Messaggi
    21,188
    Partendo da quel codice sono finalmente riuscito a fare il parallelo.
    (in realta` solo oggi pomeriggio ho avuto un'ora da poterci dedicare).

    Ho apportato alcune modifiche ed ho corretto un errore (un if conteneva un riferimento al sorgente 2 anziche` al sorgente 1).

    Per i posteri posto qui la mia soluzione (nota: il mio excel e` in inglese, per cui c'e` qualche piccola differenza).
    Noto ora che si potrebbe ottimizzare ancora.

    ANCORA GRAZIE (non ce l'avrei fatta senza lo schema fornitomi)



    codice:
    Private Sub affianca()
    
       Sorg1 = "ADS"
       ncol1 = 8         ' n colonne di Sorg1 da copiare
       Sorg2 = "INAIL_Master"
       ncol2 = 14        ' n colonne di Sorg2 da copiare
       Dest = "Parallelo"
       col1 = 1          ' colonna dove scrivere il dato di Sorg1 in Dest
       col2 = 12         ' colonna dove scrivere il dato di Sorg2 in Dest
       pos1 = 14         ' colonna in Sorg1 dove sta l'indice da cfr
       pos2 = 16         ' colonna in Sorg2 dove sta l'indice da cfr
          
       ind_1 = 3         ' Prima riga da cfr di Sorg1
       ind_2 = 2         ' Prima riga da cfr di Sorg2
       ind_out = 2       ' Prima riga di Dest da riempire
       fine_1 = False
       fine_2 = False
       
       Do While (Not fine_1) Or (Not fine_2)
          ind_out = ind_out + 1
          n1 = Int(Sheets(Sorg1).Cells(ind_1, pos1))
          n2 = Int(Sheets(Sorg2).Cells(ind_2, pos2))
          
          If n1 < n2 Or n2 = 0 _
          Then
             Sheets(Sorg1).Range(Sheets(Sorg1).Cells(ind_1, 1), Sheets(Sorg1).Cells(ind_1, ncol1)).Copy Destination:=Sheets(Dest).Cells(ind_out, col1)
             ind_1 = ind_1 + 1
          Else
             If n1 > n2 Or n1 = 0 _
             Then
                Sheets(Sorg2).Range(Sheets(Sorg2).Cells(ind_2, 1), Sheets(Sorg2).Cells(ind_2, ncol2)).Copy Destination:=Sheets(Dest).Cells(ind_out, col2)
                ind_2 = ind_2 + 1
             Else
                Sheets(Sorg1).Range(Sheets(Sorg1).Cells(ind_1, 1), Sheets(Sorg1).Cells(ind_1, ncol1)).Copy Destination:=Sheets(Dest).Cells(ind_out, col1)
                Sheets(Sorg2).Range(Sheets(Sorg2).Cells(ind_2, 1), Sheets(Sorg2).Cells(ind_2, ncol2)).Copy Destination:=Sheets(Dest).Cells(ind_out, col2)
                ind_1 = ind_1 + 1
                ind_2 = ind_2 + 1
             End If
          End If
       
          If (Not fine_1) And Sheets(Sorg1).Cells(ind_1, pos1) = "" Then
             fine_1 = True
          End If
          
          If (Not fine_2) And Sheets(Sorg2).Cells(ind_2, pos2) = "" Then
             fine_2 = True
          End If
          
          'If ind1 > 30 Then    ' fermo subito per il test
          '  fine_1 = True
          '  fine_2 = True
          'End If
       
       Loop
          
    End Sub
    Nuova politica di maggiore severita` sui titoli delle discussioni: (ri)leggete il regolamento
    No domande tecniche in messaggi privati

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2024 vBulletin Solutions, Inc. All rights reserved.