Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Confronto stringhe di valori

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Confronto stringhe di valori

Postdi bibbaste » 17/07/15 14:39

Salve a tutti, rieccomi a chiedere il vostro prezioso supporto... :P

Il mio caso:

ho 3 celle in colonna (H6, H7, H8) e ciascuna contiene una stringa composta da dieci numeri (possono essere "1" o "2" quindi ad esempio : H6 .....1221122121 H7.... 1222221222 e H8 .... 1211122121)

io devo mettere in cella H9 la somma delle corrispondenze "monotermini" (o tutti 1 o tutti 2) confrontando tutte le posizioni nella stringa delle tre le celle - quindi la prima posizione, poi la seconda posizione poi la terza ecc ecc... spero di spiegarmi meglio con un esempio (le "x" corrispondono alla corrispondenza monotermine):

H6 1 2 2 1 1 2 2 1 2 1
H7 1 2 2 2 2 2 1 2 2 2
H8 1 2 1 1 1 2 2 1 2 1
H9 x x - - - x - - x -
quindi in questo caso la cella H9 avrà valore 4

Devo trovare una formula (o qualsiasi altra cosa) che mi permetta di fare questo conteggio

Spero di essermi spiegato....

Un grazie a tutti !! :) :)
bibbaste
Utente Junior
 
Post: 32
Iscritto il: 03/06/15 15:39

Sponsor
 

Re: Confronto stringhe di valori

Postdi wallace&gromit » 17/07/15 15:45

ciao,
con una formula esistente non credo sia possibile (o per lo meno la sua scrittura diventa un po' lunga).
Però puoi usare questa funzione creata ad hoc:
Codice: Seleziona tutto
Function contaTriple()
conta = 0
For i = 1 To Len(Range("H6"))
If IsNumeric(Mid(Range("H6"), i, 1)) Then
If Mid(Range("H7"), i, 1) = Mid(Range("H6"), i, 1) And Mid(Range("H8"), i, 1) = Mid(Range("H6"), i, 1) Then
    conta = conta + 1
End If
End If

Next i

contaTriple = conta
End Function
da inserire in un modulo di VBA
in H9 scrivi:
Codice: Seleziona tutto
=contaTriple()
se hai excel successivo a 2003 tieni conto che devi salvare in formato xlsm.
stato 2014: Office2003/2013 su win7
Avatar utente
wallace&gromit
Utente Senior
 
Post: 1421
Iscritto il: 16/01/12 14:21

Re: Confronto stringhe di valori

Postdi bibbaste » 17/07/15 16:16

Non so come ci riusciate!! Avete sempre la soluzione. :lol: :lol:

wallace&gromit ti ringrazio tantissimo, sei stato gentilissimo (e anche velocissimo!!). Funziona perfettamente ed era esattamente quello di cui avevo bisogno.

Ancora grazie.


Un saluto a presto.
bibbaste
Utente Junior
 
Post: 32
Iscritto il: 03/06/15 15:39

Re: Confronto stringhe di valori

Postdi scossa » 17/07/15 22:54

wallace&gromit ha scritto:Però puoi usare questa funzione creata ad hoc:
in H9 scrivi:
Codice: Seleziona tutto
=contaTriple()
se hai excel successivo a 2003 tieni conto che devi salvare in formato xlsm.


Ciao,
premesso che il codice proposto funziona perfettamente sulla base di quanto richiesto da bibbaste, mi permetto un'osservazione.

Una UDF, cioè una funzione (definita dall'utente) utilizzabile anche lato celle, dovrebbe rispettare i "canoni" delle funzioni native di Excel. Quindi se elaborano degli intervalli di celle, questi dovrebbero essere passati come argomenti della funzione e non essere definiti all'interno della macro stessa (pensate alla funzione SOMMA() ...).
In questo modo se dovesse cambiare il range di celle interessato non servirebbe modificare il codice della function ma solo la formula che la richiama.

Un esempio, sempre basato sul formato delle stringhe indicate da bibbaste (cioè numeri separati da uno spazio), potrebbe essere questo:

Codice: Seleziona tutto
Function contaTriple2(ByRef rng As Range) As Variant
 
  Dim nConta As Long
  Dim rCella As Range
  Dim aVal As Variant
  Dim j As Long
  Dim k As Long
  Dim nRows As Long
  Dim bMatch As Boolean
 
  nRows = rng.Columns(1).Rows.Count
  ReDim aVal(1 To nRows, 1 To 1)
 
  For Each rCella In rng.Columns(1).Rows.Cells
    j = j + 1
    aVal(j, 1) = Split(rCella, " ")
  Next

  For j = 0 To UBound(aVal(1, 1))
    bMatch = True
    For k = 2 To nRows
      bMatch = bMatch * (aVal(k, 1)(j) = aVal(k - 1, 1)(j))
    Next
    If bMatch Then nConta = nConta + 1
  Next j
 
  contaTriple2 = nConta

End Function


da usarsi, ad esempio:
Codice: Seleziona tutto
=contaTriple2(H6:H8)


Ovviamente il mio è solo un suggerimento, senza alcuna pretesa di insegnare niente a nessuno.
Bye!
scossa

Se tu hai una mela, e 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)
Avatar utente
scossa
Utente Senior
 
Post: 424
Iscritto il: 01/04/12 16:40
Località: Provincia di Verona

Re: Confronto stringhe di valori

Postdi Anthony47 » 18/07/15 00:25

Ovviamente condivido l'osservazione di scossa (vedere sopra): gli agomenti vanno "passati" alla udf (e quindi utilizzabile come si fa con tutte le funzioni native), non cablati all'interno del codice (cosa che la rende utilizzabile solo in uno specifico contesto).

Una alternativa con formula
Codice: Seleziona tutto
=MATR.SOMMA.PRODOTTO(--(STRINGA.ESTRAI(H6;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(H6)));1)="1");--(STRINGA.ESTRAI(H7;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(H6)));1)="1");--(STRINGA.ESTRAI(H8;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(H6)));1)="1"))+MATR.SOMMA.PRODOTTO(--(STRINGA.ESTRAI(H6;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(H6)));1)="2");--(STRINGA.ESTRAI(H7;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(H6)));1)="2");--(STRINGA.ESTRAI(H8;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(H6)));1)="2"))

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confronto stringhe di valori

Postdi bibbaste » 18/07/15 11:06

Salve, vedo che come tante cose, le soluzioni per un problema, possono essere diverse...

solo una precisazione per scossa (che ringrazio) .... gli spazi che avevo inserito erano solo per allineare le colonne nel post, ma nella mia reale esigenza non erano presenti (ma poco importa) magari può essere lo spunto per la soluzione di qualche altro utente o magari potrebbe andare bene anche alla mia esigenza, onestamente non l'ho ancora provata...

per Anthony.... (che come sempre è presente!) come già saprai (altrimenti non l'avresti postata ;) )la tua soluzione funziona perfettamente e l'ho adottata. Il vantaggio che ho trovato rispetto a quella segnalatami prima da wallace (ma forse per causa mia, magari non ho fatto tutto quello che dovevo) è che al variare delle celle dove risiedono le stringhe, questa si aggiorna automaticamente mente prima dovevo aggiornare la cella manualmente. E' come se la funzione non riuscisse a leggere il cambiamento nelle celle superiori.

Un ringraziamento a tutti e buon WE :) :)
bibbaste
Utente Junior
 
Post: 32
Iscritto il: 03/06/15 15:39

Re: Confronto stringhe di valori

Postdi Anthony47 » 18/07/15 11:25

Il mancato aggiornamento del risultato della Function di W&G è dovuto proprio al fatto che la function non è richiamata con gli "argomenti", quindi excel non la ricalcolera' mai di propria iniziativa.
Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confronto stringhe di valori

Postdi Anthony47 » 21/07/15 01:36

A scopo puramente didattico riscrivo la funzione abbozzata da w&g affinche' sia utilizzabile in modo parametrico, come si fa con le funzioni native di excel.
Il mio codice:
Codice: Seleziona tutto
Function contaVert(ByRef myRan As Range) As Variant
Dim Conta As Long, unMatch As Boolean, I As Long, J As Long
'
If myRan.Columns.Count > 1 Then contaVert = CVErr(2015): Exit Function
'
Conta = 0
For I = 1 To Len(myRan.Cells(1, 1))
    unMatch = False
    If IsNumeric(Mid(myRan.Cells(1, 1), I, 1)) Then
        myval = Mid(myRan.Cells(1, 1), I, 1)
        For J = 2 To myRan.Count
            If Mid(myRan.Cells(J, 1), I, 1) <> myval Then
                unMatch = True: Exit For
            End If
        Next J
        If unMatch = False Then Conta = Conta + 1
    End If
Next I
contaVert = Conta
End Function
Per cominciare non si chiama piu' ContaTriple, perche' puo' essere richiamata con argomento (di tipo Range) da 1, 2, 3, 4,... N celle.
Di conseguenza ho creato un loop For J /Next J che esamina i singoli digit di ogni cella e li confronta con quelli della prima cella.
La formula per richiamarla sara' del tipo
Codice: Seleziona tutto
=contavert(H6:H8)
[ma puo' essere anche =contavert(H6) o =contavert(H6:H10) o simile]
L' argomento "Intervallo" deve essere di celle adiacenti in verticale (stessa colonna), altrimenti sara' restituito l'errore #VALORE.

Ciao
Anthony
Win7 + Office 2010 Ita; Win 7 + Office 2013 Ita
Xp + Office 2003 Ita
E voi cosa usate? (per istruzioni vedere viewtopic.php?f=26&t=97449)
Avatar utente
Anthony47
Moderatore
 
Post: 13904
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Confronto stringhe di valori

Postdi bibbaste » 22/07/15 10:08

Grazie ancora.

A presto
bibbaste
Utente Junior
 
Post: 32
Iscritto il: 03/06/15 15:39


Torna a Applicazioni Office Windows


Topic correlati a "Confronto stringhe di valori":


Chi c’è in linea

Visitano il forum: Nessuno e 3 ospiti