Exc3el vba: sequenza di stringhe in un range

Anonimo
2016-08-25T15:38:31+00:00

Ciao a tutti

ho una collection di n elementi, supponiamo 3  (a b a) e vorrei trovare in una colonna quante volte è ripetuta tale sequenza.

Es. la colonna contiene:

b

c

a

b

a (*)

b

a

d

f

a

b

a

il risultato dovrebbe essere 3 ripetizioni della sequenza.

Ho difficoltà nell'impostare il codice in modo particolare perché, come nell'esempio, una volta trovata una corrispondenza, devo ripartire dall'ultima riga analizzata (*) per analizzare se la lettera fa parte della sequenza successiva.

Grazie e saluti

domenico

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
2016-08-26T12:07:07+00:00

Ciao Domenico,

probabilmente mi sono espresso male.

No, non era una mancanza di chiarezza da parte tua! Non avendo visto la tua risposta, stavo invece rispondendo al mio proprio suggerimento di estendere la funzionalità della mia funzione!

La mia necessità è ricavare i numeri di riga del range in cui si trovano le sequenze.

Quindi tornando all'esempio , se il range da analizzare è A1:A12 e la sequenza da cercare è: a b a,

mi servirebbe conoscere che le righe:

3-4-5

5-6-7

10-11-12

quindi conoscere che le righe: 3-4-5-6-7-10-11-12 contengono la sequenza. Questo perché devo evidenziare le righe del range.

Si potrebbe sfruttare un adattamento della mia funzione. A titolo di esempio, prova qualcosa del genere:

'=========>>

Option Explicit

'--------->>

Public Sub DemoEvidenziareRighe()

    Dim WB As Workbook

    Dim SH As Worksheet

    Dim Rng As Range, rCell As Range

    Dim mArrMulti As Variant, arrRighe As Variant

    Dim i As Long, j As Long

    Const sPrimaCella As String = "D4"                        '<<=== Modifica

    Const sSeq As String = "a b a"                                '<<=== Modifica

    Const iNumColDaEvidenziare As Long = 5            '<<=== Modifica

    Set WB = ThisWorkbook

    Set SH = WB.Sheets("Foglio1")

    With SH

        Set rCell = .Range(sPrimaCella)

        Set Rng = .Range(rCell, rCell.End(xlDown))

    End With

    mArrMulti = Split(sSeq, " ")

    arrRighe = RigheSeqDodo(Rng, sSeq)

    For j = 1 To UBound(arrRighe)

        Rng.Cells(arrRighe(j)).Resize(3, iNumColDaEvidenziare).Interior.ColorIndex = 6

    Next j

End Sub

'--------->>

Public Function RigheSeqDodo(rIntervallo As Range, _

                                  sSequenza As String, _

                                  Optional sSeparatore As String = " ") _

                                  As Variant

    Dim arrIn As Variant, arrSeq As Variant, arrOut() As Variant

    Dim i As Long, j As Long, k As Long

    Dim iCtr As Long

    Dim bMatch As Boolean

    arrIn = rIntervallo.Value

    arrSeq = Split(sSequenza, sSeparatore)

    If UBound(arrSeq) = 0 Then

        Exit Function

    End If

    For i = 1 To UBound(arrIn) - UBound(arrSeq)

        For j = LBound(arrSeq) To UBound(arrSeq)

            bMatch = UCase(arrIn(i + j, 1)) = UCase(arrSeq(j))

            If Not bMatch Then Exit For

        Next j

        If bMatch Then

            iCtr = iCtr + 1

            ReDim Preserve arrOut(1 To iCtr)

            arrOut(iCtr) = i

        End If

    Next i

    RigheSeqDodo = arrOut

End Function

'<<=========

Esequendo il codice, ottengo qualcosa del genere:

Potresti scaricare il mio file di prova Dodo#2_20160826.xlsm a:

https://www.dropbox.com/s/nbawrkzfayh3512/Dodo%232_20160826.xlsm?dl=0

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

8 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-08-26T09:46:08+00:00

    Ciao Norman

    la routine l'ho adattata alle mie esigenze  in questo modo:

    Nota: mArrMulti contiene la sequenza cercata

       ...............

       ..............

        For r = Da To a

            uR = Cells(r, 5).End(xlDown).Row

            arrIn = mTe.Range(Cells(r, 5), Cells(uR, 5))

            For i = 1 To UBound(arrIn) - UBound(mArrMulti)

                For j = LBound(mArrMulti) To UBound(mArrMulti)

                    bMatch = UCase(arrIn(i + j, 1)) = UCase(mArrMulti(j))

                    If Not bMatch Then Exit For

                Next j

                If bMatch Then

       ..............

       ..............

    e va tutto bene,

    ma ho un'ulteriore necessità e ti chiedo scusa per non averlo detto prima:

    come faccio ad individuare le n righe del range nelle quali è presente la sequenza?

    Nell'esempio di sopra le sequenze sono nelle righe: 3-4-5 , 5-6-7 e 10-11-12

    grazie

    domenico

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-08-26T08:21:24+00:00

    Ciao Domenico,

    come sempre riesci a trovare soluzioni brevi ed efficaci.

    Integrerò la mia macro con le tue indicazioni.

    Ho pensato che il requisito fosse quello di prendere in considerazione un oggetto Range. Se, tuttavia, la funzione verrà utilizzata in VBA, e se una matrice piuttosto che un range fosse di interesse, potrei modificare il codice della funzione per operare sia con un input sia di un range che una matrice.

    Altrimenti, per chiudere questo thread, vorrei chiederti gentilmente di segnare la mia risposta come Risposta. In questo modo, tu aiuterai anche coloro che potessero cercare soluzioni ai problemi simili negli archivi della Community.

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-08-26T06:55:27+00:00

    Ciao Norman

    come sempre riesci a trovare soluzioni brevi ed efficaci.

    Integrerò la mia macro con le tue indicazioni.

    cari saluti

    domenico

    La risposta è stata utile?

    0 commenti Nessun commento
  4. Anonimo
    2016-08-25T17:14:46+00:00

    Ciao Domenco,

    ho una collection di n elementi, supponiamo 3  (a b a) e vorrei trovare in una colonna quante volte è ripetuta tale sequenza.

    Es. la colonna contiene:

    b

    c

    a

    b

    a (*)

    b

    a

    d

    f

    a

    b

    a

    il risultato dovrebbe essere 3 ripetizioni della sequenza.

    Ho difficoltà nell'impostare il codice in modo particolare perché, come nell'esempio, una volta trovata una corrispondenza, devo ripartire dall'ultima riga analizzata (*) per analizzare se la lettera fa parte della sequenza successiva.

    Prova la seguente UDF (funzione utente):                                        

    '=========>>

    Option Explicit

    '--------->>

    Public Function SeqDodo(rIntervallo As Range, _

                            sSequenza As String, _

                            Optional sSeparatore As String = " ") _

                            As Variant

        Dim arrIn As Variant, arrSeq As Variant

        Dim i As Long, j As Long

        Dim iCtr As Long

        Dim bMatch As Boolean

        SeqDodo = CVErr(xlErrNA)

        arrIn = rIntervallo.Value

        arrSeq = Split(sSequenza, sSeparatore)

        If UBound(arrSeq) = 0 Then

            Exit Function

        End If

        For i = 1 To UBound(arrIn) - UBound(arrSeq)

            For j = LBound(arrSeq) To UBound(arrSeq)

                bMatch = arrIn(i + j, 1) = arrSeq(j)

                If Not bMatch Then Exit For

            Next j

            If bMatch Then

                iCtr = iCtr + 1

            End If

        Next i

        SeqDodo = iCtr

    End Function

    '<<=========

    Questa UDF può essere utilizzata come qualunque funzione nativa di Excel. Quindi, con il tuo esempio, la UDF sarebbe  utilizzata così:

             =SeqDodo(A1:A12;"a b a")

    Nota che, invece di uno spazio come carattere separatore della sequenza, un carattere alternativa o una stringa di caratteri può essere stipulato come il terzo argomento facoltativo della funzione. Ad esempio:

            =SeqDodo(A1:A12;"a/b/a";"/")

    oppure****

    =SeqDodo(A1:A12;"a?!?b?!?a";"?!?")

    Potresti scaricare il mio file di prova Dodo20160825.xlsm a:

    https://www.dropbox.com/s/w9cy8xsm6z7bwxb/Dodo20160825.xlsm?dl=0

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento