Match 3 condizioni



  • Match 3 condizioni
    di Francesco (utente non iscritto) data: 14/10/2012 11:03:31

    Ciao ragazzi. sto giocando con il codice da voi gentilmente curato.
    Sta volta voglio identificare in un foglio le righe che hanno 3 elementi in comune(data, destinatario, prezzo)
    ho pasticciato con il codice ma non funziona bene : cosa ho sbagliato?
    (allego file di esempio)



  • di Vecchio Frac data: 14/10/2012 12:06:11

    Stai testando una condizione sempre e comunque vera:

    " If cella.Offset(0, 2) = .Cells(x.Row, 4) And cella.Offset(0, 5) = .Cells(x.Row, 7) Then "

    nell'esempio che hai postato stai confrontando il valore della cella posta due colonna a destra di quella attuale, partendo da B, cioè in D, con il valore della cella posta alla stessa riga del valore cercato, colonna 4, cioè in D: è ovvio che i due valori si riferiscono alla stessa cella e quindi coincidono. Stesso ragionamento per quello che succede dopo And: confronti la cella posta cinque colonne a destra della attuale (da B --> G) con quella che si trova nella colonna 7, cioè G.
    Per effetto di questo, verrà inserita la stringa "trovato" nella cella da te specificata.

    Rivedi la logica del codice (tra parentesi: non so se in produzione ti serve, ma le variabili "trovato" e "riga" sono perfettamente inutili nell'esempio postato).

    Se come dici la " riga 7 e 8 devono essere identificate la 9 NO ", non è che ti basta verificare una sola condizione? perchè dici che vuoi un controllo su tre celle? in ogni caso per come hai fatto tu, sei sulla strada buona; cioè basta confrontare le celle giuste in And tra loro.






  • di Francesco (utente non iscritto) data: 14/10/2012 12:37:50

    Cavolo hai ragione!! (con fronto in pratica la riga trovata tramite data con se stessa)
    ho bisogno di trovare nel foglio tutte le righe che hanno data destinatario e costo uguali.
    cosi ho pensato di trovare prima la data e poi verificare che destinatario e costo coincidono.
    non è un controllo 3 celle o mi spiego male? (sempre per imparare )



  • di Vecchio Frac data: 14/10/2012 13:19:03

    Bè, allora in prima battuta io penserei di fare due cicli, così:
    - scorrere l'intero range dalla prima alla penultima cella
    - ad ogni passata controllare che non ci sia già la scritta "trovato" nella cella adiacente (significa che questa riga è già stata processata)
    - quindi creare una stringa "data" & "destinatario" & "costo" con i dati della riga della cella attiva
    - dalla cella attiva in giù scorrere l'intero range fino all'ultima cella
    - confrontare la prima stringa con una nuova, creata ad ogni passaggio di questo secondo ciclo For, con "data" & "destinatario" & costo"
    - se le stringhe coincidono, inserire la formula "trovato" nella cella adiacente di tutte le righe interessate (sia quella del primo ciclo che del secondo)

    Questo funzionerà anche se due cicli For allungano i tempi di esecuzione... poi penseremo ad ottimizzare magari con soluzioni più eleganti :)
    Prova a buttare giù un pezzo di codice che segua l'algoritmo descritto (se ho la possibilità, .i.e. se i bimbi mi lasciano, mi ci metto anch'io).





  • di Francesco (utente non iscritto) data: 14/10/2012 13:47:25

    Non preoccuparti sei sempre disponibile.

    in pratica usi concatena!? ci avevo gia pensato anche io per il precedente lavoro ma in effetti la durata era troppo eccessiva.
    cosi avevo pensato di adattare il lavoro di harry ed anzichè verificare che ci sia ID corretto e che lo sia anche il costo
    al posto id - data , costo si controlla ancora ed aggiungere controllo su destinatario.
    il vantaggio è che tutto si fa sullo stesso foglio.
    speravo che il lavoro che ho svolto rispecchiasse questo tentativo




  • di Vecchio Frac data: 14/10/2012 13:56:55

    Ho buttato giù un codice di fretta :(
    Bruttino da vedere, anche da interpretare, lo ammetto.
    A me funziona direi decentemente (con buona velocità), il punto da verificare è che non ci siano celle riempite in colonna B oltre la tabella (perchè COUNT che ho messo all'inizio, altrimenti, restituisce un valore sbagliato).
    Non ho detto che il tuo codice non vada bene... nè che non rispecchiasse questo tentativo.
    Ci tengo a precisare che ho abbozzato una soluzione diciamo così molto praticona anche se funzionale, e che soluzioni con Find eccetera sono più eleganti :)
     
    Option Explicit
    
    Sub tre_condizioni_vecchiofrac()
    Dim ur As Long, tab1 As Range, x As Range
    Dim ciclo1 As Range, ciclo2 As Range, s1 As String, s2 As String
    
        Sheets("foglio1").[P:P].ClearContents
        
        Application.ScreenUpdating = False
           
        With Sheets("foglio1")
            ur = .[B1].Cells(Rows.Count, 2).End(xlUp).Row ' trovo ultima riga
            Set tab1 = Range(.Cells(2, 2), .Cells([COUNTA(B:B)] + 1, 2)) 'range colonna b fino ultima riga
        End With
    
        'scorri dalla prima riga alla penultima, escludendo l'intestazione della tabella
        For Each ciclo1 In tab1.Offset(1).Resize(tab1.Rows.Count - tab1(1).Row)
            'controlla che non abbiamo già processato la riga
            If ciclo1.Offset(, 14) <> "trovato" Then
                s1 = Trim(ciclo1) & Trim(ciclo1.Offset(, 2)) & Trim(ciclo1.Offset(, 5))
                'scorri dalla cella successiva a quella attiva in ciclo1 fino alla fine della tabella
                For Each ciclo2 In tab1(ciclo1.Row).Resize(tab1.Rows.Count - 1, 1)
                    'controlla che non abbiamo già processato la riga
                    If ciclo2.Offset(, 14) <> "trovato" Then
                        s2 = Trim(ciclo2) & Trim(ciclo2.Offset(, 2)) & Trim(ciclo2.Offset(, 5))
                        If (s1 & s2 <> "") And s1 = s2 Then
                            ciclo1.Offset(, 14) = "trovato" 'scrivi "trovato" in colonna P
                            ciclo2.Offset(, 14) = "trovato" 'scrivi "trovato" in colonna P
                        End If
                    End If
                Next
            End If
        Next
    
        [A1].Select
        Application.ScreenUpdating = True
        MsgBox "Ho terminato"
    End Sub






  • di Francesco (utente non iscritto) data: 14/10/2012 14:00:47

    No preoccuparti! cercavo solo di capire se sono sulla buona strada x sapermi arrangiare con il vba
    wow anche a me piacerebbe buttare giu un codice funzionante in pochi minuti



  • di Francesco (utente non iscritto) data: 14/10/2012 14:29:52

    ho modificato la riga di codice in calcie (penso che dipenda dal fatto che ho excel 2010 o sbaglio?) e funziona tutto correnttamente

    With Sheets("foglio1")
    ur = .[B1].Cells(Rows.Count, 2).End(xlUp).Row ' trovo ultima riga
    Set tab1 = Range(.Cells(2, 2), .Cells([COUNTA(B:B)] + 1, 2)) 'range colonna b fino ultima riga
    End With

    With Sheets("foglio1")
    ur = .Cells(Rows.Count, 2).End(xlUp).Row ' trovo ultima riga
    Set tab1 = Range(.Cells(2, 2), .Cells(ur, 2)) 'range colonna b fino ultima riga
    End With



  • di Vecchio Frac data: 14/10/2012 14:38:33

    Così era nel tuo foglio originale infatti ^_^ ma a me dava problemi quindi l'avevo modificata come l'hai trovata.
    Adesso possiamo passare ad ottimizzare :P
    E' da verificare se .Find può cercare anche all'interno di un range una stringa concatenata... ti lascio il brivido di pasticciare ^_^ poi ci proverò anch'io naturalmente, e magari stanotte arriva Vanni il Vendicatore e ci batte tutti sul tempo :)





  • di HarryBosch data: 15/10/2012 01:23:03

    Sono arrivato! Ma la riserva di Kryptonite è finita per stanotte ^_^
    Ci penserò domani, anche perché mi sfugge comunque una cosa che mi sembra importante:
    - ok, vuoi trovare le righe con i 3 elementi in comune (data, destinatario e prezzo), ma se capita che ci siano più casi con i 3 elementi uguali?
    Se oltre a quelli, trovo "aria, acqua e fuoco" che si ripetono?
    Non ci sarà più un solo "trovato", ma un "trovato-1", "trovato-2" ecc... ??

    Comunque penso che l'idea di concatenare le stringhe sia veramente ottimale in questo caso.



  • di Vecchio Frac data: 15/10/2012 08:38:20

    Secondo me, per come ha messo la richiesta iniziale, a Francesco basta verificare che solo i tre campi indicati coincidano.





  • di Vecchio Frac data: 15/10/2012 11:28:57

    Un codice un po' più ragionato, e anche più veloce ^_^
    Presuppone che ci sia una riga di intestazione tabella, altrimenti non funziona correttamente.
    Presuppone inoltre che la tabella inizia in una (qualsiasi) cella della colonna B.
     
    Option Explicit
    
    Sub tre_condizioni_vecchiofrac2()
    Dim pr As Long, ur As Long, tab1 As Range
    Dim r As Long, v(1 To 3) As Variant
    
        Sheets("foglio1").[P:P].ClearContents
        
        Application.ScreenUpdating = False
           
        With Sheets("foglio1")
            pr = .[B1].End(xlDown).Row                      'prima riga della tabella (campi di intestazione tabella)
            ur = .Cells(Rows.Count, 2).End(xlUp).Row        'ultima riga
            Set tab1 = Range(.Cells(pr, 2), .Cells(ur, 2))  'range colonna b fino ultima riga compilata (comprende eventuali righe vuote)
        End With
    
        For r = tab1.Rows.Count To 1 Step -1
            v(1) = tab1.Cells(r, 1)  'colonna 1
            v(2) = tab1.Cells(r, 3)  'colonna 3
            v(3) = tab1.Cells(r, 6)  'colonna 6
            
            With tab1
                If WorksheetFunction.CountIf(.Columns(1), v(1)) > 1 And WorksheetFunction.CountIf(.Columns(3), v(2)) > 1 And _
                WorksheetFunction.CountIf(.Columns(6), v(3)) > 1 Then
                    tab1.Rows(r).Cells(, 15) = "trovato"
                End If
            End With
        Next
    
        [A1].Select
        Application.ScreenUpdating = True
        MsgBox "Ho terminato"
    End Sub






  • di Francesco (utente non iscritto) data: 15/10/2012 14:46:35

    Il riusultato che voglio è esattemente quello che si ottiene con "concatena"

    sapere quali rghe contengono tra loro valori uguali in data destinatario e costo



  • di Francesco (utente non iscritto) data: 15/10/2012 14:59:54

    ho provato il codice ma ottengo solo il risultato "ho finito". Non scrive trovato.
    (ricordo che ho excel 2010)

    la prima riga è di intestazione
    la colonna a è occupata da altri valori (ho provato a cancellarli)

    grazie ad Harry per il suo intervento anche se privo di Kryptonite (Superman non reagisce bene alla Kryptonite .... sei meglio di Superman!! ^_^ )




  • di Francesco (utente non iscritto) data: 15/10/2012 15:28:09

    X Frac
    la tua macro funziona solo che non considera seconda riga.

    se io aggiungo una riga tra la seconda (che deve essere segnalata) e la prima funziano correttamente

    ho estrapolato esempio con 2 righe e allegato
    ho modificato leggermente macro preferendo evidenziare di giallo le righe con valori uguali.

    tale macro va a completare il lavoro richiesto qualche settimana fa



  • di Vecchio Frac data: 15/10/2012 21:44:09

    cit. " la tua macro funziona solo che non considera seconda riga. "
    --> Strano, le mie prove hanno dato esito soddisfacente.

    Il codice prima di questo funzionava pure bene, ma era solo troppo complicato dal doppio For :)





  • di Francesco (utente non iscritto) data: 21/10/2012 19:49:18

    Ciao Vecchio Frac
    Ho dato una occhiata all'ultimo codice.
    In sostanza dopo aver identificato il range giusto (dalla prima ultima riga esclusa intestazione) assegni a 3 variabili i valori delle 3 colonne dove andare a fare controllo.
    poi fai ricorso alla funzione conte se.
    usando poi nella condizione il connettivo logico AND se i valori sono maggiori di 1 (quindi ci sono valori uguali) assegni il valore trovato ad una cella definita.
    Mi pare di aver capito correttamente.
    Il problema è excel che mi restituisce "errore run time 1004" -"errore definito dall'oggetto o dall'applicazione" ho provato a metterci le mani ma non ho risolto nulla! idee?



  • di Vecchio Frac data: 21/10/2012 21:52:24

    Il ragionamento che hai svolto è giusto.
    Il confronto parte dall'ultima riga alla prima.
    Le tre variabili in v() contengono i valori della "riga corrente" andando a ritroso. Se ognuno dei tre valori separati è trovato, contemporaneamente, nelle rispettive colonne del range in cui cercare, alla cella corrispondente alla riga attuale ma in colonna P è assegnato il valore "trovato".
    L'errore che riporti è abbastanza strano, e non mi dici su quale riga il codice si ferma :)
    Per favore, controlla come dicevo pochi post fa:
    - che ci sia una riga di intestazione tabella,
    - che la tabella inizi in una (qualsiasi) cella della colonna B.





  • di Francesco (utente non iscritto) data: 22/10/2012 15:44:26

    Ho modificato un pochino il codice (più a istinto che con vera consapevolezza) comunque funziona secondo le mie esigenze.
    ho fatto iniziare il range dalla seconda riga e tolto pr.
    funziona.
    Come mai in realta il riferimento alle colonne è spostato di 1 : la colonna 1 (tab1.Cells(r, 1)) in realtà è la 2 e cosi via?
    cosa significa in dettaglio:
    For r = tab1.Rows.Count To 1 Step -1 ? (intento to 1 step -1)

    ultima domanda vorrei fare una somma algebrica quindi di valori positivi e negativi dei valori corrispondenti a v3. cosi il risultato sostituisce il "trovato".
    secondo logica dovrei "caricare" i valori in una variabile e poi visualizzarne il risultato? - sbalgio?
     
    Sub tre_condizioni_vecchiofrac2()
    Dim pr As Long, ur As Long, tab1 As Range
    Dim r As Long, v(1 To 3) As Variant
    
        Sheets("confronto").[P:P].ClearContents
        
        Application.ScreenUpdating = False
           
        With Sheets("confronto")
                       
            ur = .Cells(Rows.Count, 2).End(xlUp).Row        'ultima riga
            Set tab1 = Range(.Cells(2, 2), .Cells(ur, 2))  'range colonna b fino ultima riga compilata (comprende eventuali righe vuote)
        End With
    
        For r = tab1.Rows.Count To 1 Step -1
            v(1) = tab1.Cells(r, 1)  'colonna 1
            v(2) = tab1.Cells(r, 3)  'colonna 3
            v(3) = tab1.Cells(r, 6)  'colonna 6
            
            With tab1
                If WorksheetFunction.CountIf(.Columns(1), v(1)) > 1 And WorksheetFunction.CountIf(.Columns(3), v(2)) > 1 And _
                WorksheetFunction.CountIf(.Columns(6), v(3)) > 1 Then
                    tab1.Rows(r).Cells(, 15) = "trovato"
                    
                End If
            End With
        Next
    
        [A1].Select
        Application.ScreenUpdating = True
        MsgBox "Ho terminato"
    End Sub



  • di Vecchio Frac data: 22/10/2012 15:59:07

    "pr" (prima riga) era necessario solo per generalizzare la routine e prevedere la possibilità che la tabella non cominciasse nella seconda riga della colonna B, ma in una riga qualsiasi della colonna B. Certo se sei *sicuro* che la tabella comincerà sempre a riga due allora puoi farne a meno... infatti è quello che dici quando scrivi:
    Set tab1 = Range(.Cells(2, 2), .Cells(ur, 2))

    tab1.Cells(r, 1) indica un riferimento relativo: la cella individuata dalla "r" è nella "erresima" riga all'interno della tabella tab1, nella prima colonna della medesima tabella. La riga 1 della tabella potrebbe trovarsi a riga dieci all'interno del foglio; ecco perchè avevo generalizzato usando "pr" all'inizio.

    Infine
    For r = tab1.Rows.Count To 1 Step -1
    inizia un ciclo a ritroso all'interno della tabella, dalla sua ultima riga fino alla prima indietreggiando di un passo (una riga) alla volta. La proprietà Count indica in genere il conteggio di elementi di un insieme: il For eseguirà un loop dal "Count" delle "Rows" di "tab1" fino a 1 decrementando il contatore "r" di uno ad ogni passaggio (arrivato a zero si fermerà e l'esecuzione riprenderà dopo il Next).

    Per la somma finale potrai anche fare a meno di una variabile intermedia sfruttando la cella di desitnazione come variabile temporanea:
    tab1.Rows(r).Cells(, 15) = tab1.Rows(r).Cells(, 15) + v(3)
    Ossia, ad ogni passaggio poni il valore di v(3) nella cella in colonna P (dove prima mettevi "trovato") ricordandoti di sommargli eventuali valori già presenti.
    Quest'ultimo passaggio però non mi suona molto bene... forse dovrei fare delle prove prima di parlare a vanvera ^_^






  • di Vecchio Frac data: 22/10/2012 16:06:34

    Il problema è che se v(3) cambia, le righe non corrispondono al match: dal codice vengono trovate solo le colonne che hanno v(1), v(2) e V(3) uguali, quindi se in v(3) hai valori diversi il confronto fallisce, quindi la somma non viene considerata. Devi sommare il contenuto di una cella diversa.






  • di Francesco (utente non iscritto) data: 22/10/2012 16:50:37

    mi sono spiegato male! la somma fa fatta su valori posti a tot colonne (cella.offset) dei v3 e il valore trovato vorrei visualizzarlo su ogni riga interessata dal match:

    a b c 10 6(valore al posto di trovato)
    a b c -4 6(valore al posto di trovato)



  • di Vecchio Frac data: 22/10/2012 18:47:45

    Bene, questo aggiusta tutto e allora fai come ti ho già indicato ^_^

    tab1.Rows(r).Cells(, 15) = tab1.Rows(r).Cells(, 15) + v(3).Offset(, -1)
    Quanto sopra pone in colonna P il valore che sta all'immediata sinistra della cella che corrisponde a v(3) (quindi come vedi una colonna a sinistra: -1).
    Fai tu gli opportuni aggiustamenti in termini di riferimenti relativi a tale cella.





  • di Francesco (utente non iscritto) data: 22/10/2012 19:26:14

    v(3).Offset(, -1) mi da problemi.
    v(3) soltanto riporta i valori ma appena provo con offset mi di che è necessario oggetto (a sinistra ho altri valori numerici. per non sbalgiare ho cambiato il riferimento -1 ma non c'è verso)



  • di Francesco (utente non iscritto) data: 22/10/2012 21:05:32

    ho risolto cosi esplicitando il valore di v(3) e spostandomi del nel range che mi interessa
    tab1.Rows(r).Cells(, 15) = tab1.Rows(r).Cells(, 15) + tab1.Cells(r, 6).Offset(0, 5)

    però mi riporta i corrispettivi valori e non fa una somma; ottengo

    a b c 10 10(valore al posto di trovato)
    a b c -4 -4(valore al posto di trovato)

    invece di

    a b c 10 6(valore al posto di trovato)
    a b c -4 6(valore al posto di trovato)



  • di Vecchio Frac data: 22/10/2012 21:22:40

    Già, ho supposto erroneamente che v (di tipo Variant) fosse così intelligente da capire che mi riferivo a un range, non è così... andava esplicitato con Set, eventualmente :)
    Invece di v(3) metti tab1.Cells(r, 6) che equivale al riferimento alla cella che abbiamo attribuito a v(3).






  • di Vecchio Frac data: 22/10/2012 21:23:21

    Oh scusa ho visto solo adesso che avevi già trovato l'inghippo, e anche il successivo problema, di cui mi sono accorto immediatamente proprio ora :)





  • di Vecchio Frac data: 22/10/2012 21:25:17

    Volevo farti risparmiare una variabile, ad es. somma, ma temo che sarà necessario introdurla.
    Vedi se riesci a capire come... in pratica il 90% è già fatto ;)





  • di Francesco (utente non iscritto) data: 23/10/2012 16:17:48

    Avevo capito che avevo bisogno di una variabile e ho scritto il codice

    somma = somma + tab1.Rows(r).Cells(, 15) + tab1.Cells(r, 6).Offset(0, 5)
    Cells(1, 10) = somma

    il risultato ottenuto è il voluto (la somma è giusta)

    ma non riesco a inserire il risultato in ogni cella del range. Ottengo sempre la stessa cosa:--- usando tab1.Rows(r).Cells(, 15) = somma
    10 100 (risultato giusto)
    20 90
    30 70
    40 40

    invece di
    10 100
    20 100
    30 100
    40 100
    Ho l'impressione che la soluzione sia dietro angolo e che mi stia perdendo in un bicchiera d'acqua.



  • di Francesco (utente non iscritto) data: 23/10/2012 19:20:39

    mi auto correggo è sufficiente:

    somma = somma + tab1.Cells(r, 6).Offset(0, 5)
    Cells(1, 10) = somma



  • di Francesco (utente non iscritto) data: 24/10/2012 14:27:26

    Vecchio Frac riesci a spiegarmi perchè non riesco ad ottenere questo

    10 100
    20 100
    30 100
    40 100

    ma
    10 100
    20 90
    30 70
    40 40

    due giorni e non ne esco



  • di Vecchio Frac data: 24/10/2012 15:57:34

    Come siamo messi a celle con valori?
    La struttura della tabella è come quella che allego in figura?





  • di Francesco (utente non iscritto) data: 24/10/2012 16:17:11

    ho allegato file con tuo codice modificato che funziana correttamente.

    non voglio in q1 il risultato ma lo voglio riportato in una cella libera sulle righe "trovate"
    Infatti se uso
    tab1.Rows(r).Cells(, 15) = "trovato" il trovato va nel posto giusto
    ma se faccio
    tab1.Rows(r).Cells(, 15) = somma ovvero risultato della somma nella prima riga ottengo la somma :

    10 100 --------- giusto
    20 90 --------- sbagliato voglio 100 cioè risultato somma
    30 70 --------- sbagliato voglio 100 cioè risultato somma
    40 40 --------- sbagliato voglio 100 cioè risultato somma



  • di Vecchio Frac data: 24/10/2012 21:03:17

    Ho giocato un po' sporco ma spero che così funzioni.
    Tutta la Sub diventa come la allego qui sotto: per ottenere il "consolidamento" del dato in ogni cella interessata prima ficco il risultato delle diverse somme in Q1, al termine trasformo la formula nel risultato corrispondente con un apparentemente inutile scambio di contenuti.
    Non sono del tutto sicuro che sia il risultato che volevi.
    Che succede se hai coppie o terne di righe uguali, a gruppi uguali ma diversi tra loro?
     
    Option Explicit
    
    Sub tre_condizioni_vecchiofrac2()
    Dim ur As Long, tab1 As Range
    Dim r As Long, v(1 To 3) As Variant
    Dim somma As Double, casa As Double
    
        Sheets("confronto").[P:P].ClearContents
        
        Application.ScreenUpdating = False
           
        With Sheets("confronto")
                       
            ur = .Cells(Rows.Count, 2).End(xlUp).Row        'ultima riga
            Set tab1 = Range(.Cells(2, 2), .Cells(ur, 2))  'range colonna b fino ultima riga compilata (comprende eventuali righe vuote)
        End With
    
        For r = tab1.Rows.Count To 1 Step -1
            v(1) = tab1.Cells(r, 1)  'colonna 1
            v(2) = tab1.Cells(r, 3)  'colonna 3
            v(3) = tab1.Cells(r, 6)  'colonna 6
            
            With tab1
                If WorksheetFunction.CountIf(.Columns(1), v(1)) > 1 And WorksheetFunction.CountIf(.Columns(3), v(2)) > 1 And _
                WorksheetFunction.CountIf(.Columns(6), v(3)) > 1 Then
                    
                    somma = somma + tab1.Cells(r, 11)
                    [Q1] = somma
                    tab1.Cells(r, 16).Formula = "=Q1"
                End If
            End With
        Next
        
        For r = 2 To ur
            somma = Cells(r, 17)
            If Trim(Cells(r, 17)) <> "" Then Cells(r, 17) = somma
        Next
        
        [A1].Select
        Application.ScreenUpdating = True
        MsgBox "Ho terminato"
    End Sub
    






  • di Francesco (utente non iscritto) data: 24/10/2012 21:35:44

    lo provatò ed in realtà il risultato non è quello che intendevo. e comincio a dubitare che si possa ottenere
    Nel foglio ho coppie o terne e diversi gruppi uguali la differenza sta nel costo e nella data che individua i gruppi in maniera univoca.
    i componenti dei gruppi sono sparsi nel foglio e a seconda dei filtri applicati mi interessava sapere attravero la funzione somma se tale gruppo poteva essere escluso o no da successive verifiche.

    il rusultato è ciò che temevo tutti i gruppi con stesso risultato nella cella predisposta.
    E' già un aiuto averle evidenziate con un colore (mia modifica) o scon la scritta "trovato" (tuo originale) se si ruiscisse a fare la somma eviterei di cercare di continuo i gruppi con filtri ecc e poi fare somme manualmente



  • di Francesco (utente non iscritto) data: 24/10/2012 21:43:39

    nella immagine pubblicata (cosi vedi il risultato del vostro lavoro e le mie modifiche) le celle colorate di giallo sono quelle incriminate e sparse per il foglio (usato il tuo primo codice e modificato per colorare di giallo).
    Fare la Sommatoria della Differenza costo mi serve per vedere se alla fine della fiera in quelle particolori gruppi di righe con data destinatario e costo in comune il risultato è un valore negativo o positivo e di quanto è positivo e negativo.
    (visto le colonne P e Q con frutto di quanto ho imparato da te e Harry ^_^)



  • di Francesco (utente non iscritto) data: 24/10/2012 22:18:30

    Scusa Frac in realtà il riconoscimento non funziona indica celle che non c'entrano.
    quello precedente che ti pubblico funziona bene se non saltasse la riga 2 (la 1 è intestazione ma come detto sono sicuro che partirà tutto dalla seconda).
    Grazie Frac questo è ultimo grande sforzo.
    Buona Notte!

     
    Sub sommapeso()
    Dim ur As Long, tab1 As Range, x As Range
    Dim ciclo1 As Range, ciclo2 As Range, s1 As String, s2 As String
         
        Application.ScreenUpdating = False
               
            With Sheets("confronto")
                ur = .Cells(Rows.Count, 2).End(xlUp).Row ' trovo ultima riga
                Set tab1 = Range(.Cells(2, 2), .Cells(ur, 2)) 'range colonna b fino ultima riga
            End With
       
        'scorri dalla prima riga alla penultima, escludendo l'intestazione della tabella
        For Each ciclo1 In tab1.Offset(1).Resize(tab1.Rows.Count - tab1(1).Row)
            'controlla che non abbiamo già processato la riga
            If ciclo1.Offset(, 14) <> "trovato" Then
                s1 = Trim(ciclo1) & Trim(ciclo1.Offset(, 2)) & Trim(ciclo1.Offset(, 5))
                'scorri dalla cella successiva a quella attiva in ciclo1 fino alla fine della tabella
                For Each ciclo2 In tab1(ciclo1.Row).Resize(tab1.Rows.Count - 1, 1)
                    'controlla che non abbiamo già processato la riga
                    If ciclo2.Offset(, 14) <> "trovato" Then
                        s2 = Trim(ciclo2) & Trim(ciclo2.Offset(, 2)) & Trim(ciclo2.Offset(, 5))
                        If (s1 & s2 <> "") And s1 = s2 Then
                            ciclo1.Offset(, 12).Interior.ColorIndex = 6
                            ciclo2.Offset(, 12).Interior.ColorIndex = 6
                        End If
                    End If
                Next
            End If
        Next
    totali
        Application.ScreenUpdating = True
       End Sub



  • di Vecchio Frac data: 24/10/2012 22:48:00

    Questo è il primo brutto codice che avevo buttato giù :)
    Sei tu che devi avere pazienza, ti faccio fare modifiche che ti portano fuori strada.
    E' il problema della comunicazione a distanza, rischiamo di non capirci (molte volte pure se ho i colleghi viso a viso ho bisogno di diversi incontri per capire le loro esigenze).
    Il problema dell'apparente salto di prima riga è nel Resize iniziale :)
    Proverò domani a guardare meglio, anche se è una giornata di riunioni e non so quando ritagliare il tempo.





  • di Francesco (utente non iscritto) data: 26/10/2012 20:06:18

    Ho corretto (almeno credo) il codice e mi pare che funzioni senza saltare la seconda riga.
    Continuo col tentativo di far fare le "sommatoria" ; posizionare i risultati è facile peccato che il risultato sia del tutto sbagliato! ma non mi arrendo ^_^

    ciclo1.Offset(, 13) = ciclo1.Offset(, 10) + ciclo2.Offset(, 10)
    ciclo2.Offset(, 13) = ciclo1.Offset(, 10) + ciclo2.Offset(, 10)

     
    Sub sommapeso()
    Dim ur As Long, tab1 As Range, x As Range
    Dim ciclo1 As Range, ciclo2 As Range, s1 As String, s2 As String
         
        Application.ScreenUpdating = False
               
            With Sheets("confronto")
                ur = .Cells(Rows.Count, 2).End(xlUp).Row ' trovo ultima riga
                Set tab1 = Range(.Cells(2, 2), .Cells(ur, 2)) 'range colonna b fino ultima riga
            End With
            
               For Each ciclo1 In tab1
            'controlla che non abbiamo già processato la riga
            If ciclo1.Offset(, 14) <> "trovato" Then
                s1 = Trim(ciclo1) & Trim(ciclo1.Offset(, 2)) & Trim(ciclo1.Offset(, 5))
                'scorri dalla cella successiva a quella attiva in ciclo1 fino alla fine della tabella
                For Each ciclo2 In tab1(ciclo1.Row).Resize(tab1.Rows.Count - 1, 1)
                    'controlla che non abbiamo già processato la riga
                    If ciclo2.Offset(, 14) <> "trovato" Then
                        s2 = Trim(ciclo2) & Trim(ciclo2.Offset(, 2)) & Trim(ciclo2.Offset(, 5))
                        If (s1 & s2 <> "") And s1 = s2 Then
                            ciclo1.Offset(, 12).Interior.ColorIndex = 6
                            ciclo2.Offset(, 12).Interior.ColorIndex = 6
                                                
                                                End If
                    End If
                Next
            End If
        Next
    totali
        Application.ScreenUpdating = True
       End Sub