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