Lista dinamica

di il
42 risposte

42 Risposte - Pagina 3

  • Re: Lista dinamica

    Non leggo mai i MP, comunque non ho capito bene, spiega meglio quale caso non funziona specificando i contenuti dei 2 fogli.
    Tu parli di riga vuota, ma a me sembra che avresti dovuto dire COLONNA vuota
  • Re: Lista dinamica

    patel ha scritto:


    Non leggo mai i MP, comunque non ho capito bene, spiega meglio quale caso non funziona specificando i contenuti dei 2 fogli.
    Tu parli di riga vuota, ma a me sembra che avresti dovuto dire COLONNA vuota

    Si colonna vuota perdonami, ma nello specifico "cella vuota" . Se riempio alcune celle delle corrispondenti MP (anche con 0) allora deve confrontarle ma se lascio vuote le celle allora non deve verificare se rientrano nel range. Appena torno a casa faccio quello che mi hai chiesto ma forse già così è chiaro?
  • Re: Lista dinamica

    Prova così
    Sub cerca()
    Set sh1 = Sheets(1)
    Set sh2 = Sheets(2)
    LR = sh2.Cells(Rows.Count, "A").End(xlUp).Row ' ultima riga utile
    dr = 2
    ncol = 15 ' numero criteri
    scarto = sh1.Range("C2")
    For r = 10 To LR
      n = 0
      For c = 1 To ncol
        If Not IsNull(Abs(sh2.Cells(r, c + 1))) Then
            sh1cella = sh1.Cells(c + 2, "B") ' <<<<<<<<<<<<<<
            dif = Abs(sh2.Cells(r, c + 1) - sh1cella) ' <<<<<<<<<<<<<<
                If dif <= sh2.Cells(r, c + 1) * scarto Or sh1cella = "" Then ' <<<<<<<<<<<<<<
                    n = n + 1
                End If
        End If
      Next
      If n = ncol Then
        sh2.Range("A" & r & ":A" & r).Copy Range("I" & dr)
        dr = dr + 1
      End If
    Next
    End Sub
  • Re: Lista dinamica

    patel ha scritto:


    Prova così
    Sub cerca()
    Set sh1 = Sheets(1)
    Set sh2 = Sheets(2)
    LR = sh2.Cells(Rows.Count, "A").End(xlUp).Row ' ultima riga utile
    dr = 2
    ncol = 15 ' numero criteri
    scarto = sh1.Range("C2")
    For r = 10 To LR
      n = 0
      For c = 1 To ncol
        If Not IsNull(Abs(sh2.Cells(r, c + 1))) Then
            sh1cella = sh1.Cells(c + 2, "B") ' <<<<<<<<<<<<<<
            dif = Abs(sh2.Cells(r, c + 1) - sh1cella) ' <<<<<<<<<<<<<<
                If dif <= sh2.Cells(r, c + 1) * scarto Or sh1cella = "" Then ' <<<<<<<<<<<<<<
                    n = n + 1
                End If
        End If
      Next
      If n = ncol Then
        sh2.Range("A" & r & ":A" & r).Copy Range("I" & dr)
        dr = dr + 1
      End If
    Next
    End Sub
    Mi scuso per.il ritardo ma non ho avuto modo di provarlo ! Alla grande come sempre...! Funziona perfettamente. Buona giornata!
  • Re: Lista dinamica

    patel ha scritto:


    Il controllo è fatto dalle righe
       dif = Abs(sh2.Cells(r, c + 1) - sh1.Cells(c + 2, "B"))
       If dif <= sh2.Cells(r, c + 1) * scarto Then
    calcola la differenza dei due valori e controlla se questa è minore del 50% del valore del foglio2.
    Ciao! Che tu ci creda o no sto ancora usando il tuo codice macro per alcune valutazioni! L'ultimo codice era perfetto. Non so se dopo tutto questo tempo ci sei ancora e soprattutto vuoi aiutarmi ...mi piacerebbe cambiare (se semplice e possibile) la logica dietro il tuo lavoro con:

    - Anzichè: calcola la differenza dei due valori e controlla se questa è minore del 50% del valore del foglio2.
    - Sarebbe meglio: controlla se il valore del foglio 2 è entro il 50% del valore inserito nel foglio 1

    Esempio di compatibilità rispettata 1 (scarto 50%):
    Valore foglio 1: 10
    Valori possibili foglio 2: tra 5 e 15 inclusi

    Esempio di compatibilità rispettata 2 (scarto 50%):
    Valore foglio 1: 5
    Valori possibili foglio 2: tra 2,5 e 7,5 inclusi

    Codice di partenza:
    Sub cerca()
    Set sh1 = Sheets(1)
    Set sh2 = Sheets(2)
    LR = sh2.Cells(Rows.Count, "A").End(xlUp).Row ' ultima riga utile
    dr = 2
    ncol = 15 ' numero criteri
    scarto = sh1.Range("C2")
    For r = 10 To LR
      n = 0
      For c = 1 To ncol
        If Not IsNull(Abs(sh2.Cells(r, c + 1))) Then
            sh1cella = sh1.Cells(c + 2, "B") ' <<<<<<<<<<<<<<
            dif = Abs(sh2.Cells(r, c + 1) - sh1cella) ' <<<<<<<<<<<<<<
                If dif <= sh2.Cells(r, c + 1) * scarto Or sh1cella = "" Then ' <<<<<<<<<<<<<<
                    n = n + 1
                End If
        End If
      Next
      If n = ncol Then
        sh2.Range("A" & r & ":A" & r).Copy Range("I" & dr)
        dr = dr + 1
      End If
    Next
    End Sub
    

    Ciao e grazie mille di cuore ..buon Natale!
  • Re: Lista dinamica

    Ho soltanto 75 anni ed ovviamente non ricordo più niente del problema, allega un file di esempio con dati e spiegazioni
  • Re: Lista dinamica

    patel ha scritto:


    Ho soltanto 75 anni ed ovviamente non ricordo più niente del problema, allega un file di esempio con dati e spiegazioni
    Ciao,

    Questo è il link al tool. Al momento funziona come ho quotato nel messaggio precedente, io vorrei che calcolasse semplicemente la differenza rispetto ad ogni valore, come scritto nel precedente post. Grazie

    https://drive.google.com/file/d/1XO1L2aBnDLjzBiLkn4Yhxr-yw1lVWZvI/view?usp=sharing
  • Re: Lista dinamica

    Prova a sostituire la riga
    If dif <= sh2.Cells(r, c + 1) * scarto Or sh1cella = "" Then
    con
    If sh2.Cells(r, c + 1) <= sh1cella * scarto Or sh1cella = "" Then
  • Re: Lista dinamica

    patel ha scritto:


    Prova a sostituire la riga
    If dif <= sh2.Cells(r, c + 1) * scarto Or sh1cella = "" Then
    con
    If sh2.Cells(r, c + 1) <= sh1cella * scarto Or sh1cella = "" Then
    Ciao,

    Grazie. In questo modo però non trova i casi in cui il valore è identico e la differenza è = 0. Quindi ho aggiunto un pezzo di codice in questo modo, che ne pensi?
     sh1cella = sh1.Cells(c + 1, "B") ' <<<<<<<<<<<<<<
            dif = Abs(sh2.Cells(r, c + 1) - sh1cella) ' <<<<<<<<<<<<<<
                If sh2.Cells(r, c + 1) <= sh1cella * scarto Or dif = 0 Or sh1cella = "" Then ' <<<<<<<<<<<<<<
                    n = n + 1
    Aggiornamento : Se il valore del foglio 2 è = 0 allora il codice lo vede comunque come idoneo, sembra anche non rispettare lo scarto
  • Re: Lista dinamica

    If (sh2.Cells(r, c + 1) <> 0 and sh2.Cells(r, c + 1) <= sh1cella * scarto) Or sh1cella = "" Then
  • Re: Lista dinamica

    patel ha scritto:


    If (sh2.Cells(r, c + 1) <> 0 and sh2.Cells(r, c + 1) <= sh1cella * scarto) Or sh1cella = "" Then
    Ciao, si questo risolve l'ultimo problema a cui ho dovuto comunque aggiungere dif = 0 come prima. Tuttavia lo scarto non è rispettato. Non saprei come scrivere la formula per cui sono accettati tutti i valori compresi tra il valore del foglio 1 +- lo scarto. Dopo di che direi che è fatta!!

    Esempio: Valore foglio 1: 20, scarto 5%

    Tutti i valori compresi tra 21 e 19 sono accettati. Ho provato con questa formula ma niente da fare
    If (sh2.Cells(r, c + 1) <> 0 And sh2.Cells(r, c + 1) <= sh1cella + sh1cella * scarto) And (sh2.Cells(r, c + 1) <> 0 And sh2.Cells(r, c + 1) >= sh1cella - sh1cella * scarto) Or dif = 0 Or sh1cella = "" Then
    Grazie sempre.
  • Re: Lista dinamica

    Prova così
    If (sh2.Cells(r, c + 1) <> 0 And sh2.Cells(r, c + 1) <= sh1cella + sh1cella * scarto) And sh2.Cells(r, c + 1) <> 0 And sh2.Cells(r, c + 1) >= (sh1cella - sh1cella * scarto)) Or dif = 0 Or sh1cella = "" Then
  • Re: Lista dinamica

    patel ha scritto:


    Prova così
    If (sh2.Cells(r, c + 1) <> 0 And sh2.Cells(r, c + 1) <= sh1cella + sh1cella * scarto) And sh2.Cells(r, c + 1) <> 0 And sh2.Cells(r, c + 1) >= (sh1cella - sh1cella * scarto)) Or dif = 0 Or sh1cella = "" Then
    Sembra funzionare! Adesso ci gioco per un po'! Grazie mille e buon anno nuovo.
Devi accedere o registrarti per scrivere nel forum
42 risposte