|
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
|
|
|
|
|
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
|
|
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... :))
|
|
Rank: AiutAmico
Iscritto dal : 5/29/2003 Posts: 1,694
|
salve nell'istruzione: C=10 colonna (J) cambiando C=36 colonna (AJ) saluti Giap
|
|
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
|
|
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.
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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
|
|
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 = 3in A = ActiveCell.Row col = 36 orig = A riga = 4
|
|
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
|
|
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
|
|
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
|
|
Guest |