Benvenuto Ospite Cerca | Topic Attivi | Utenti | | Log In | Registra

[Excel2007]-Redigere tabella da altra tabella/ Macro Opzioni
aetio
Inviato: Saturday, April 16, 2011 5:44:48 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
se pensavate di esservi liberati di me, visto che per un po’ di tempo non ho postato richieste di “Aiuto!” [parole rivolte sopra tutto al caro a10n11... :))) ] vi siete sbagliati di grosso! Seguo sempre il Forum, eccome che lo seguo… ehehehe
Allora: prima di tutto ecco un'immagine del teatro delle operazioni :))




Il mio problema:
con una macro devo dare istruzione di prendere le decine di righe di col.AG (contrassegnate con C blu) e copiarle nella tabella in alto a destra con questo criterio:
-seleziono col cursore una cella della colonna che devo elaborare (nell'es. la cella AG33)
-in base a questa selezione la macro seleziona il range (che è sempre di 10 righe della stessa colonna, dal basso all'alto)
-copia la selezione in una cella di partenza che inserisco nella macro (nell'es. la cella AJ3)
-riparte dalla cella della decina precedente (nell'es. cella AG23) e copia la selezione nella cella adiacente a quella della selezione precedente (nell'es. cella AK3) e via di seguito FINO ALL'ULTIMA DECINA (nell'es. cellaAG13/cella AL3) lsciando perdere le celle di col.AG che non fanno decina completa.
Ho iniziato a scrivere la 1^parte (ma proprio la primissima ahahahah) della macro:

Code:
Sub Magazzino1()
    ActiveCell.Offset(-9, 0).Range("A1:A10").Select
    ActiveCell.Activate
    Selection.Copy
    Range("AJ3").Select
    ActiveSheet.Paste
End Sub


A titolo intuitivo (il ragionamento dovrebbe essere questo... il mio solito problema è la sintassi VBA mannaggia!) dovrei creare un ciclo che, terminato il primo passaggio vada alla riga -10 dalla cella selezionata in partenza e copi la nuova selezione nella colonna adicente alla precedente... fino all'ultima decina completa che trova.
Detta così è facile, ma come dice il saggio proverbio: "Dal dire al fare c'è di mezzo il mare" che per me è un oceano, uffa!! :))
Grazie assai per le dritte ;))
Saluti
eZio
Sponsor
Inviato: Saturday, April 16, 2011 5:44:48 PM

 
a10n11
Inviato: Sunday, April 17, 2011 6:38:05 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
prova con qualcosa di simile a quanto sotto:

Sub Prova()
A = ActiveCell.Row
B = ActiveCell.Column
C = 10
x = Int(ActiveCell.Row / 10)
If x < 1 Then Exit Sub
For n = 1 To x
Cells(A - 9, B).Select
Selection.Resize(10).Copy Destination:=Cells(3, C)
C = C + 1
If n <> x Then
A = A - 10
Cells(A, B).Select
End If
Next
End Sub

saluti
Giap

aetio
Inviato: Sunday, April 17, 2011 9:10:08 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao Carissimo mio Angelo Custode,
la macro funziona bene [e c'era forse qualche dubbio?? :)) ], ma copia il tutto SEMPRE partendo da col.J anziché da col.AJ, qualsiasi sia la colonna della 1^cella selezionata.
ho intuito che nell'istruzione
Selection.Resize(10).Copy Destination:=Cells(3, c)
3 è la riga in cui si colloca la copia, ma non ho capito come faccia a collocarsi nella col.J
Grazie assai...
eZio

Nota:
ho deciso, dato che la macro funziona nella colonna della cella di selezione, di non nascondere nessuna colonna... tanto fa tutto la macro, e non c'è quindi pericolo di confusione... :))
a10n11
Inviato: Sunday, April 17, 2011 9:26:35 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
nell'istruzione:
C=10 colonna (J)
cambiando
C=36 colonna (AJ)

saluti
Giap

aetio
Inviato: Sunday, April 17, 2011 9:41:29 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
ecco dov'era ben mimetizzata!! :))
Credevo che C si riferisse al ciclo di 10 righe/volta riferito agli altri due parametri della cella attiva (row e column)
Ma ora che mi è chiaro era evidente che C non era riferito a quello... perché quell'istruzione era
x = Int(ActiveCell.Row / 10)
If x < 1 Then Exit Sub
For n = 1 To x
Cells(A - 9, B).Select

Grazie infinite ;)
Buona notte
eZio
aetio
Inviato: Monday, April 18, 2011 5:59:48 AM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
ormai penso che sia risaputo che la materia mi appassiona moltissimo...
E' tutta notte che mi sto chiedendo come fare per potere estendere il lavoro di questa splendida macro ad un range definito in larghezza (farla cioè lavorare in un num. di colonne definito, anziché solo su quella della cella di selezione), andando nel contempo a copiare i dati che via via esamina in altrettante aree definite del foglio, aree che comunque mantengono tra di loro una distanza costante. Mi spiego meglio, riferendomi sia alla macro postata da a10n11 sia all'immagine postata all'inizio del 3d senza nascondere alcuna colonna (la tabella2 inizia ovviamente da col.H e termina in col.AG):

Code:
Sub Prova()
A = ActiveCell.Row
B = ActiveCell.Column
C = 10
x = Int(ActiveCell.Row / 10)
If x < 1 Then Exit Sub
For n = 1 To x
Cells(A - 9, B).Select
Selection.Resize(10).Copy Destination:=Cells(3, C)
C = C + 1
If n <> x Then
A = A - 10
Cells(A, B).Select
End If
Next
End Sub


Ecco i parametri di lavoro della nuova macro:
-riga della cella di partenza del lavoro della macro: variabile; nella macro và bene l'istruz. A = ActiveCell.Row
-range delle colonne di lavoro della macro: da col.H a col.AG compresa; nella macro dev'essere definita in altro modo B = ActiveCell.Column
-colonna di inizio destinazione del lavoro che via via svolge la macro: abbiamo visto che l'istruz. è C=36 > col.AJ
-righe di inizio destinazione del lavoro che, per ciascuna colonna, via via svolge la macro: nella macro era la cella AJ3 Selection.Resize(10).Copy Destination:=Cells(3, C), ma ora è necessario istruire una destinazione più articolata pur mantenedo la col.AJ (36). Guardando l'immagine: la prima tabellina riferita alla col.H và bene Copy Destination:=Cells(3, C) poi le altre tabelline a scendere avente ciascuna una riga d'inizio alla 4^riga dopo quella della fine della tabella precedente... cioè: tabellina 2 > in cella AJ16, tabellina 3 > in cella AJ29, tabellina 4 > in cella AJ42 etc.
Tradotto in logica elementare il lavoro dovrebbe essere questo: la macro parte da col.H dalla riga della cella di selezione sale fino in cima come da istruzioni e via via copia gl'intervalli partendo dalla cella AJ3. Poi finita la col.H passa alla col.I/stessa riga di partenza della cella selezionata prima di lanciare la macro, fà lo stesso lavoro copiando gl'intervalli partendo dalla cella AJ16 etc. fino all'ultima riga utile di col.AG secondo le istruzioni contenute nella macro copiandone il lavoro in col.AJ partendo dalla 4^riga dopo quella della fine della tabellina precedente.
Come si vede qui però entriamo in un labirinto da super-specialisti, ove solo uno riesce a uscirne vittorioso...
Grazie infinite per la tua solita immensa pazienza ;))
Buona giornata,
eZio.








a10n11
Inviato: Monday, April 18, 2011 9:52:40 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
spero di aver capito il meccanismo. prova con questa:

Sub Prova()
A = ActiveCell.Row
orig = A
riga = 3
x = Int(ActiveCell.Row / 10)
For i = 8 To 33
If x < 1 Then Exit Sub
For n = 1 To x
Cells(A - 9, i).Select
Selection.Resize(10).Copy Destination:=Cells(riga, 36)
riga = riga + 13
If n <> x Then
A = A - 10
Cells(A, i).Select
End If
Next
A = orig
Next i
End Sub

saluti
Giap

aetio
Inviato: Monday, April 18, 2011 10:56:34 AM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
ilconcetto è esatto, nel senso che la macro parte dalla cella che seleziono (in col.H) e lavora fino all'ultima cella "utile" di col.AG ma anziché indirizzare nell'area di competenza di col.AJ i gruppi per colonna (col.H partendo da cella AJ3 e andando verso destra fino al termine del gruppo "utile" di col.H - col.I partendo da cella AJ16 e andando verso destra fino al termine del gruppo "utile" di col.I - etc.) incolonna tutto in col.AJ fino al termine dell'ultimo gruppo "utile" di col.AG
Ecco un'immagine che forse è più chiara di 100 righe scritte... :))



La tabellina che vedi a partire da cella AJ16 appartiene alla col.H e andrebbe indirizzata in cellaAK3, la tabellina che vedi a partire da cella AJ29 appartiene anch'essa alla col.H e andrebbe indirizzata in cellaAL3, e via di ségiuto fino al termine di col.H

Al posto della tabellina attualmente in cella AJ16 andrebbe invece quella che parte dalla cella adiacente a quella della selezione primordiale (che ho stabilito prima di fare partire la macro), nella stessa riga... tabellina riguardante la col.I

Al posto della tabellina attualmente in cella AJ29 andrebbe invece quella che parte dalla cella adiacente a quella della colonna precedente (nel ns. caso la col.I), stessa riga di quella primordiale... tabellina riguardante la col.J e via dicendo...

Scusa se la spiegazione non è chiara... :)) [ricordati che hai a che fare con una cippa, ahahahahahahah]
Grazie per tutto,
Buona giornata
eZio
a10n11
Inviato: Monday, April 18, 2011 12:34:06 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
vediamo di ricapitolare il meccanismo:

Dalla cella selezionata, copia un range di celle di 10 righe a salire della stessa colonna e incollale a partire dalla riga
3 della colonna 36 spostandosi di una colonna ad ogni blocco di 10.
Escussa la colonna della cella selezionata passa alla colonna successiva e ripete l'operazione incollando i dati
elaborati a ripartire dalla colonna 36 ma 4 righe più in basso della tabella precedentemente copiata.
se così è prova la soluzione che segue:

Sub Prova()
A = ActiveCell.Row
col = 36
orig = A
riga = 3
x = Int(ActiveCell.Row / 10)
For i = 8 To 33
If x < 1 Then Exit Sub
For n = 1 To x
Cells(A - 9, i).Select
Selection.Resize(10).Copy Destination:=Cells(riga, col)
col = col + 1
If n <> x Then
A = A - 10
Cells(A, i).Select
End If
Next
riga = riga + 13
col = 36
A = orig
Next i
End Sub

saluti
Giap

aetio
Inviato: Monday, April 18, 2011 1:37:35 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Semplicemente perfetta
E' uno spettacolo di eleganza e di precisione inaudite.
Un Grazie immenso...
Buon pomeriggio,
eZio
a10n11
Inviato: Monday, April 18, 2011 3:00:25 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
grazie a te per il riscontro.
Se analizzi la macro ti accorgerai che utilizza due cicli semplicissimi avendo come sorgente le coordinate
della cella selezionata in partenza.
Quasi quasi cominciavano a mancarmi le tue tabelle.
saluti
Giap

aetio
Inviato: Monday, April 18, 2011 3:38:49 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
a10n11 ha scritto:
salve
grazie a te per il riscontro.
Se analizzi la macro ti accorgerai che utilizza due cicli semplicissimi avendo come sorgente le coordinate
della cella selezionata in partenza.
Quasi quasi cominciavano a mancarmi le tue tabelle.
saluti
Giap


Ciao,
infatti me la sto godendo tutta...!! E' un capolavoro di bellezza inaudita.
Code:
Quasi quasi cominciavano a mancarmi le tue tabelle.
Ti giuro che volevo scriverti la stessa cosa!! ...I tuoi insegnamenti (e le tue spettacolari creature) mi mancano tantissimo!!
Grazie assai e buon pomeriggio, alla prossima macro :))
eZio
aetio
Inviato: Monday, April 18, 2011 9:34:15 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
come si vede sono tornato :))) Spero solo di non essere toppo pedante...

Mi sto chiedendo quali istruzioni bisogna dare affinché, per ogni colonna (e quindi per ogni tabellina), vengano copiati anche i dati delle celle non comprese nella decina... fino all'ultima (in realtà quella più sopra, perché si procede dal basso vs. l'alto).
Esempio:
supponendo una colonna di 107 righe, la macro ora copia i dati della colonna in una tabellina di 10 colonne di 10 righe ciascuna tralasciando le ultime 7 righe... poi passa alla colonna successiva copiando il tutto in un'altra tabellina.
Che variazioni bisogna dare alle istruzioni affinché la macro copi fino all'ultima riga scritta (la 107^ riga) della colonna e poi passi alla successiva?
Grazie e buona serata
eZio
a10n11
Inviato: Tuesday, April 19, 2011 10:04:08 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
prova con questa integrazione:

Sub Prova()
A = ActiveCell.Row
col = 36
orig = A
riga = 3
If orig Mod 10 = 0 Then
x = orig / 10
Else
x = Int((orig / 10)) + 1
Resto = orig Mod 10
End If
For I = 8 To 33
If x < 1 Then Exit Sub
For n = 1 To x
If A >= 10 Then
Cells(A - 9, I).Select
Selection.Resize(10).Copy Destination:=Cells(riga, col)
Else
Cells(A - (Resto - 1), I).Select
Selection.Resize(Resto).Copy Destination:=Cells(riga, col)
End If
col = col + 1
If n <> x Then
A = A - 10
Cells(A, I).Select
End If
Next
riga = riga + 13
col = 36
A = orig
Next I
End Sub

saluti
Giap

aetio
Inviato: Tuesday, April 19, 2011 5:36:52 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
eh...!! qui siamo nel campo dello "stato dell'Arte". Funziona perfettamente.
Ho pensato per tutto il giorno (per impegni non ho potuto usare internet) a come avresti modificato le istruzioni della macro e appena riesco ad avere un attimo di tempo tutto per me me la godo tutta... è stupenda, ancor più dell'altra!!
Grazie assai e buona serata
eZio
aetio
Inviato: Tuesday, April 19, 2011 9:44:43 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
finalmente ho potuto provare la macro: tutto bene eccetto l'ultima colonna della tabellina che anziché iniziare, dal basso verso l'alto, dalla stessa riga delle colonne adiacenti precedenti parte come in figura:



ho cercato di capirne l'origine, ma giuro che per le mie conoscenze in materia è come leggere in cinese :))
Grazie assai e buona serata
eZio

Nota: nella mia macro per comodità ho modificato l'istruzione
A = ActiveCell.Row
col = 36
orig = A
riga = 3

in

A = ActiveCell.Row
col = 36
orig = A
riga = 4
a10n11
Inviato: Tuesday, April 19, 2011 9:59:51 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
la macro considera che la tabella di origine parta dalla riga 1 e probabilmente ti recupera anche l'eventale intestazione della tabella.
Ipotizzando che la tua tabella parta da riga 3 queste sono le modifiche da fare:

Sub Provacontitoli()
A = ActiveCell.Row
col = 36
orig = A
riga = 3
If (orig - 2) Mod 10 = 0 Then
x = orig / 10
Else
x = Int(((orig - 2) / 10)) + 1
Resto = (orig - 2) Mod 10
End If
For I = 8 To 33
If x < 1 Then Exit Sub
For n = 1 To x
If A >= 10 Then
Cells(A - 9, I).Select
Selection.Resize(10).Copy Destination:=Cells(riga, col)
Else
Cells(A - (Resto - 1), I).Select
Selection.Resize(Resto).Copy Destination:=Cells(riga, col)
End If
col = col + 1
If n <> x Then
A = A - 10
Cells(A, I).Select
End If
Next
riga = riga + 13
col = 36
A = orig
Next I
End Sub
saluti
Giap


aetio
Inviato: Tuesday, April 19, 2011 10:30:52 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
presumo che le istruzioni date per tenere conto dell'intestazione siano
If (orig - 2) Mod 10 = 0 Then
e
x = Int(((orig - 2) / 10)) + 1
Resto = (orig - 2) Mod 10

se la tabella inizia in riga 3, mentre se inizia in riga 4 sia
If (orig - 3) Mod 10 = 0 Then
e
x = Int(((orig - 3) / 10)) + 1
Resto = (orig - 3) Mod 10

(spero di non aver preso un abbaglio!!)

ma con quelle istruzioni i due valori di col.CF anziché posizionarsi partendo da riga 13 si collocano partendo da riga 5
Non riesco a capire l'inghippo...
Grazie per la tua encomiabile pazienza e buona serata,
eZio



a10n11
Inviato: Tuesday, April 19, 2011 10:39:50 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
nella tabella che mi sono creato per simulare la procedura gira correttamente.
mostrami la tua tabella originale altrimenti non posso fare le simulazioni corrette.
Vista l'ora rimandiamo a domani.
saluti
Giap

Utenti presenti in questo topic
Guest


Salta al Forum
Aggiunta nuovi Topic disabilitata in questo forum.
Risposte disabilitate in questo forum.
Eliminazione tuoi Post disabilitata in questo forum.
Modifica dei tuoi post disabilitata in questo forum.
Creazione Sondaggi disabilitata in questo forum.
Voto ai sondaggi disabilitato in questo forum.

Main Forum RSS : RSS

Aiutamici Theme
Powered by Yet Another Forum.net versione 1.9.1.8 (NET v2.0) - 3/29/2008
Copyright © 2003-2008 Yet Another Forum.net. All rights reserved.