| | 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 | |
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) |
|
|