Salvataggio risultati

Storico discussioni

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

Cognolato Studio © 2005