Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Macro ricopia ultimo valore non nullo

Ultimo Aggiornamento: 20/02/2021 12:21
Post: 7
Registrato il: 09/09/2020
Età: 35
Utente Junior
Excel 365 a 64 bit
OFFLINE
19/02/2021 17:54

Buonasera ragazzi,
ho ovviamente bisogno del vostro aiuto :D
Dovrei creare una macro la cui attivazione deve essere solo su richiesta e che riempia una determinata colonna.
Il mio file (di cui trovate un esempio in allegato) è costituito da due fogli, il primo contenente gli indici istat di tutti i mesi e il secondo contente una lista di clienti e il loro mese di riferimento per l'indice da associare.
La macro mi deve trovare per ogni cliente l'ultimo indice non nullo del mese di riferimento nel primo foglio e ricopiarlo nella terza colonna del secondo foglio.
Nell'esempio allegato, nel secondo foglio dovrà mettere in C1 0,5 (cioè il valore di febbraio 2018), in C2 0,8 (cioè il valore di dicembre 2017) e in C3 il valore di 0,7 (cioè marzo 2018).
La funzione di attivazione su richiesta è necessaria perchè i valori non dovranno cambiare quando in un secondo momento andrò ad inserire i nuovi valori nel foglio contente gli indici.
Spero di essere stata chiara, ovviamente fatemi pure domande.
Grazie in anticipo.
Post: 3.095
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
19/02/2021 20:06

Ciao
certamente c'è una via più semplice con AGGREGA o altro, ma io sono anziano e tant'è......

Prima di tutto devi togliere lo spazio finale ai nomi dei mesi in riga 1 di Indici Istat; es: GENspazio etc etc

Io l'ho tolto ai tre mesi interessati dal tuo esempio.

In C2 di Clienti, da trascinare:

=CERCA(9,99999999999999E+307;INDICE('Indici Istat'!$B$1:$M$100;;CONFRONTA($B2;'Indici Istat'!$B$1:$M$1;0)))


Se ti interessa una spiegazione relativa a 9,9999...E+370, leggi qui:

https://www.mrexcel.com/board/threads/9-9999999.102091/

saluti



[Modificato da dodo47 19/02/2021 20:09]
Domenico
Win 10 - Excel 2016
Post: 7
Registrato il: 09/09/2020
Età: 35
Utente Junior
Excel 365 a 64 bit
OFFLINE
19/02/2021 20:42

Giustissima soluzione che ho utilizzato anche io, in modo quasi uguale, all'inizio.
L'utilizzo che dovrò fare però del file, mi porterà ad aggiornare il foglio degli indici con i nuovi valori e a replicare i fogli dei clienti per le nuove scadenze. Questo implica che i valori che lui riporterà nel foglio clienti iniziale si aggiorneranno con quelli più recenti, cosa che non deve succedere.
Per questo avevo pensato di utilizzare una macro da attivare a richiesta che così facendo non farà cambiare i valori riportati dopo aver inserito i nuovi indici nel foglio corrispondente
Post: 1.097
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Veteran
Excel 2016-32bit Win11
OFFLINE
19/02/2021 22:13

Un saluto a tutti.
Se ti serve ancora una macro potresti usare come base di partenza questa mia da mettere in un modulo standard.
Però, per farla funzionare ho dovuto togliere lo spazio in più presente nei mesi della tabella Istat ed inoltre formattarli 'Generale'.
Option Explicit
Sub CercaIndiceIstat()
    Dim sht1   As Worksheet
    Dim sht2   As Worksheet
    Dim ur1    As Long
    Dim ur2    As Long
    Dim i      As Long
    Dim mese   As Range
    Set sht1 = Sheets("Clienti")
    Set sht2 = Sheets("Indici Istat")
    'trova l'ultima riga dei clienti
    ur1 = sht1.Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To ur1
        'cerca il mese
        Set mese = sht2.Range("B1:M1").Find(What:=sht1.Range("B" & i), LookIn:=xlValues, _
              SearchOrder:=xlByColumns, SearchDirection:=xlNext, SearchFormat:=False)
        'trova l'ultima riga della colonna del mese
        ur2 = sht2.Cells(Rows.Count, mese.Column).End(xlUp).Row
        'copia il valore corrispondente
        sht1.Range("C" & i) = sht2.Cells(ur2, mese.Column)
    Next i
End Sub
PS. se però scrivi così la riga del FIND non serve togliere lo spazio e nemmeno cambiare il formato ai mesi dell'Indice Istat:
Set mese = sht2.Range("B1:M1").Find(What:=sht1.Range("B" & i), _
    SearchOrder:=xlByColumns, SearchDirection:=xlNext)
PPS. anzi, se lo scrivi così (minimale) continua a funzionare:
Set mese = sht2.Range("B1:M1").Find(What:=sht1.Range("B" & i))
[Modificato da rollis13 19/02/2021 22:33]

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Post: 3.096
Registrato il: 06/04/2013
Utente Master
2010
OFFLINE
20/02/2021 10:11

ciao
un'alternativa a quanto proposto da Rollis (un carissomo saluto):

nel modulo del foglio clienti:

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Not Intersect(Target, Range("A2:A100")) Is Nothing Then
    Dim wk As Worksheet, ur As Long, Mese As String, c As Object
    Mese = Target.Offset(, 1).Value
    Set wk = Worksheets("indici istat")
    With wk.Rows("1")
        Set c = .Find(Mese, LookIn:=xlValues, LookAt:=xlPart)
        If Not c Is Nothing Then
            Target.Offset(, 2) = wk.Cells(Rows.Count, c.Column).End(xlUp)
        End If
    End With
End If
Cancel = True
End Sub


Facendo doppio click sul nome cliente riporta il valore cercato.

NB: avendo utilizzato il parametro "LookAt:=xlPart", non necessitano variazioni sulla riga 1 di codici istat

saluti



Domenico
Win 10 - Excel 2016
Post: 8
Registrato il: 09/09/2020
Età: 35
Utente Junior
Excel 365 a 64 bit
OFFLINE
20/02/2021 11:12

Re:
rollis13, 19/02/2021 22:13:

Un saluto a tutti.
Se ti serve ancora una macro potresti usare come base di partenza questa mia da mettere in un modulo standard.
Però, per farla funzionare ho dovuto togliere lo spazio in più presente nei mesi della tabella Istat ed inoltre formattarli 'Generale'.
Option Explicit
Sub CercaIndiceIstat()
    Dim sht1   As Worksheet
    Dim sht2   As Worksheet
    Dim ur1    As Long
    Dim ur2    As Long
    Dim i      As Long
    Dim mese   As Range
    Set sht1 = Sheets("Clienti")
    Set sht2 = Sheets("Indici Istat")
    'trova l'ultima riga dei clienti
    ur1 = sht1.Range("A" & Rows.Count).End(xlUp).Row
    For i = 2 To ur1
        'cerca il mese
        Set mese = sht2.Range("B1:M1").Find(What:=sht1.Range("B" & i), LookIn:=xlValues, _
              SearchOrder:=xlByColumns, SearchDirection:=xlNext, SearchFormat:=False)
        'trova l'ultima riga della colonna del mese
        ur2 = sht2.Cells(Rows.Count, mese.Column).End(xlUp).Row
        'copia il valore corrispondente
        sht1.Range("C" & i) = sht2.Cells(ur2, mese.Column)
    Next i
End Sub
PS. se però scrivi così la riga del FIND non serve togliere lo spazio e nemmeno cambiare il formato ai mesi dell'Indice Istat:
Set mese = sht2.Range("B1:M1").Find(What:=sht1.Range("B" & i), _
    SearchOrder:=xlByColumns, SearchDirection:=xlNext)
PPS. anzi, se lo scrivi così (minimale) continua a funzionare:
Set mese = sht2.Range("B1:M1").Find(What:=sht1.Range("B" & i))




Ho seguito il tuo suggerimento e.... FUNZIONA! Nonostante ciò mi da' un errore: "Errore di run.time '91': Varabile oggetto o variabile del blocco With non impostata".
Preciso che è la mia prima volta con le macro..
Ad ogni modo allego il file sul quale sto lavorando...
C'è modo di far funzionare la macro anche sui gruppi successivi e quindi appartenenti alle categorie Mensili e Semestrali direttamente, o bisogna ricopiare i codici variando i nomi variabili e indici?
Post: 1.098
Registrato il: 16/08/2015
Città: CORDENONS
Età: 67
Utente Veteran
Excel 2016-32bit Win11
OFFLINE
20/02/2021 12:21

Sì, però, se affermi "che è la mia prima volta con le macro" non puoi fornire un esempio iceberg; quando ho preparato la macro l'analisi l'ho fatta sulla struttura dei dati forniti presumendo che poi, in caso di dati reali diversi dall'esempio, uno possa sfruttarla come macro di base (l'ho anche detto) e procedere autonomamente alla personalizzazione.
La mia macro ora la puoi cambiare così:
Option Explicit
Sub CercaIndiceIstat()
    Dim sht1   As Worksheet
    Dim sht2   As Worksheet
    Dim ur1    As Long
    Dim ur2    As Long
    Dim i      As Long
    Dim cliente As Range
    Dim mese   As Range
    Set sht1 = Sheets("GENNAIO")
    Set sht2 = Sheets("Variazioni mese 1 anno")
    'trova l'ultima riga dei clienti
    ur1 = sht1.Range("A" & Rows.Count).End(xlUp).Row
    'cerca il mese
    For Each cliente In Range("A4:A" & ur1)
        i = cliente.Row
        If sht1.Range("A" & i) <> "" And sht1.Range("A" & i) <> "MENSILI" And sht1.Range("A" & i) <> "SEMESTRALE" Then
            Set mese = sht2.Range("B1:M1").Find(What:=sht1.Range("C" & i))
            'trova l'ultima riga della colonna del mese
            ur2 = sht2.Cells(Rows.Count, mese.Column).End(xlUp).Row
            'copia il valore corrispondente
            sht1.Range("D" & i) = sht2.Cells(ur2, mese.Column)
        End If
    Next cliente
End Sub

______________________________________________________________
C'è chi fa le COSE a CASO e chi fa CASO alle COSE (Ignoto)
Vota:
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 20:35. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com