Condividi tramite

Filtrare dati con Macro VBA

Anonimo
2021-05-18T20:17:09+00:00

Buonasera,

non riesco a trovare una soluzione ottimale con VBA per Excel per la selezione di alcuni dati in tabella.

In una cartella di lavoro sono presenti due fogli, il primo "ValoriPrecipitazioni" e il secondo "Temperature".

Da Cella A2 a Cella Fn riporto città e valori precipitazioni dall'anno 2009 all'anno 2013.

Da Cella I2 a Cella J2 indico dei valori (nell'esempio minimo e massimo  delle precipitazioni riferite all'anno 2009).

A partire da L2 e sino ad Nn devo riportare il nome della città, il valore del 2009 e il valore del 2013 solo se detti valori sono compresi tra il "minimo" e il "massimo" indicato da I2 a J2.

Sono riuscito a scrivere delle linee di istruzioni dove la condizione sul valore massimo non viene rispettata e non riesco a trovare la soluzione per uscirne.

Nel foglio "Temperature" in presenza di numeri negativi i limiti non sono rispettati.

Se possibile chiedo un aiuto

di seguito il codice delle due macro

Sub FiltroPrecipitazioni()

Dim i As Integer

Dim RigaScrittura As Integer

Dim UltimaRigaCittà As Integer

UltimaRigaCittà = Sheets("ValoriPrecipitazioni").Range("A1").End(xlDown).Row

Sheets("ValoriPrecipitazioni").Range("L2:Q" & UltimaRigaCittà).Clear

RigaScrittura = 2

For i = 2 To UltimaRigaCittà

    If Sheets("ValoriPrecipitazioni").Range("B" & i) < Sheets("ValoriPrecipitazioni").Range("I2") And _

        Sheets("ValoriPrecipitazioni").Range("B" & i) > Sheets("ValoriPrecipitazioni").Range("J2") Then GoTo ContinuaCittà

        Sheets("ValoriPrecipitazioni").Range("L" & RigaScrittura) = Sheets("ValoriPrecipitazioni").Range("A" & i)

        Sheets("ValoriPrecipitazioni").Range("M" & RigaScrittura) = Sheets("ValoriPrecipitazioni").Range("B" & i)

        Sheets("ValoriPrecipitazioni").Range("N" & RigaScrittura) = Sheets("ValoriPrecipitazioni").Range("F" & i)

        RigaScrittura = RigaScrittura + 1

ContinuaCittà:

Next i

End Sub

Sub FiltroTemperature()

Dim i As Integer

Dim RigaScrittura As Integer

Dim UltimaRigaCittà As Integer

UltimaRigaCittà = Sheets("Temperature").Range("A1").End(xlDown).Row

Sheets("Temperature").Range("L2:Q" & UltimaRigaCittà).Clear

RigaScrittura = 2

For i = 2 To UltimaRigaCittà

    If Sheets("Temperature").Range("B" & i) < Sheets("Temperature").Range("I2") And _

        Sheets("Temperature").Range("B" & i) > Sheets("Temperature").Range("J2") Then GoTo ContinuaCittà

        Sheets("Temperature").Range("L" & RigaScrittura) = Sheets("Temperature").Range("A" & i)

        Sheets("Temperature").Range("M" & RigaScrittura) = Sheets("Temperature").Range("B" & i)

        Sheets("Temperature").Range("N" & RigaScrittura) = Sheets("Temperature").Range("F" & i)

        RigaScrittura = RigaScrittura + 1

ContinuaCittà:

Next i

End Sub

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento

Risposta accettata dall'autore della domanda

  1. Anonimo
    2021-05-19T08:32:53+00:00

    Entrambi devono essere compresi tra minimo e massimo?

    Quindi basta che uno dei due non è compreso e non si inserisce la città?

    Sub FiltroTemperature()
    Const header As String = "A1:F1"
    
    Dim i As Integer, min As Integer, max As Integer
    Dim RigaScrittura As Integer
    Dim val As Range
    Dim citta As String, temp1 As Integer, temp2 As Integer
    
    Dim UltimaRigaCittà As Integer
    UltimaRigaCittà = Sheets("Temperature").Range("A1").End(xlDown).Row
    Sheets("Temperature").Range("L2:Q" & UltimaRigaCittà).Clear
    
    RigaScrittura = 2
    min = Range("I2")
    max = Range("J2")
    
    For Each val In Range("A2:A" & UltimaRigaCittà)
        citta = val
        temp1 = Intersect(val.EntireRow, Range(header).Find("2009").EntireColumn)
        temp2 = Intersect(val.EntireRow, Range(header).Find("2013").EntireColumn)
        'qui controllo entrambe, se basta una delle due cambia And in mezzo con Or
        'If (temp1 >= min And temp1 <= max) Or (temp2 >= min And temp2 <= max) Then
        If (temp1 >= min And temp1 <= max) And (temp2 >= min And temp2 <= max) Then
            Range("L" & RigaScrittura) = val
            Range("M" & RigaScrittura) = temp1
            Range("N" & RigaScrittura) = temp2
            RigaScrittura = RigaScrittura + 1
        End If
    Next val
    
    End Sub
    

    Questo è per FiltroTemperature, la stessa cosa si può fare per filtraprecipitazione, ho notato però che c'è nella casella H2 l'anno, devi anche controllare che l'anno sia quello per il min e il max?

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento

3 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2021-05-19T09:17:28+00:00

    Grazie per l'aiuto. Non ci sarei arrivato mai a strutturare la macro così.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2021-05-19T04:40:49+00:00

    allego collegamento al file esempio https://1drv.ms/x/s!AvfYTkzIjIXCh9pYlzzPlQjpID0GSQ?e=JIRZWd

    grazie

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2021-05-18T22:14:13+00:00

    Ciao,

    bentrovato nella community Microsoft, piacere di aiutarti, sono Daniele un consulente indipendente,

    in questi casi e' buona norma pubblicare un file di esempio esente di dati sensibili caricandolo per esempio su qualche sito di upload oppure condividendolo tramite OneDrive.

    Vedi il link di seguito per sapere come fare per condividere tramite OneDrive:

    https://support.office.com/it-it/article/condiv...

    Aspettiamo il file per poterti aiutare più velocemente.

    Saluti,

    Daniele

    La risposta è stata utile?

    0 commenti Nessun commento