| Risultati da salvare di
Marco18 |
Ciao a tutti! in c2 del foglio2 ho il risultato
finale di una elaborazione che, per semplicità, suppongo sia la
somma di di a2 e b2. il codice che ho scritto nell’apposito
spazio (macro “elaboraesalvaâ€), fa in modo che i risultati di ogni
elaborazione, vengano messi in colonna , precisamente nella colonna
h a partire da h2 in giù. fin qui tutto bene. a questo punto
mi sono chiesto se non fosse possibile automatizzare l’operazione di
prelevamento del risultato esposto in c2 e la sua trasposizione in
colonna h senza il bisogno di attivare manualmente la macro. la
prima cosa che mi è venuta in mente è stata di scrivere una
procedura worksheet_change. ho ritenuto, tuttavia di non
scriverla sul modulo associato al foglio2 , perchè in esso avviene
l’elaborazione dei dati con continui cambi di valore delle celle in
esso contenute. ho pensato allora di utilizzare il foglio3
(vuoto) e di inserire in a1 di tale foglio la formula
=foglio2!c2. a questo punto mi ritrovo in a1 del foglio3
un’unica cella che cambia valore solamente quando cambia il
risultato dell’elaborazione che sta avvenendo nel foglio2.
apparentemente, dunque, le condizioni ideali per inserire nel
modulo associato al foglio3 la procedura:
private sub
worksheet_change(byval target as range) call elaboraesalva
end sub
la quale ha il compito di far partire la macro
ogni volta che cambia il valore di a1 del foglio3.
purtroppo
ciò non accade, o meglio, la macro parte solo se sono io,
manualmente, a cambiare il valore di una qualsiasi cella del
foglio3, mentre se il valore cambia grazie alla formula in a1 non
succede nulla. cosa sto sbagliando?
Sub elaboraesalva()
Sheets("Foglio2").Select
ActiveSheet.Range("C2").Select
Selection.Copy
Range("H1").Select
Do
ActiveCell.Offset(1).Select
Loop Until ActiveCell.Value = ""
Selection.PasteSpecial Paste:=xlPasteValues, Operation:=xlNone, _
SkipBlanks:=False, Transpose:=False
Application.CutCopyMode = False
End Sub | |
|
| Ciao di Apoben64 |
A me sembra che la macro del foglio3 incompleta ,
nel senso che per far partire la tua macro, questa necessiti di una
istruzione del tipo: if range("a1").value <>"" then
call elaborasalva end if quindi devi creare un evento
per l'attivazione . peraltro personalmente , se vuoi mantenere
il valore nel foglio 3 , dovresti copiarlo esempio in b1 e in questo
modo al cambiamento del valore in a1 attivare la tua macro .
prova il mio è solo un suggerimento a prima vista . sono in
partenza, ma spero che altri ti possono aiutare, se nò ci risentiamo
lunedì. un saluto e buon weekend ! |
|
| Risultati da salvare di marco18
di Patrik |
Ciao marco18. copia tutto e incolla nel modulo
di foglio2. foglio3 non dovrebbe più servirti. by,
patrik.
'Sostituisci la stringa di AreaUtente con il massimo intervallo
'di Foglio2 che può essere interessato da input-utente.
Const AreaUtente As String = "$A$1:$K$10"
'
'Sostituisci la stringa di AreaRisultati con il massimo
'intervallo che vuoi vedere e valorizzare a discesa.
Const AreaRisultati As String = "H1:H20"
Private Sub Worksheet_Change(ByVal Target As Range)
Dim Temp As Range
'
Set Temp = Application.Intersect(Range(AreaUtente), Target)
'esce se la modifica non rientra nel campo previsto
If Temp Is Nothing Then Exit Sub
'________________________________________________
'Questa sezione impedisce un Change ricorsivo se :
'1) Ti ritrovi con AreaInput che INCLUDE AreaRisultati, cioè
'se tu avessi predisposto dei campi Input anche a destra o in
'basso rispetto a colonna H....
'2) Avessi necessità di agire MANUALMENTE sui
'valori-Risultato ottenuti.
'
'Se non è così puoi cancellarla.
'
Set Temp = Application.Intersect(Range(AreaRisultati), Target)
If Not Temp Is Nothing Then Exit Sub
'________________________________________________
'
elaboraesalva
End Sub
Sub elaboraesalva()
'Scrive a scendere fintantochè c'è spazio nel range AreaRisultati che hai impostato, dopodichè sovrascrive l'ultimo valore.
With WorksheetFunction
Range(AreaRisultati).Cells(1, 1).Offset(.Min(.CountA(Range(AreaRisultati)), 65535), 0).Value = Range("C2").Value
End With
End Sub
| |
|
| Ciao marco di Fabio22 |
Condivido il parere di luca. ritengo che il tuo
problema sia dovuto al fatto che l'evento change non si verifica
quando le celle cambiano durante il ricalcolo di un foglio. e'
sufficiente cambiare il nome della procedura associata al foglio3
lasciando tutto il resto così com'è. mi spiego: nel modulo associato
al foglio3 anzichè scrivere private sub worksheet_change(byval
target as range) scrivi: private sub worksheet_calculate
lasciando tutto il resto così com'è. ciao. --fabio |
|