Ricerca dati in matrice



  • Ricerca dati in matrice
    di rangers84 data: 07/02/2015 16:02:13

    Ringrazio anticipatamente chiunque possa darmi una mano a risolvere il problema in oggetto.
    Nel foglio1 colonna A ho una numerazione progressiva da 1 a x , dalla colonna b alla colonna f per ogni rigo ho i 5 numeri di interesse :
    A B C D E F
    1 24 34 54 65 45
    2 54 55 68 90 12
    3 24 65 78 54 42

    - attraverso vba come faccio a contare per ogni riga quante triple si ripetono? ( nell'esempio semplice sia nella riga 1 che nella riga 3 sono presenti 24,54 e 65 )
    - oltre a contarli avrei la necessità di prendere questa tripla che si ripete e riportarla in una qualsiasi altro foglio da creare e scrivere :

    A B C D
    1 24 54 65
    3 24 54 65



  • di Vecchio Frac data: 07/02/2015 17:25:23

    @rangers84
    Cioè vuoi recuperare le triplette di numeri ripetute, in base alle diverse possibili combinazioni di esse, e qualunque sia l'ordine in cui compaiono le cifre all'interno della singola tripla, per cui "24 54 65" equivale a "65 24 54".
    Giusto?
    E di quante righe stiamo parlando? La velocità di elaborazione ed esecuzione è influenzata anche da questa informazione.





  • di rangers84 data: 08/02/2015 03:03:22

    Esattamente come hai descritto. Tutte le triplette in qualsiasi combinazione per ogni riga. Le righe sono 150!!! Aiutatemi a tirare giù una bozza di codice!!!! Grazie mille



  • di Vecchio Frac data: 08/02/2015 09:15:23

    Hai già scritto qualcosa per cominciare? dove ti sei arenato?
    E per trovare la procedura di soluzione, prova a stendere in italiano una serie di passaggi sequenziali come se dovessi fare l'operazione con carta e penna. Questa è la strada migliore per descrivere il problema e arrivare al risultato. Tradurre poi il presudocodice in linguaggio VBA sarà più semplice.





  • di rangers84 data: 08/02/2015 12:32:45

    Ho già costruito un database che gestisce le estrazioni del lotto e più precisamente le ripetizioni. Per gli ambi ho adottato un metodo alternativo alla "conta delle ripetizioni nelle matrici" in quanto dopo aver preso tutte le estrazioni di una ruota di un anno riporto in una seconda tabella tutte le coppie di ambi che si formano. Questa seconda tabella è formata dalla parte verticale e orizzontale da numeri 1 a 90, come nella battaglia navale. Quindi al contare della coppia es 10-20 , nella posizione di interesse il codice posiziona il valore 1, al ripetersi di questa coppia il valore sale a 2. Ora il codice da me scritto non fa altro che contare quali coppie si ripetono + di 3 volte e riportarle in un nuovo foglio con la relativa estrazione di riferimento. Con gli ambi quindi il "problema" è di più facile risoluzione perchè ho già questa seconda tabella di riferimento, mentre con i terni non posso creare nessuna tabella in quanto le combinazioni di terni ( 1-2-3 , 1-2-4 ecc... ) sono troppissime. Ecco perchè mi serve un codice che mi calcoli le ripetizioni nella matrice che si forma con tutte le estrazioni.

    Foglio1
    Estrazione 1estratto 2 estratto 3 estratto 4 estratto 5 estratto
    1 10 11 12 13 14
    2 1 2 3 4 5
    3 10 13 14 5 6

    Foglio 2
    Estrazione 1estratto 2 estratto 3 estratto
    1 10 13 14
    3 10 13 14

    nel caso in cui sei interessato al file e per aiutarmi vuoi visionarlo, possiamo anche decidere di sentirci tramite skype o qualsiasi altro servizio. Sicuramente a voce è tutto più semplice.



  • di Vecchio Frac data: 08/02/2015 15:42:44

    Stavo cercando una soluzione efficiente al problema che hai esposto.
    Pensavo che avessi già un algoritmo di massima ma prima provo a creare quello che ho pensato io.





  • di rangers84 data: 08/02/2015 16:00:40

    Grazie mille... Attendo tue notizie!



  • di Vecchio Frac data: 08/02/2015 20:15:41

    L'argomento mi ha impegnato abbastanza... alla fine ho optato per una soluzione di forza bruta, ma sicuramente c'è sia il modo di ottimizzare che di approcciare in modo diverso.
    Ho fatto alcuni test e tutti hanno dato risultato soddisfacente.
    Prova anche tu (il test è stato fatto su un range di dati da A1 a F6, con A1 riga di intestazione: nel codice va ovviamente messo il range corretto).
    Il risultato grezzo è stampato in colonna H ma si può piazzare dove si vuole e nel formato che si vuole, non avrai difficoltà a identificare il codice che se ne occupa.
    La routine di sort l'ho messa perchè nel tuo esempio volevi i numeri riordinati, ma l'ho commentata per test in esecuzione, quindi se vuoi i dati riordinati devi togliere gli apici che commentano l'istruzione di bubble_sort.

    Allego anche il file su cui mi sono basato per le prove.
     
    Option Explicit
    
    Sub find_triplets()
    Dim my_range As Range, single_row As Range, single_cell As Range
    Dim triplets(10) As String, i As Integer, c As Range
    Dim found_at As String, relative_row As Integer, j As Integer, s As String
    Dim v As Variant, s1 As String, s2 As String, next_row As Range, t As Integer
    
        Set my_range = Range("A2:F6")
        Range("H:H").ClearContents
        
        
            For Each single_row In my_range.Rows.Resize(my_range.Rows.Count - 1)    'esclude l'ultima riga del range iniziale
            
                triplets(1) = Format(single_row.Cells(2), "00") & ";" & Format(single_row.Cells(3), "00") & ";" & Format(single_row.Cells(4), "00")
                triplets(2) = Format(single_row.Cells(2), "00") & ";" & Format(single_row.Cells(3), "00") & ";" & Format(single_row.Cells(5), "00")
                triplets(3) = Format(single_row.Cells(2), "00") & ";" & Format(single_row.Cells(3), "00") & ";" & Format(single_row.Cells(6), "00")
                triplets(4) = Format(single_row.Cells(2), "00") & ";" & Format(single_row.Cells(4), "00") & ";" & Format(single_row.Cells(5), "00")
                triplets(5) = Format(single_row.Cells(2), "00") & ";" & Format(single_row.Cells(4), "00") & ";" & Format(single_row.Cells(6), "00")
                triplets(6) = Format(single_row.Cells(2), "00") & ";" & Format(single_row.Cells(5), "00") & ";" & Format(single_row.Cells(6), "00")
                triplets(7) = Format(single_row.Cells(3), "00") & ";" & Format(single_row.Cells(4), "00") & ";" & Format(single_row.Cells(5), "00")
                triplets(8) = Format(single_row.Cells(3), "00") & ";" & Format(single_row.Cells(4), "00") & ";" & Format(single_row.Cells(6), "00")
                triplets(9) = Format(single_row.Cells(3), "00") & ";" & Format(single_row.Cells(5), "00") & ";" & Format(single_row.Cells(6), "00")
                triplets(10) = Format(single_row.Cells(4), "00") & ";" & Format(single_row.Cells(5), "00") & ";" & Format(single_row.Cells(6), "00")
        
                i = single_row.Row - 1
                For Each next_row In my_range.Offset(i, 1).Resize(my_range.Rows.Count - i, my_range.Columns.Count - 1).Rows
                    For t = 1 To 10
                        v = Split(triplets(t), ";")
                        'v = bubble_sort(v)     '<<< togliere il commento per avere l'elenco ordinato da piccolo a grande
                        s1 = Join(v, ";")
                        
                        s2 = flatten(next_row)
                        v = Split(s2, ";")
                        'v = bubble_sort(v)     '<<< togliere il commento per avere l'elenco ordinato da piccolo a grande
                        s2 = Join(v, ";")
                        
                        v = Split(s1, ";")
                        If InStr(s2, Format(v(0), "00")) > 0 And InStr(s2, Format(v(1), "00")) > 0 And InStr(s2, Format(v(2), "00")) > 0 Then
                            j = j + 1
                            Cells(j, "H") = "riga " & i & " - " & next_row.Row - 1 & ": " & s1
                        End If
                    Next t
                    
                Next next_row
                
            Next single_row
            
    End Sub
    
    Private Function flatten(r As Range) As String
    Dim vector(1 To 5) As String, i As Integer
        For i = 1 To 5
            vector(i) = r.Cells(i)
        Next
        flatten = Join(vector, ";")
    End Function
    
    
    Private Function bubble_sort(vector As Variant) As Variant
    Dim cnt1 As Long, cnt2 As Long, tmp As Long
       
       For cnt1 = UBound(vector) To LBound(vector) Step -1
          For cnt2 = LBound(vector) + 1 To cnt1
          If vector(cnt2 - 1) > vector(cnt2) Then
             tmp = vector(cnt2 - 1)
             vector(cnt2 - 1) = vector(cnt2)
             vector(cnt2) = tmp
          End If
          Next
       Next
       
       bubble_sort = vector
    End Function
    






  • di scossa data: 08/02/2015 22:45:23

    cit. rangers84: "nel caso in cui sei interessato al file e per aiutarmi vuoi visionarlo, possiamo anche decidere di sentirci tramite skype o qualsiasi altro servizio"

    A dire il vero questa frase mi ha infastidito: lo spirito del forum è la condivisione; chi ti aiuta condivide il suo sapere, ma tu non condividi il tuo (non metti a disposizione il tuo file agli altri) ....

    Comunque, giusto per rispetto a Vecchio Frac, propongo una soluzione diversa, che utilizza le RegExp.
    Non avendo il file con un numero sufficiente di estrazioni, non ho fatto alcun test di velocità/efficienza del codice.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub CheckTripleRE()
      'by scossa
      
      Dim rng As Range
      Dim rRow As Range
      Dim rRowUT As Range
      Dim aRowUT As Variant
      Dim aStrRowUT As Variant
      Dim j As Long
      Dim k As Long
      Dim nRows As Long
      Dim i As Long
      Dim oRE As Object 'RegExp
      Dim oMatch As Object 'MatchCollection
      Dim sPatt As String
      Dim sPattPre As String
      Dim vItem As Variant
      Dim sTrip As String
      
      Application.ScreenUpdating = False
      
      Set oRE = CreateObject("vbscript.regexp") 'New RegExp '
      Set rng = Foglio1.Range("B2:F6")
      nRows = rng.Rows.Count
      ReDim aStrRowUT(2 To nRows)
      
      With oRE
        .Global = True
        .IgnoreCase = True
      End With
      Foglio1.Range("H2:H1000").ClearContents
      i = 1
      For k = 1 To nRows - 1
        sPatt = Join(Application.Transpose(Application.Transpose(rng.Rows(k).Cells)), "|")
        oRE.Pattern = sPatt
        For j = k + 1 To nRows
        
          Set rRowUT = rng.Rows(j).Cells
          aRowUT = Application.Transpose(Application.Transpose(rRowUT.Value))
          aStrRowUT(j) = "#" & Join(aRowUT, "#") & "#"
    
          If oRE.Test(aStrRowUT(j)) Then
            Set oMatch = oRE.Execute(aStrRowUT(j))
            If oMatch.Count > 2 Then
              For Each vItem In oMatch
                sTrip = sTrip & vItem & "; "
              Next
              Debug.Print "tripletta " & sTrip & " presente in riga " & j
              If sPattPre <> sPatt Then
                i = i + 1
                Foglio1.Cells(i, 8).Value = "etrazione " & k & " (" & Replace(sPatt, "|", "; ") & ")"
                sPattPre = sPatt
                i = i + 1
              End If
              Foglio1.Cells(i, 8).Value = "tripletta " & sTrip & " presente in riga " & j
              i = i + 1
            End If
          End If
          sTrip = ""
        Next j
      Next k
      
      Application.ScreenUpdating = True
      
      Set oRE = Nothing
      Set oMatch = Nothing
      Set rRow = Nothing
      Set rRowUT = Nothing
      Set rng = Nothing
      
    End Sub
    



  • di scossa data: 08/02/2015 22:58:20

    cit. scossa: "... una soluzione diversa, che utilizza le RegExp"

    N.B.: dimenticavo di precisare che il codice proposto trova già anche le quartine e cinquine, senza alcun aggravio di lavoro e quindi senza decadimento delle prestzioni.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di rangers84 data: 08/02/2015 23:10:43

    iniziamo a stare sulla buona strada, però ci sarebbero da fare dei miglioramenti:

    - se le triplette che si ripetono sono più di 2 non le riporta;
    - se i numeri sono da 1 a 9 non li considera ;
    - quando riporta i numeri, li scrive tutti dentro una cella, invece a me servirebbe che nella prima cella riportasse il numero di estrazione,nella seconda-terza-quarta i tre numeri.

    Ti allego il mio file per farti vedere meglio su cosa sto lavorando, ovviamente non ti spaventare della follia di ciò che sto cercando di fare. nè tanto meno della mia pochezza di scrivere in vba :)... in ogni foglio delle ruote riporto l'ultima estrazione ( momentaneamente ancora a mano ), nel primo foglio AMBI ho posizionato un pulsante che fa partire le sub di ogni ruota che troverai separate in 10 moduli le quali hanno la funzione di riportare prima in ordine crescente i numeri usciti ( completano la tabella vicino all'estrazione ) e poi ho creato una seconda tabella dove il codice posiziona il contatore degli ambi ripetuti ( il tutto diviso per anni, quindi i cicli nei codici sono riferiti all'anno 2015 ). Poi ancora manualmente faccio partire la sub AMBI ( modulo 11 ) la quale, in base alle posizioni date nel for mi esamina l'anno richiesto contando tutti gli ambi che si ripetono x o più volte ( sempre da decidere nel for ). Faccio partire poi la sub PULIZIA (modulo 11) la quale mi ripete gli ambi inversi ( 1-11 e 11-1, elimina la seconda ripetizione ), poi la sub elimina_righe ( per eliminare gli spazi lasciati vuoti dagli ambi eliminati ),infine la sub numerazione ( modulo 11 ) che mi numera le ripetizioni degli ambi ( 1-11 1° volta , 1-11 2° volta ecc... ). ancora non metto un pulsante per il modulo 11 ... pigrizia! Queste osservazioni portano a delle vincite.... e mi farebbe farti partecipe già solo per il tempo che hai dedicato alla lettura! Vediamo se si riesce a fare qualcosa di simile anche per i terni. GRAZIE



  • di rangers84 data: 08/02/2015 23:21:08

    Scossa... grazie dell'aiuto ma non c'è bisogno di infastidirsi o di pensare subito male! sono disponibilissimo a condividere tutto quello che ho e magari anche a farvi vincere. Non c'è bisogno di trasformare un'ipotesi negativa in realtà! ho scritto quella frase solo per facilitare le cose!



  • di scossa data: 09/02/2015 08:55:29

    @rangers84: ok, l'importante è essersi chiariti.

    cit.: ".... se le triplette che si ripetono sono più di 2 non le riporta"

    Ma il mio codice l'hai provato?
    Perché a me le trova tutte, inoltre trova anche le quartine e le cinquine.
    Per limitare alle terzine basta modificare l'istruzione
    If oMatch.Count > 2 Then
    in
    If oMatch.Count = 3 Then



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 09/02/2015 10:29:12

    cit. scossa: "A dire il vero questa frase mi ha infastidito"
    ---> Non mi ero accorto della frase che probabilmente ho scartato inconsciamente per concentrarmi sul problema :)
    Adesso mi guardo il lavoro di scossa, sicuramente più interessante.






  • di rangers84 data: 09/02/2015 14:24:16

    ho provato ora il tuo codice "scossa" , ma... sicuramente sarò io il problema. Nel foglio 1 in b2:f6 metto le estrazioni per il test, faccio partire il codice e non esce nulla. Dove sbaglio ?

    Grazie



  • di scossa data: 09/02/2015 14:40:40

    Non saprei, io l'ho provato col file di Vecchio Frac.
    Comunque ti allego il mio file di test (Triplette_RE.xlsm)

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 09/02/2015 15:01:51

    In colonna H vengono mostrate le triplette trovate. In aggiunta scossa ha inserito un resoconto anche in finestra immediata con debug.print. Tuttavia anche a me il codice di scossa non funziona bene in caso i numeri da cercare siano inferiori a 10.
    Anche il mio codice ha problemi in questo senso e la correzione che propongo per ovviare all'inconveniente nel mio codice è la seguente.
     
    'siamo nel ciclo for each next_row...: tra s2 = flatten(next_row) e v = Split(s1, ";") va messo il codice seguente che sostituisce il precedente:
    ...
                        v = Split(s2, ";")
                        For z = 0 To UBound(v)
                            v(z) = Format(v(z), "00")
                        Next
                        v = bubble_sort(v)     '<<< togliere il commento per avere l'elenco ordinato da piccolo a grande
                        s2 = Join(v, ";")
    ...






  • di Vecchio Frac data: 09/02/2015 15:03:02

    Comunque il codice di scossa è proprio interessante, suggerisco di esaminarlo bene per capirlo.
    Sarà che io negli ultimi tempi avevo la fissa delle regexp ;)





  • di scossa data: 09/02/2015 15:38:57

    cit. V.F.: "Tuttavia anche a me il codice di scossa non funziona bene in caso i numeri da cercare siano inferiori a 10"

    Vero, la versione modificata sottoriportta dovrebbe rispovere il problema.



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub CheckTripleRE()
      'by scossa
      
      Dim rng As Range
      Dim rRow As Range
      Dim rRowUT As Range
      Dim aRowUT As Variant
      Dim aStrRowUT As Variant
      Dim j As Long
      Dim k As Long
      Dim nRows As Long
      Dim i As Long
      Dim oRE As Object 'RegExp
      Dim oMatch As Object 'MatchCollection
      Dim sPatt As String
      Dim sPattPre As String
      Dim vItem As Variant
      Dim sTrip As String
      
      Application.ScreenUpdating = False
      
      Set oRE = CreateObject("vbscript.regexp") 'New RegExp '
      Set rng = Foglio1.Range("B2:F6")
      nRows = rng.Rows.Count
      ReDim aStrRowUT(2 To nRows)
      
      With oRE
        .Global = True
        .IgnoreCase = True
      End With
      Foglio1.Range("H2:H1000").ClearContents
      i = 1
      For k = 1 To nRows - 1
        sPatt = "#" & Join(Application.Transpose(Application.Transpose(rng.Rows(k).Cells)), "#|#") & "#"
        oRE.Pattern = sPatt
        For j = k + 1 To nRows
        
          Set rRowUT = rng.Rows(j).Cells
          aRowUT = Application.Transpose(Application.Transpose(rRowUT.Value))
          aStrRowUT(j) = "#" & Join(aRowUT, "##") & "#"
    
          If oRE.Test(aStrRowUT(j)) Then
            Set oMatch = oRE.Execute(aStrRowUT(j))
            If oMatch.Count > 2 Then
              For Each vItem In oMatch
                sTrip = sTrip & Replace(vItem, "#", "") & "; "
              Next
              If sPattPre <> sPatt Then
                i = i + 1
                Foglio1.Cells(i, 8).Value = "etrazione " & k & " (" & Replace(Replace(sPatt, "#", ""), "|", "; ") & ")"
                sPattPre = sPatt
                i = i + 1
              End If
              Foglio1.Cells(i, 8).Value = "tripletta " & sTrip & " presente in riga " & j
              i = i + 1
            End If
          End If
          sTrip = ""
        Next j
      Next k
      
      Application.ScreenUpdating = True
      
      Set oRE = Nothing
      Set oMatch = Nothing
      Set rRow = Nothing
      Set rRowUT = Nothing
      Set rng = Nothing
      
    End Sub
    



  • di scossa data: 09/02/2015 15:42:05

    P.S.: ho aggiornato il file allegato (Triplette_RE.xlsm) con la correzione.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di rangers84 data: 09/02/2015 15:54:45

    Scossa... il codice da elaborato è sicuramente superlativo ed io con le mie poche nozioni di vba impiegherei il triplo del tempo per modificarlo. Purtroppo presenta i seguenti problemi:

    - Ho inserito i numeri 1 2 3 4 5 - 6 7 9 10 11 ecc e riconosce 1 e 11 e 1 e 12 ecc come numeri uguali credo.

    - Quando trova le triplette ripetute le scrive sempre nella colonna H, invece per calcolare le distanze sarebbe molto più utile avere le ripetizioni così : h1, numero estrazione , i1:k1 la tripletta ripetuta.

    Grazie veramente per il tempo dedicato!



  • di rangers84 data: 09/02/2015 15:58:18

    Scossa... scusami, nel frattempo che scrivevo non mi sono accorto della tua correzione. Ora rimane solo da vedere quali triplette si ripetono in celle diverse, come descritto nella risposta precedente! Grazie veramente ancora e ancora .. :)



  • di rangers84 data: 09/02/2015 16:08:09

    facilmente sposto il valore della riga di ripetizione... ma i numeri " sTrip" che sono una stringa intera, come faccio a dividerli ed assegnarli una cella? :)
     
    Foglio1.Cells(i, 8).Value = "tripletta " & sTrip
    Foglio1.Cells(i, 9).Value = j



  • di scossa data: 09/02/2015 16:14:20

    Vedi se la modifica sottoriportata ti va bene (file Triplette_RE_v1b.xlsm).



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)


     
    Sub CheckTripleRE_v1b()
      'by scossa
      
      Dim rng As Range
      Dim rRow As Range
      Dim rRowUT As Range
      Dim aRowUT As Variant
      Dim aStrRowUT As Variant
      Dim j As Long
      Dim k As Long
      Dim nRows As Long
      Dim i As Long
      Dim oRE As Object 'RegExp
      Dim oMatch As Object 'MatchCollection
      Dim sPatt As String
      Dim sPattPre As String
      Dim vItem As Variant
      Dim sTrip As String
      
      Application.ScreenUpdating = False
      
      Set oRE = CreateObject("vbscript.regexp") 'New RegExp '
      Set rng = Foglio1.Range("B2:F6")
      nRows = rng.Rows.Count
      ReDim aStrRowUT(2 To nRows)
      
      With oRE
        .Global = True
        .IgnoreCase = True
      End With
      Foglio1.Range("H2:K1000").ClearContents
      i = 1
      For k = 1 To nRows - 1
        sPatt = "#" & Join(Application.Transpose(Application.Transpose(rng.Rows(k).Cells)), "#|#") & "#"
        oRE.Pattern = sPatt
        For j = k + 1 To nRows
        
          Set rRowUT = rng.Rows(j).Cells
          aRowUT = Application.Transpose(Application.Transpose(rRowUT.Value))
          aStrRowUT(j) = "#" & Join(aRowUT, "##") & "#"
    
          If oRE.Test(aStrRowUT(j)) Then
            Set oMatch = oRE.Execute(aStrRowUT(j))
            If oMatch.Count = 3 Then
              For Each vItem In oMatch
                sTrip = sTrip & Replace(vItem, "#", "") & "; "
              Next
              If sPattPre <> sPatt Then
                i = i + 1
                Foglio1.Cells(i, 8).Value = "etrazione " & k & " (" & Replace(Replace(sPatt, "#", ""), "|", "; ") & ")"
                sPattPre = sPatt
                i = i + 1
              End If
              Foglio1.Cells(i, 8).Value = "tripletta " & sTrip & " presente in riga " & j
              Foglio1.Cells(i, 9).Value = Split(sTrip, "; ")(0)
              Foglio1.Cells(i, 10).Value = Split(sTrip, "; ")(1)
              Foglio1.Cells(i, 11).Value = Split(sTrip, "; ")(2)
              i = i + 1
            End If
          End If
          sTrip = ""
        Next j
      Next k
      
      Application.ScreenUpdating = True
      
      Set oRE = Nothing
      Set oMatch = Nothing
      Set rRow = Nothing
      Set rRowUT = Nothing
      Set rng = Nothing
      
    End Sub
    
    
    



  • di Vecchio Frac data: 09/02/2015 17:37:33

    cit. "ma i numeri " sTrip" che sono una stringa intera, come faccio a dividerli ed assegnarli una cella? :) "
    ---> scossa ha già risposto. L'istruzione che ti serve è Split(stringa, delimitatore) la quale suddivide una stringa in più sottostringhe in corrispondenza del delimitatore specificata e restituisce una matrice di stringhe a partire dall'indice zero.
    Se stringa = "uno-due-tre-quattro", l'istruzione v = split(stringa, "-") restituisce un array v che contiene gli elementi di stringa da zero in poi che erano separati dal trattino:
    v(0) = "uno"
    v(1) = "due"
    v(2) = "tre"
    v(3) = "quattro"






  • di rangers84 data: 10/02/2015 23:46:18

    sto testando l'ultimo codice di scossa . scusatemi per l'assenza in questi 2 gg ma sono un lavoratore / studente / giocatore e il tempo scarseggia. Domani cercherò di essere ancor più preciso con delle richiesti sul codice. Grazie veramente



  • di Vecchio Frac data: 11/02/2015 11:05:57

    Prenditi il tempo che ti serve.
    Noi siamo comunque qua :)





  • di rangers84 (utente non iscritto) data: 17/02/2015 15:12:48

    Scusate di nuovo per l'assenza prolungata ma ho avuto seri problemi. Cmq tornando all'ultima modifica apportata da scossa devo fare delle precisazioni sul codice creato applicato poi nello specifico al lotto.

    - la prima riga che riempe deve essere comprensiva solo della tripletta che si ripete e non della riga di appartenenza ( ciò aiuta a calcolare le distanze in maniera più efficace )
    - se avviene più di una ripetizione il codice non fa il controllo di cosa si è ripetuto prima, es: 1,2,3,4,5 - 1,2,3,4,5 - 1,2,3,4,5 il codice conta che nella prima riga sono presente le ripetizioni sottostanti, nella seconda riga conta le ripetizioni sottostanti come piramide rovesciata. Servirebbe invece che se nella prima riga c'è una ripetizione che si verifica nella seconda nella terza ecc , poi quando il controllo passa alla seconda non deve riniziare il conteggio dalla seconda in giù.

    Sicuramente non sono stato chiaro.... :)

    Scusate di nuovo e veramente grazie mille per il lavoro svolto!



  • di scossa data: 18/02/2015 11:39:46

    scusami la franchezza, ma il codice è abbastanza comprensibile, soprattutto non è difficile individuare l'istruzione che scrive "la riga di appartenenza". Quindi perché non ci metti del tuo e provi a modificare il codice?

    Non sono il moderatore per cui esprimo solo la mia opinione personale, ma la "ragione d'essere" del forum mi sembra sia quella di aiutare e far crescere gli "utenti", non quella di proporre soluzioni "chiavi in mano".


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di Vecchio Frac data: 18/02/2015 13:33:34

    cit. " non quella di proporre soluzioni "chiavi in mano". "
    ---> Sono d'accordo.