Condividi tramite

VBA: codice per impostare cella ad una valore in base a criteri

Anonimo
2017-12-07T14:29:05+00:00

Buongiorno,

devo valorizzare il contenuto di una cella (RISULTATO) in base al contenuto delle informazioni riportate in tre campi distinti della stessa tabella  ed una lista di valori che si trova in un altra tabella in base a dei criteri.

I criteri da utilizzare sono:

Il valore da riportare  varia in base a questi criteri e secondo diverse priorità:

Innanzi tutto se il valore della cella nel "CAMPO13" è "descrizione3_campo13", nella rispettiva riga della colonna AH riporterò come RISULTATO "bloccato".

Solo se non viene soddisfatta questa condizione, verifico il valore del CAMPO14,  se è uguale a "caso1", il RISULTATO da riportare nella riga della colonna AH sarà prioritariamente il contenuto della rispettiva cella del campo12 solo se questo è diverso da vuoto e diverso da uno dei valori presenti nella tabella "valori esclusi", altrimenti dovrà essere riportato come RISULTATO il valore presente nel campo13, sempre nel caso in cui quest'ultimo sia diverso da vuoto e diverso da uno dei valori presenti nella tabella "valori esclusi". Se non è possibile assegnare uno dei valori del campo12 o del campo13, il valore da riportare come RISULTATO sarà "valore assente".

In tutti i casi in cui il valore del CAMPO14 è diverso da "caso1", il RISULTATO da riportare nella riga della colonna AH sarà prioritariamente  il contenuto della rispettiva cella del campo13, in seconda priorità il campo12 se il valore da riportare è vuoto o presente nella solita lista di valori da escludere. A cascata se anche il campo12 è un risultato da escludere (perchè vuoto o compreso nella lista valori da escludere), riporterò "valore assente.

Ho provato a fare questo (ad esclusione della ricerca del valore nella tabella "valori da escludere") con il codice sotto riportato... non so come fare la verifica sulla tabella dei valori da escludere, il file di esempio è qui.

Inoltre questa operazione andrebbe fatta su una lista di oltre 400.000 righe ed ho paura che questa da me abbozzata sia una soluzione snella...

Public Sub m()

    Dim wk As Workbook

    Dim sh1 As Worksheet

    Dim sh2 As Worksheet

    Dim lng As Long

    Dim lUltRiga As Long

    Dim Risultato As String

    Dim valore1 As String

    Dim valore2 As String

    Dim condizione1 As String

    Dim condizione2 As String

    Set WB = ThisWorkbook

    With WB

        Set sh1 = .Worksheets("dati")

    End With

    With sh1

       lUltRiga = Range("A" & Rows.Count).End(xlUp).Row

For lng = 2 To lUltRiga

            condizione1 = Range("M" & lng).Value

            condizione2 = Range("N" & lng).Value

            valore1 = Range("L" & lng).Value

            valore2 = Range("M" & lng).Value

If condizione1 = "descrizione3_campo13" Then

              Risultato = "BLOCCATO"

              Range("AH" & lng).Value = Risultato

 GoTo fine

End If

If condizione2 = "caso1" Then

               Risultato = valore1

                  If Risultato = "" Then

                        Risultato = valore2

                        If Risultato = "" Then

                              Risultato = "valore non valido"

                              Range("AH" & lng).Value = Risultato

                        End If

                   Range("AH" & lng).Value = Risultato

                   End If

              Range("AH" & lng).Value = Risultato

            End If

         If condizione2 <> "caso1" Then

                  Risultato = valore2

                        If Risultato = "" Then

                        Risultato = valore1

                              If Risultato = "" Then

                              Risultato = "valore non valido"

                              Range("AH" & lng).Value = Risultato

                              End If

                         End If

             Range("AH" & lng).Value = Risultato

          End If

fine:

Next

End With

    Set sh = Nothing

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

Anonimo
2017-12-08T14:14:54+00:00

Ciao nixio,

ho provato il codice su una piccola parte di dati ed il risultato ottenuto è perfetto.

Bene!

Purtroppo c'è quel limite delle numerose righe... il file originale contiene piu di 400K righe :-(

Provando infatti su quei dati si riceve il messaggio di errore "Memoria esaurita"...

Controlla che tu stia utilizzando l'ultima versione del mio codice, La versione prima della modifica comprendeva una istruzione di scrivere al foglio un valore per ogni riga del arrDati. Questo comando era utilizzata da me, per commodità, solo per testare il codice ma renderebbe il codice lentissimo nel caso di centinaia di migliaia di righe di dati.

Se hai ancora un problema, si potrebbe sempre modificare il codice per agire su (mettiamo) 100.000 righe alla volta. A questo proposito, nota che io avevo provato il codice con più di 100.000 righe e su un vechio pc con solo poca memoria.

Tuttavia, credo sarebbe meglio che mi inviassi  la tua database di 400.000 record in modo che posso testarla direttamente. Faccendo clic sul mio profilo, troverai un indirizzo decifrabile.

===

Regards,

Norman

La risposta è stata utile?

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

6 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-12-08T19:06:36+00:00

    Ciao nixio,

    Grazie Norman, il tuo codice funziona alla perfezione anche sul mio dataset di 414.030 record...

    Benissimo! Mi fa piacere - anche perchè se non fosse così, sarei venuto di persona per scrivere i dati a mano! 

    l'errore iniziale che ti ho evidenziato si presentava perchè era presente in altra colonna un cercavert che avevo dimenticato di cancellare...

    I problemi più semplice sono spesso i più facile da trascurare!

    Alla prossima.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2017-12-08T17:02:32+00:00

    Grazie Norman, il tuo codice funziona alla perfezione anche sul mio dataset di 414.030 record... l'errore iniziale che ti ho evidenziato si presentava perchè era presente in altra colonna un cercavert che avevo dimenticato di cancellare...

    Scusa per il disguido e grazie 1000

    Nixio

    La risposta è stata utile?

    0 commenti Nessun commento