riportare dati da tabella
Hai un problema con Excel? 
riportare dati da tabella
di macrovb (utente non iscritto) data: 10/12/2015 16:43:10
salve, ho la solita tabella piena di dati nel foglio1
nel foglio 2 vorrei riportare le classi diametriche della colonna d in ogni cella (in senso orizzontale).
Il problema è che nella tabella grezza i dati della colonna si ripetono, ma a me basta che siano citati una sola volta nel foglio 2.
la tabella ha dati variabili quindi mi servirebbe una macro per fare questa operazione "al momento" e non una sola volta.
allego un file di esempio che spero possa rendere piu chiaro il mio problema
grazie in anticipo
di alfrimpa data: 10/12/2015 17:51:19
Ciao macrovb
Prova l'allegato file macrovb.xlsm dove è inserita la sottostante macro che dovrebbe fare quello che hai chiesto.
Fai delle prove e fai sapere.
Alfredo
Sub CreaElencoUnivoco()
Dim CL As Range, Intervallo As Range, Elenco As New Collection
Dim numval As Integer
Dim i As Integer
Application.ScreenUpdating = False
Worksheets("Foglio1").Select
Set Intervallo = Range("d21", Range("d2").End(xlDown))
On Error Resume Next
For Each CL In Intervallo
Elenco.Add CL.Value, CStr(CL.Value)
Next CL
On Error GoTo 0
numval = Elenco.Count
Worksheets("foglio2").Activate
Range("a2:z2").ClearContents
For i = 1 To numval
Cells(2, i) = Elenco(i)
Next i
Application.ScreenUpdating = True
End Sub
|
di alfrimpa data: 10/12/2015 22:30:06
Ciao macrovb
Ti allego altro file (macrovb1.xlsm) dove, a differenza del precedente, i valori vengono riportati sulla riga 2 del foglio2 in ordine crescente.
Ti riporto sotto le macro.
Anche qui fai molte prove per essere sicuri del corretto funzionamento e fai sapere.
Ovviamente la macro da lanciare è la Sub CreaElencoUnivoco()
Alfredo
Sub CreaElencoUnivoco()
Dim CL As Range, Intervallo As Range, elenco As New Collection
Dim numval As Integer
Dim I As Integer
Dim k As Integer
Dim J As Integer
Application.ScreenUpdating = False
Worksheets("Foglio1").Select
Set Intervallo = Range("d21", Range("d2").End(xlDown))
On Error Resume Next
For Each CL In Intervallo
elenco.Add CL.Value, CStr(CL.Value)
Next CL
On Error GoTo 0
numval = elenco.Count
Worksheets("foglio2").Activate
Range("a2:z2").ClearContents
For k = 1 To elenco.Count - 1
For J = k + 1 To elenco.Count
If elenco(k) > elenco(J) Then Swap elenco, k, J
Next J
Next k
For I = 1 To numval
Cells(2, I) = elenco(I)
Next I
Application.ScreenUpdating = True
End Sub
Sub Swap(ByVal elenco As Collection, ByVal k As Long, ByVal J As Long)
elenco.Add elenco(J), , , k
elenco.Add elenco(k), , , J + 1
elenco.Remove k
elenco.Remove J
End Sub
|
di Macrovb (utente non iscritto) data: 10/12/2015 22:30:20
Grazie mille, domani provo e ti faccio sapere!
di macrovb (utente non iscritto) data: 12/12/2015 14:52:53
ciao, sto provando la macro dell'esempio ... sembra andare tutto bene con le varie prove... piu in la aggiorno a casomai segnalo come risolta ;)
buon w_end
di macrovb (utente non iscritto) data: 12/12/2015 15:29:29
Allora dopo varie prove nell'esempio da te postato ho provato a rifare la macro su un altro foglio (giusto per capirla meglio);
Non ho capito però alcune righe del tu codice:
riga1-Set Intervallo = Range("d21", Range("d2").End(xlDown))
riga2-For I = 1 To numval
Cells(2, I) = elenco(I)
Next I
Application.ScreenUpdating = True
sotto invece allego il codice con le mie modifiche (solamente il nome dei fogli e l'intervallo dove incollare i risultati. Ho modificato pure la riga 1 (quella postata sopra) inserendo la lettera della colonna dove sono presenti i dasti da riportare (non d ma g)
cliccando sul button si passa al foglio report ma le celle rimangono bianche senza aver riportato i dati
Option Explicit
Sub Triangoloisoscele5_Click()
Dim CL As Range, Intervallo As Range, elenco As New Collection
Dim numval As Integer
Dim I As Integer
Dim k As Integer
Dim J As Integer
Application.ScreenUpdating = False
Worksheets("DATI").Select
Set Intervallo = Range("g21", Range("g2").End(xlDown))
On Error Resume Next
For Each CL In Intervallo
elenco.Add CL.Value, CStr(CL.Value)
Next CL
On Error GoTo 0
numval = elenco.Count
Worksheets("REPORT").Activate
Range("a20:D20").ClearContents
For k = 1 To elenco.Count - 1
For J = k + 1 To elenco.Count
If elenco(k) > elenco(J) Then Swap elenco, k, J
Next J
Next k
For I = 1 To numval
Cells(2, I) = elenco(I)
Next I
Application.ScreenUpdating = True
End Sub
Sub Swap(ByVal elenco As Collection, ByVal k As Long, ByVal J As Long)
elenco.Add elenco(J), , , k
elenco.Add elenco(k), , , J + 1
elenco.Remove k
elenco.Remove J
End Sub
|
di alfrimpa data: 12/12/2015 18:37:24
Ciao macrovb
Ti ho allegato file (macrovb2.xlsm) dove ho apportato una piccola correzione al codice e le modifiche da te indicate (come da macro nel riquadro sotto).
Ho anche inserito una forma sul foglio REPORT cui ho associato la macro e mi pari riporti correttamente i dati dal foglio DATI colonna G.
Quanto alle tue domande cerco di spiegare
1) Questa istruzione Set Intervallo = Range("g2", Range("g2").End(xlDown)) imposta nella variabile di tipo Range Intervallo la zona da cui prendere i dati.
2) numval è una variabile numerica dove memorizzo il numero degli elementi della Collection elenco (sai cosa sono le Collection?)
3) con questa istruzione Cells(2, I) = elenco(I) dico alla macro di scrivere sulla riga 2 colonna per colonna sino a quella definita da numval gli elementi della Collection elenco
4) Con Next I si chiude un precedente ciclo For
5) Con Application.ScreenUpdating = True viene riabilitato l'aggiornamento dello schermo in precedenza disabilitato con Application.ScreenUpdating = False
Io non so se tu riuscirai a comprendere queste mie indicazioni (dipende dal tuo livello di conoscenza del VBA) ma ho cercato di essere il meno criptico possibile (se hai domande chiedi pure nella speranza che sappia risponderti, perché non è detto che ne sia capace).
Va anche detto che il tuo problema poteva risolversi forse più semplicemente con la seguente procedura.
1) Con il Filtro dati Avanzato copiare in altra parte del foglio i dati univoci dal foglio DATI;
2) Fare l'ordinamento crescente di tale zona
3) Fare un Copia/Incolla/Trasponi di detti dati sull'intervallo di destinazione finale
magari registrando tali operazioni con il registratore macro ed avere il relativo codice ovviamente poi da adattare.
Alfredo
P.S. Io avevo preso in considerazione la colonna D perché tu nel tuo primo post avevi parlato di classi diametriche che sono appunto nella colonna D.
Sub CreaElencoUnivoco()
Dim CL As Range, Intervallo As Range, elenco As New Collection
Dim numval As Integer
Dim I As Integer
Dim k As Integer
Dim J As Integer
Application.ScreenUpdating = False
Worksheets("DATI").Select
Set Intervallo = Range("G2", Range("G2").End(xlDown))
On Error Resume Next
For Each CL In Intervallo
elenco.Add CL.Value, CStr(CL.Value)
Next CL
On Error GoTo 0
numval = elenco.Count
Worksheets("REPORT").Activate
Range("a2:z2").ClearContents
For k = 1 To elenco.Count - 1
For J = k + 1 To elenco.Count
If elenco(k) > elenco(J) Then Swap elenco, k, J
Next J
Next k
For I = 1 To numval
Cells(2, I) = elenco(I)
Next I
Application.ScreenUpdating = True
End Sub
Sub Swap(ByVal elenco As Collection, ByVal k As Long, ByVal J As Long)
elenco.Add elenco(J), , , k
elenco.Add elenco(k), , , J + 1
elenco.Remove k
elenco.Remove J
End Sub |
di macrovb (utente non iscritto) data: 14/12/2015 09:56:09
sembra essere ok alfre, ora provo a ricreare la stesa macro per altri campi/tabelle.... grazie mille e buone feste!
di macrovb (utente non iscritto) data: 17/12/2015 15:52:53
CIAO a tutti, considerando sempre l'esempio postato da me e da alfre giorni fa, è possibile ottenere la stessa macro anche se alcune celle della colonna da riportare sono vuote???
grazie
di macrovb (utente non iscritto) data: 17/12/2015 15:55:12
ho allegato l ultimo file postato modificato ( ho cancellato alcuni valori delle celle interessate)
di alfrimpa data: 17/12/2015 15:58:19
Cioè stai chiedendo se la macro funziona ugualmente (ossia restituisce risultati corretti) pur in presenza di celle vuote nella colonna in esame?
Tu hai provato a cancellare qualche valore nella colonna e vedere cosa succede?
Alfredo
di macrovb (utente non iscritto) data: 17/12/2015 15:59:51
ciao Alfredo, si ho provato a cancellare qualche valore .... vengono riportati, nel fg 2, solo i valori presenti prima della cella cancellata
di alfrimpa data: 17/12/2015 16:14:22
Scusa macrovb ma nella colonna G del foglio DATI non ci sono valori duplicati diversamente dalla colonna D (classi diametriche) che avevi indicato in precedenza.
Ed infatti in mancanza di valori duplicati la macro non è che abbia molto senso; basta fare un copia, incolla speciale e trasponi (o sono io che mi perdo qualcosa?)
Quanto al problema che hai sollevato ora non saprei; i database (tabelle), di norma, devono essere completi e quindi non avere "buchi".
Riesci a spiegare meglio quello che devi fare?
Alfredo
di macrovb (utente non iscritto) data: 17/12/2015 16:20:52
si Alfredo, la colonna interessata è la D.
Mi sono accorto che alcune celle della colonna D (in un altro file) non hanno valori; applicando la macro i valori sotto la cella vuota non mi vengono riportati.
Qualcuno saprebbe come ovviare a tale problema?
grazie
di alfrimpa data: 17/12/2015 16:38:23
Allora il tutto si ridurrebbe a:
1) copia dei dati in altra parte del foglio
2) rimozione dei duplicati
3) ordinamento dei valori rimasti
4) copia/incolla speciale/trasponi sul foglio REPORT
Se usi il registratore di macro avrai anche il codice
Ovviamente tale procedura va bene anche nel caso non ci siano celle vuote.
Alfredo
Vuoi Approfondire?