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

[Excel 2007]- Macro con riferimenti misti (relativi e non) Opzioni
aetio
Inviato: Saturday, September 18, 2010 9:36:15 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
sto facendo una serie di macro per delle tabelle uguali, ma di pagine differenti. La prassi in parole povere è questa:
-per prima cosa seleziono una cella (a seconda di dove devo elaborare i dati, all'interno delle tabelle, ma sempre nella stessa colonna) in Foglio 1 e lancio la macro

Sub griglia_esc()
' gestisce le operazioni di compilazione della griglia esc che poi, al termine,
' verrà copiata nei Foglio 2 e Foglio 3 A PARTIRE DALLA CELLA SELEZIONATA
ActiveCell.Range("A1:F11").Select
Application.Run "incolonna1"
Selection.Cut
Sheets("F.2").Select
Range("C13").Select
ActiveSheet.Paste
Application.Run "griglia_per_esc"
Selection.Copy
Sheets("Foglio 2").Select
ActiveCell.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, 0).Range("A1").Select
Sheets("Foglio 3").Select
ActiveCell.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, 0).Range("A1").Select
Sheets("Foglio 1").Select
ActiveCell.Offset(-21, -161).Range("A1").Select
End Sub

Come si vede, ora i riferimenti sono tutti gestiti previa selezione di una cella all'interno di ogni pagina, selezione che varia di volta in volta a seconda dell'area delle tabelle che devo compilare (nella macro sopra ActiveCell.Range("A1:F11").Select e ActiveCell.Select nei Fogli 2 e 3)
Io avrei invece bisogno di implementare una situazione mista, ovvero
che ActiveCell.Range("A1:F11").Select rimanga tale
e che le ActiveCell.Select nei Fogli 2 e 3 siano invece celle specifiche che hanno una posizione precisa riferita alla cella di Foglio 1 che di volta in volta seleziono per poter compilare le tabelle di Foglio 2 e 3.
Per dare riferimento preciso:
in Foglio 1 se partissi dalla cellaB1984 e in Foglio 2 e 3 vorrei già "puntate" le celle AJ1984, anziché dover andare nei rispettivi fogli e selezionare di volta in volta le celle... L'unica cosa che dovrei fare è selezionare la cella di Foglio 1.
Qual'è la sintassi corretta da inserire nella macro? Non sono riuscito a trovare il minimo indizio...
Grazie assai e buona serata,
eZio
Sponsor
Inviato: Saturday, September 18, 2010 9:36:15 PM

 
a10n11
Inviato: Saturday, September 18, 2010 10:27:43 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
sperando di aver capito bene.
La macro che segue, copia un area del foglio1 e la copia a partire dalla riga della cella selezionata nel foglio1 nei fogli 2 e 3

Sub copia()
x = ActiveCell.Row
Range("a11:f11").Copy
Sheets("foglio2").Range("J" & x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
Sheets("foglio3").Range("J" & x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
End Sub

saluti
Giap

aetio
Inviato: Sunday, September 19, 2010 12:06:51 AM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
purtroppo la situazione è un poco più complessa: in Foglio 2 e Foglio 3 non dev'essere copiata l'area di Foglio 1, ma il risultato di un'altra macro che lavora in F.2 , macro che elabora e ordina i dati di Foglio 1. E' la posizione delle celle di Foglio 2 e Foglio 3 che è legata a quella di Foglio 1, il contentuto è stato modellato in modo differente: parte da una tabella di Foglio 1 e finisce in una riga di F.2 in cui sono scritti tutti i dati di quella tabella, riga che dev'essre copiata in Foglio 2 e Foglio 3 in una posizione ben precisa. Ora ogni volta devo selezionare la cella... Vorrei invece che dalla posizione di partenza di Foglio 1 si auto posizionassero quelle relative di Foglio 2 e 3, legate a quella di Foglio 1 dalla stessa riga.
qualche foto non guasta...

l'intervallo di Foglio 1


che viene rimodellato ed elaborato in F.2


il risultato di F.2 dev'essere copiato in Foglio 2 e Foglio 3 in posizioni specifiche, dipendenti dalla posizione in Foglio 1 (uguale riga...)



Grazie e buona giornata ;)
eZio
a10n11
Inviato: Sunday, September 19, 2010 5:52:48 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
aetio ha scritto:
Ciao,
purtroppo la situazione è un poco più complessa: in Foglio 2 e Foglio 3 non dev'essere copiata l'area di Foglio 1, ma il risultato di un'altra macro che lavora in F.2 , macro che elabora e ordina i dati di Foglio 1. E' la posizione delle celle di Foglio 2 e Foglio 3 che è legata a quella di Foglio 1, il contentuto è stato modellato in modo differente: parte da una tabella di Foglio 1 e finisce in una riga di F.2 in cui sono scritti tutti i dati di quella tabella, riga che dev'essre copiata in Foglio 2 e Foglio 3 in una posizione ben precisa. Ora ogni volta devo selezionare la cella... Vorrei invece che dalla posizione di partenza di Foglio 1 si auto posizionassero quelle relative di Foglio 2 e 3, legate a quella di Foglio 1 dalla stessa riga.
qualche foto non guasta...
eZio


salve
Arabo!!..............
La macro che hai postato precedentemente non aiuta la comprensione visto che richiama altre due macro.
cosa dovresti fare esattamente?
saluti
Giap

aetio
Inviato: Sunday, September 19, 2010 10:28:47 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
a10n11 ha scritto:

salve
Arabo!!..............


Ahahahahahahahahahahahahahahahahahahahah
con questa parola mi hai dato una "carica" veramente esplosiva!! In effetti temevo questo tuo giudizio esatto.
Mi rendo conto che è difficilissimo, se non impossibile, spiegare via forum l'architettura di queste tabelle e poterne capire la dinamica... Io ho sicuramente avuto l'immensa fortuna, unica su tutto il pianeta (non sto scherzando) di avere un vero Amico come te che mi sta aiutando in un'impresa altrimenti neppure pensabile...
Ma vengo al sodo. Ho cercato di risolvere il problema nel modo più semplice possibile... e qui mi è venuta in aiuto la tecnologia aeronautica dei sistemi "ridondanti", e così ho applicato lo stesso concetto. Siccome le tabelle sono davvero parecchie, tutte molto corpose, intrecciate tra di loro... il mio problema è (...ora risolto Grazie esclusivamente a te) di poter gestire CON UN SOLO COMANDO in una di queste tabelle una serie di elaborazioni legate tra loro ma residenti in diversi fogli di lavoro, in posizioni diverse, ma legate in modo dissolubile tra loro... se un dato si trova in una cella di una tabella è perché in un'altra tabella c'è un altro dato in una cella legato strettamente ad esso.
In pratica: selezionando una cella [variabile di volta in volta, con l'istruzione del tipo 'ActiveCell.Offset(-21, -161).Range("A1").Select) ] in una tabella e usando una serie di macro legate tra loro faccio eseguire e copiare i risultati in altre tabelle facendo spostare nel contempo la selezione in modo da legarla a quella della cella di partenza... ridondanza, appunto. Alla fine di tutta la tiritera (che in lavoro manuale significano circa 20min. a operazione, con buone possibilità di errori umani) nel giro di una frazione di sec. mi trovo con la selezione della cella di partenza + 1. :)))
Ora mi manca solo una ciliegia sulla torta, ovvero la possibilità di gestire un confronto di tabelle riga per riga, da legare nelle operazioni già pianificate. Purtroppo non conosco la sintassi esatta per modellare la macro (che mi avevi preparato per esaminare tutta la tabella) in modo che mi esamini solo l'intervallo della riga attiva. Ecco il testo della macro originale:

Sub confronta()

Application.ScreenUpdating = False
Dim colonna As Integer
For n = 14 To 14 'da impostare ogni volta
colonna = 82
Set area1 = Range(Cells(n, 56), Cells(n, 81))
Set area2 = Range(Cells(n, 1), Cells(n, 55))
For Each cl In area1
For Each cl2 In area2
If cl = cl2 Then
With cl
.Interior.ColorIndex = 36
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
Cells(n, colonna).Value = cl.Value
colonna = colonna + 1
End If
Next cl2
Next cl
Set area = Nothing
Set area2 = Nothing
Next n
Columns("CD:ED").ClearContents
Application.ScreenUpdating = True
End Sub

la macro dovrebbe partire da una cella selezionata [del tipo ActiveCell.Offset(-21, -161).Range("A1").Selectcella che ho già impostato alla fine della macro che precederà questa, ] eseguire l'istruzione sulla riga e restituire un'altra cella selezionata... Spero tanto che non sia arabo anche questo... Ti scrivo il testo di una di queste macro per darti qualche dato in più...


Sub Copia_Valori()
'
' seleziona le Sigma calcolate in Foglio 1 e le copia in Foglio 2 e in foglio Sigma partendo dalla cella (variabile) selezionata
'
ActiveCell.Range( _
"A1,F1,K1,P1,U1,Z1,AE1,AJ1,AO1,AT1,AY1,BD1,BI1,BN1,BS1,BX1,CC1,CH1,CM1,CR1,CW1,DB1,DG1,DL1,DQ1,DV1" _
).Select
ActiveCell.Offset(0, 5).Range("A1").Activate
Selection.Copy
Sheets("Foglio 2").Select
ActiveCell.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, 28).Range("A1").Select
Sheets("Sigma").Select
ActiveCell.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, -55).Range("A1").Select
End Sub

Grazie assai per la pazienza........... :)
eZio
a10n11
Inviato: Monday, September 20, 2010 12:18:00 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
aetio ha scritto:
[

Sub Copia_Valori()
............
Sheets("Foglio 2").Select
ActiveCell.Select
...........................
..............................

Sheets("Sigma").Select
ActiveCell.Select
.............................
.................................
End Sub

Grazie assai per la pazienza........... :)
eZio


salve
sono le due istruzioni sopra riportate che non capisco.
Passi al foglio 2 e al foglio Sigma richiamando l'Activecell, ma come fai sapere che celle sono attive in quei fogli??
La logica mi pare di averla capita Copi un range la cui variabilità è dettata dalla cella selezionata nel foglio di partenza, e vorresti copiarla nei fogli 2 e Sigma ma in quali celle?? qui mi perdo..
saluti
Giap

aetio
Inviato: Monday, September 20, 2010 9:16:10 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
a10n11 ha scritto:

Passi al foglio 2 e al foglio Sigma richiamando l'Activecell, ma come fai sapere che celle sono attive in quei fogli??
La logica mi pare di averla capita Copi un range la cui variabilità è dettata dalla cella selezionata nel foglio di partenza, e vorresti copiarla nei fogli 2 e Sigma ma in quali celle?? qui mi perdo..
In sostanza parto dalla selezione di una cella in colonna B di Foglio 1, seleziono le celle in Foglio 2 e Sigma, faccio partire una macro che prende l'intervallo, lo elabora in un foglio di calcolo (F.2) e lo restituisce in forma di intervallo su una sola riga in Foglio2, partendo dalla cella preselezionata in partenza, riposizionando poi il cursore in un'altra cella del Foglio 2 e del Foglio 1 per un calcolo successivo, poi con un'altra macro riprende parte dei calcoli effettuati all'inizio e restituisce un altro intervallo in Sigma in una delle celle già selezionate in partenza, e con un'altra macro faccio copiare delle celle specifiche di Foglio 1 in Foglio 2 e Sigma, comandando alla fine al cursore di posizionarsi nella cella superiore a a quella di partenza... Nel complesso funziona alla perfezione, chiude in modo perfetto, ma necessita di un'istruzione che faccia riconoscere quelle celle (che ora seleziono all'inizio prima di far partire le macro) in base alla cella di colonna B del Foglio 1, cella di partenza. La macro del "confronta tabelle" andrebbe poi inserita in quelle istruzioni, ma non conosco la sintassi esatta per impartire l'ordine di esaminare le 2 tabelle solo in quella riga, partendo da una cella e finendo in un'altra cella...
Commenta:
Copi un range la cui variabilità è dettata dalla cella selezionata nel foglio di partenza, e vorresti copiarla nei fogli 2 e Sigma ma in quali celle?
le celle di Foglio 2 e Sigma legate alla tabella di Foglio 1, celle che preseleziono prima di fare partire la macro madre di tutte le macro, celle tutte legate a quell'operazione...
Grazie assai e buona serata,
eZio

p.s. ti prego di scusarmi per il mio pressapochismo, tipico di chi ha limitate conoscenze della materia, pur avendo una gran voglia di fare dovuta alla grande ammirazione per questa affascinante scienza.
a10n11
Inviato: Tuesday, September 21, 2010 9:48:57 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
Commenta:

....Nel complesso funziona alla perfezione, chiude in modo perfetto, ma necessita di un'istruzione che faccia riconoscere quelle celle (che ora seleziono all'inizio prima di far partire le macro) in base alla cella di colonna B del Foglio 1, cella di partenza.


Commenta:

...Per dare riferimento preciso:
in Foglio 1 se partissi dalla cellaB1984 e in Foglio 2 e 3 vorrei già "puntate" le celle AJ1984, anziché dover andare nei rispettivi fogli e selezionare di volta in volta le celle... L'unica cosa che dovrei fare è selezionare la cella di Foglio 1.


Si torna alla mia prima risposta.
Ricapitolo:

1) Selezioni la cella B100 del foglio 1
2) nel foglio2 la cella relazionata sarà AJ100
3) nel foglio3 la cella relazionata sarà AJ100

stante così le cose cosa c'era che non andava nel nio precedente suggerimento??
Non hai nessun bisogno di preselezionare le celle.
andava solo adattato in questo modo:
....................

Sub Copia_Valori()
ActiveCell.Range( _
"A1,F1,K1,P1,U1,Z1,AE1,AJ1,AO1,AT1,AY1,BD1,BI1,BN1,BS1,BX1,CC1,CH1,CM1,CR1,CW1,DB1,DG1,DL1,DQ1,DV1" _
).Select
x = ActiveCell.Row
ActiveCell.Offset(0, 5).Range("A1").Activate
Selection.Copy
Sheets("foglio2").Select
Range("AJ" & x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, 28).Range("A1").Select
Sheets("foglio3").Select
Range("AJ" & x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, -55).Range("A1").Select
End Sub

Evidentemete la riga in rosso produce un errore perchè lo spostamento di -55 colonne indietro arriverebbe fuori
del foglio
saluti
Giap



a10n11
Inviato: Tuesday, September 21, 2010 9:53:31 AM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
ad integrazione...........

queste due righe:

ActiveCell.Offset(-1, 28).Range("A1").Select
ActiveCell.Offset(-1, -55).Range("A1").Select

creano riferimenti ai due fogli che poi devi utilizzare in elaborazioni successive?? se si dove e come.
in caso affermativo bisogna che mi fai vedere le macro associate.

saluti
Giap

aetio
Inviato: Tuesday, September 21, 2010 8:30:35 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
a10n11 ha scritto:

creano riferimenti ai due fogli che poi devi utilizzare in elaborazioni successive?? se si dove e come.
in caso affermativo bisogna che mi fai vedere le macro associate.

in effetti volevo già postartele dall'inizio, ma temevo che alla fine il tuo giudizio esatto sarebbe stato "Arabo all'ennesima potenza"!! :)
Prima di procedere specifico che il Foglio 3 è stato eliminato, dato che riesco a fare la stessa cosa senza bisogno di averlo "tra i piedi".
Allora: Problema, dati questi valori elaborare dei dati e copiarli in fogli collegati, in posizioni tra di esse legate.

- situazione di partenza: sett. 72'94 , seleziono la cella del settore in col.B di Foglio 1
in Foglio 2 seleziono la cella in col.AJ, pari riga di foglio 1
in foglio Sigma seleziono la cella in col.A, pari riga di Foglio 1 e Foglio 2

e da Foglio 1 faccio partire una macro che esegue una serie di operazioni di ordinamento e le restituisce in F.2 sotto forma di riga scritta sempre nella stessa riga, K22, indipendentemente dagli altri Fogli dato che F.2 è solo un foglio di calcolo)

Sub griglia_esc()
ActiveCell.Range("A1:F11").Select
Application.Run "incolonna1"
Selection.Cut
Sheets("F.2").Select
Range("C13").Select
ActiveSheet.Paste
Application.Run "griglia_per_esc"
Selection.Copy
Sheets("Foglio 2").Select
ActiveCell.Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(0, -28).Range("A1").Select
Sheets("Foglio 1").Select
ActiveCell.Offset(-20, -161).Range("A1").Select
End Sub
- - - - - - -
(le due macro richiamate)
Sub incolonna1()
ActiveCell.Offset(-10, 0).Range("A1:F11").Select
ActiveCell.Activate
Selection.Copy
ActiveCell.Offset(30, 160).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Range("A1:A11").Select
Application.CutCopyMode = False
Selection.ClearContents
ActiveCell.Offset(0, 2).Range("A1:A11").Select
Selection.Cut
ActiveCell.Offset(11, -1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(-11, 2).Range("A1:A11").Select
Selection.Cut
ActiveCell.Offset(22, -2).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(-22, 3).Range("A1:A11").Select
Selection.Cut
ActiveCell.Offset(11, 1).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(-11, 0).Range("A1:A22").Select
Selection.Cut
ActiveCell.Offset(33, -4).Range("A1").Select
ActiveSheet.Paste
ActiveCell.Offset(-33, 0).Range("A1:A55").Select
Selection.Sort Key1:=ActiveCell, Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub
- - - - - - -
Sub griglia_per_esc()
Selection.Copy
ActiveCell.Offset(33, 8).Range("A1").Select
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=True
ActiveCell.Offset(-33, -8).Range("A1").Select
ActiveWindow.SmallScroll Down:=24
ActiveCell.Range("A1:A55").Select
Application.CutCopyMode = False
Selection.ClearContents
ActiveCell.Offset(9, 8).Range("A1").Select
ActiveCell.Range("A1:CL1").Select
End Sub
- - - - - -

Risultato: in Foglio 2 a partire dalla cella di Col.AJ, nella stessa riga di quella del sett. di Foglio 1, vengono scritti dei nostri codici interni e alla fine viene puntata in Foglio 2 la cella da cui dovrà partire la macro "copia_Valori" (cella in col.H nella stessa riga) e in Foglio 1 verrà riselezionata la cella di partenza (quella di partenza di tutta l'operazione, col.B di Foglio 1, da cui dovrà partire la macro "Sigma_55". La pagina attiva torna quindi Foglio 1
- - - - - -

- faccio partire la macro

Sub Sigma_55()
Sheets("F.2").Select
ActiveWindow.SmallScroll Down:=24
ActiveCell.Offset(24, 0).Range("A1").Select
ActiveCell.Range("A1:BC1").Select
Application.CutCopyMode = False
Selection.Copy
Sheets("Sigma").Select
ActiveSheet.Paste
ActiveCell.Offset(0, 55).Range("A1").Select
Sheets("Foglio 1").Select
ActiveCell.Offset(1, 6).Range("A1").Select
End Sub
- - - - -

Risultato: in foglio Sigma vengono scritti dei valori a partire dalla cella A della stessa riga del sett. di Foglio 1 (e di Foglio 2). Al termine in foglio Sigma viene selezionata la cella successiva all'ultimo valore scritto dalla macro Sigma_55, e in Foglio 1 la cella in col.L della riga precedente a quella del settore (è una riga contenente delle formule che restituiscono nelle colonne A1,F1,K1,P1,U1,Z1,AE1,AJ1,AO1,AT1,AY1,BD1,BI1,BN1,BS1,BX1,CC1,CH1,CM1,CR1,CW1,DB1,DG1,DL1,DQ1,DV1 dei valori relativi al sett. in esame, che col sistema di trascinamento della cella si autocalcolano di volta in volta) La pagina su cui torna la macro è sempre Foglio 1
- - - - -

-faccio partire la macro

Sub prepara_eCopia_Sigma()
ActiveCell.Select
ActiveCell.Range("A1:DZ1").Select
Selection.AutoFill Destination:=ActiveCell.Offset(-1, 0).Range("A1:DZ2"), _
Type:=xlFillDefault
ActiveCell.Offset(-1, 0).Range("A1:DZ2").Select
ActiveCell.Offset(0, 0).Range("A1").Select
ActiveCell.Offset(0, 4).Range("A1").Select
Application.Run "Copia_Valori"
Application.CutCopyMode = False
Sheets("Foglio 1").Select
ActiveCell.Offset(-1, -15).Range("A1").Select
End Sub
- - - - -
(la macro richiamata)
Sub Copia_Valori()
ActiveCell.Range( _
"A1,F1,K1,P1,U1,Z1,AE1,AJ1,AO1,AT1,AY1,BD1,BI1,BN1,BS1,BX1,CC1,CH1,CM1,CR1,CW1,DB1,DG1,DL1,DQ1,DV1" _
).Select
x = ActiveCell.Row
ActiveCell.Offset(0, 5).Range("A1").Activate
Selection.Copy
Sheets("foglio2").Select
Range("AJ" & x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, 28).Range("A1").Select
Sheets("Sigma").Select
Range("AJ" & x).PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, SkipBlanks _
:=False, Transpose:=False
ActiveCell.Offset(-1, -55).Range("A1").Select
End Sub
- - - - -

Risultato: in foglio Sigma vengono scritti dei valori a partire dalla cella BD della stessa riga del sett. di Foglio 1 (e di Foglio 2), valori che vengono anche scritti in Foglio 2 a partire dalla cella selezionata dalla macro griglia_esc. Al termine in foglio Sigma viene selezionata la cella di col.A della riga superiore a quella del sett. in esame, in Foglio 2 viene selezionata la cella di col.AJ della riga superiore a quella del sett. in esame, in Foglio 1 (che rimane durante tutto il ciclo il foglio attivo) viene selezionata la cella di col.B della riga superiore a quella del sett. in esame (il tutto pronto per il giro successivo), che poi in realtà è il sett. successivo a quello in esame, ma la tabella procede al contrario, dal basso verso l'alto... in Arabo, appunto!!!!!!!!! ahahahahahahahaha
Spero di essere stato chiaro e preciso in modo sufficiente....
Grazie assai e buona serata,
eZio.



a10n11
Inviato: Wednesday, September 22, 2010 12:19:54 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
salve
per i miei gusti e per complicare l'interpretazione del codice per i riferimenti di cella usi in maniera spropositata l'istruzione Activecell condita con tanti Offset...
ti mostro dove sono arrivato a comprendere il lavoro.
Le macro:
Griglia_esc() ; Incolonna1() ; griglia_per_esc();Sigma_55

possono essere raccolte in una unica macro che fa a meno del foglio di appoggio F.2

questa:

Sub copiaselezione()
Dim Miacoll()
ReDim Miacoll(55)
x = ActiveCell.Row
N = 1
For i = 3 To 7
Set area = Range(Cells(x, i), Cells(x + 10, i))
For Each cl In area
If cl.Value <> "" Then
Miacoll(N) = cl.Value
N = N + 1
End If
Next cl
Next i
ol = 36
col2 = 1
ReDim Preserve Miacoll(N)
Set area = Nothing
For a = LBound(Miacoll) To UBound(Miacoll)
Sheets("foglio2").Cells(x, col).Value = Miacoll(a)
Sheets("Sigma").Cells(x, col2).Value = Miacoll(a)
col = col + 1
col2 = col2 + 1
Next a
Range("H" & x + 1).Select
Sheets("foglio2").Select
Range("H" & x).Select
Sheets("Sigma").Select
Range("BD" & x).Select
Sheets("foglio1").Select
End Sub

Nella esposizione dici:
Commenta:

Risultato: ... e in Foglio 1 la cella in col.L della riga precedente a quella del settore


se la cella selezionata in partenza nel foglio1 fosse la 16 , con la tua istruzione
Sheets("Foglio 1").Select
ActiveCell.Offset(1, 6).Range("A1").Select

selezioneresti la cella H17 e non la L15

così come io trovo un errore nella selezione della riga del foglio F.2
in questa istruzione:

Sub griglia_per_esc()
..........................
..........................
ActiveCell.Offset(9, 8).Range("A1").Select
ActiveCell.Range("A1:CL1").Select
End Sub
Selezioni un range da K22 che non contiene nulla


Quello che mi rimane da capire è cosa faccia di preciso la macro Prepara_ecopia_Sigma()
esegue un autofill direttamente sul foglio1?? forse mi servirebbe un pezzo del tuo file per capire meglio
la parte finale di tutto il lavoro.
saluti
Guiap


aetio
Inviato: Thursday, September 23, 2010 2:10:19 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
le macro che ti ho scritto sono state fatte dal programma, che seguiva passo-passo le mie operazioni :)
uno dei requisiti indispensabili di queste macro dev'essere obbligatoriamente- dico purtroppo- la possibilità di un "facile" intervento da parte di chi, come me, non è in grado di metter mano ad apparenti semplici istruzioni (rimango allibito dalla tua sintesi e precisione nel redigere la macro
Commenta:
Sub copiaselezione()
Dim Miacoll()
ReDim Miacoll(55)
x = ActiveCell.Row
N = 1
For i = 3 To 7
Set area = Range(Cells(x, i), Cells(x + 10, i))
For Each cl In area
If cl.Value <> "" Then
Miacoll(N) = cl.Value
N = N + 1
End If
Next cl
Next i
ol = 36
col2 = 1
ReDim Preserve Miacoll(N)
Set area = Nothing
For a = LBound(Miacoll) To UBound(Miacoll)
Sheets("foglio2").Cells(x, col).Value = Miacoll(a)
Sheets("Sigma").Cells(x, col2).Value = Miacoll(a)
col = col + 1
col2 = col2 + 1
Next a
Range("H" & x + 1).Select
Sheets("foglio2").Select
Range("H" & x).Select
Sheets("Sigma").Select
Range("BD" & x).Select
Sheets("foglio1").Select
End Sub

quando l'ho letta mi si è aperta in automatico la bocca dall'ammirazione... ammirazione che dopo qualche secondo ha lasciato il posto alla rabbia con me stesso per non essere in grado di seguirti fino a questo punto!)

purtroppo il mio (e pure di coloro che useranno "sul terreno" le tabelle) livello di ignoranza in questa materia m'impone un passo indietro... un ritorno coi piedi per terra. Le tabelle a cui applico le macro sono assai variegate e richiedono continui interventi manuali per adattarle alle varie tipologie; ad esempio il foglio F.2 nella realtà contiene una corposa serie di codici interni a cui quelle tabelle si riferiscono, e viene intercambiato di volta in volta a seconda delle esigenze contingenti... come pure le colonne di Foglio 1 nominate "A1,F1,K1,P1,U1,Z1,AE1,AJ1,AO1,AT1,AY1,BD1,BI1,BN1,BS1,BX1,CC1,CH1,CM1,CR1,CW1,DB1,DG1,DL1,DQ1,DV1" in realtà sono il risultato di calcoli fatti nelle colonne ad esse adiacenti che come risultato danno i valori in esse contenuti... In poche parole in questo caso specifico la cosa si complica in modo esponenziale e dopo lunga e ponderata riflessione (non senza svariate prove di simulazione)sono costretto a dover dire che abbiamo raggiunto il tetto... e siamo solo al piano terra ahahahahah...
Ho provato a preparare uno stralcio per inviartelo, ma mi sono reso conto che appena vario la cartella di tabelle a cui devo applicare le macro sono di nuovo a capo...
Per darti un'idea di come mi sento mentre ti sto crivendo questa "semi-bandiera bianca" ti rimando alle scene iniziali del capolavoro di Kubrick "2001: Odissea nello spazio" quando il pitecantropo ha visto il misterioso monolito nero e con aria impaurita, ma con altrettanta curiosità, lo tocca con grande timore... Purtroppo avendo a che fare con altri collaboratori devo cercare di ehm...mixare... il tutto tenendo ben presente quali sono le capacità di chi utilizzerà queste tabelle :)))))
Penso che tu abbia ben compreso... ;)
Una cosa certamente fattibile sarebbe invece quella di adattare la macro

Sub confronta()

Dim colonna As Integer
For n = 14 To 14 'da impostare ogni volta
colonna = 82
Set area1 = Range(Cells(n, 56), Cells(n, 81))
Set area2 = Range(Cells(n, 1), Cells(n, 55))
For Each cl In area1
For Each cl2 In area2
If cl = cl2 Then
With cl
.Interior.ColorIndex = 36
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
Cells(n, colonna).Value = cl.Value
colonna = colonna + 1
End If
Next cl2
Next cl
Set area = Nothing
Set area2 = Nothing
Next n
Columns("CD:ED").ClearContents
End Sub

ad un confronto della riga attiva, dato in automatico in base alla riga in cui ci si trova, anziché all'istruzione di esaminare tutta la tabella...
Grazie assai e buona giornata,
eZio
a10n11
Inviato: Thursday, September 23, 2010 6:36:17 PM

Rank: AiutAmico

Iscritto dal : 5/29/2003
Posts: 1,694
aetio ha scritto:

quando l'ho letta mi si è aperta in automatico la bocca dall'ammirazione... ammirazione che dopo qualche secondo ha lasciato il posto alla rabbia con me stesso per non essere in grado di seguirti fino a questo punto!)


Salve
se passi riga per riga la macro, ti accorgerai che non ha nulla di eccezionale. Il codice non fa altro che scrivere in un array i valori del range selezionato escludendo le celle vuote e le riversa nei due fogli,



aetio ha scritto:

Sub confronta()

Dim colonna As Integer
For n = 14 To 14 'da impostare ogni volta
colonna = 82
Set area1 = Range(Cells(n, 56), Cells(n, 81))
Set area2 = Range(Cells(n, 1), Cells(n, 55))
For Each cl In area1
For Each cl2 In area2
If cl = cl2 Then
With cl
.Interior.ColorIndex = 36
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
Cells(n, colonna).Value = cl.Value
colonna = colonna + 1
End If
Next cl2
Next cl
Set area = Nothing
Set area2 = Nothing
Next n
Columns("CD:ED").ClearContents
End Sub

ad un confronto della riga attiva, dato in automatico in base alla riga in cui ci si trova, anziché all'istruzione di esaminare tutta la tabella...
Grazie assai e buona giornata,
eZio


Per la macro in questione, se non ho capito male, vorresti che elabori soltanto una riga e non esegua il ciclo per tutta la tabella, quindi la variabile "N" dovrà rappresntare una singola riga.

1 Soluzione: con input manuale all'interno della macro:


Sub confronta()
Dim colonna As Integer
N = InputBox("dimmi Numero riga", "Numero Riga")
colonna = 82
Set area1 = Range(Cells(N, 56), Cells(N, 81))
Set area2 = Range(Cells(N, 1), Cells(N, 55))
For Each cl In area1
For Each cl2 In area2
If cl = cl2 Then
With cl
.Interior.ColorIndex = 36
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
Cells(N, colonna).Value = cl.Value
colonna = colonna + 1
End If
Next cl2
Next cl
Set area = Nothing
Set area2 = Nothing
Columns("CD:ED").ClearContents
End Sub

2 soluzione: con riga prelevata dalla cella attiva del foglio.

Sub confrontaBis()
Dim colonna As Integer
N = ActiveCell.Row
colonna = 82
Set area1 = Range(Cells(N, 56), Cells(N, 81))
Set area2 = Range(Cells(N, 1), Cells(N, 55))
For Each cl In area1
For Each cl2 In area2
If cl = cl2 Then
With cl
.Interior.ColorIndex = 36
.Borders.LineStyle = xlContinuous
.Borders.Weight = xlThin
End With
Cells(N, colonna).Value = cl.Value
colonna = colonna + 1
End If
Next cl2
Next cl
Set area = Nothing
Set area2 = Nothing
Columns("CD:ED").ClearContents
End Sub

saluti
Giap


aetio
Inviato: Thursday, September 23, 2010 10:24:10 PM

Rank: AiutAmico

Iscritto dal : 5/10/2010
Posts: 723
Ciao,
a10n11 ha scritto:
se passi riga per riga la macro, ti accorgerai che non ha nulla di eccezionale. Il codice non fa altro che scrivere in un array i valori del range selezionato escludendo le celle vuote e le riversa nei due fogli

Scritta così è disarmante... ahahahahah ...Beh! a intuito capisco che il codice fa quelle operazioni, ma è la sintassi così filante, sintetica, elaborata che mi manda in estasi..... Gran bel lavoro Giap!! Eccezionale........
per quanto riguarda la macro "confronta" la 2 soluzione è perfetta... è proprio quella.
Grazie assai e buona notte,
eZio
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.