estrazione senza valori ripetuti
Hai un problema con Excel? 
estrazione senza valori ripetuti
di vico25 (utente non iscritto) data: 17/07/2013 11:10:18
Ciao a tutti,
avrei bisogno di una mano per una funzione.
Sotto c'è il codice di una funzione che permette di togliere le lettere ripetute da una stringa, ad esempio:
avendo la stringa "aaaabbbbccccc" => la funzione restituisce la stringa "abc"
ora mi servirebbe una cosa del tipo:
avendo la stringa "TOTOTOBABABAGEGE" => la funzione restituisce la stringa "TOBAGE"
avendo la stringa "TORTORTORBAOBAOBAOGERGER" => la funzione restituisce la stringa "TORBAOGER"
quindi una funzione che mi elimini le ripetizioni di coppie, terzine, etc...
Grazie a tutti per l'ascolto e la disponibilità
Function EliminaDoppie (ByVal s As String) As String
Dim i As Integer
Dim k As Integer
If Len(s) > 0 Then
'inizializzazioni: sicuramente il primo carattere di s e' da inserire
'nella stringa del risultato r
r = Mid$(s, 1, 1)
k = 1
For i = 2 To Len(s)
If Mid$(s, i, 1) <> Mid$(r, k, 1) Then
r = r & Mid$(s, i, 1)
k = k + 1
End If
Next i
EliminaDoppie = r
Else
EliminaDoppie = ""
End If
End Function |
di Vecchio Frac data: 17/07/2013 11:20:28
Ecco, queste sono le sfide che mi piacciono ^_^
di Vecchio Frac data: 17/07/2013 11:22:22
Nella stringa di partenza, le coppie, terzine, quartine eccetera ripetute sono sempre in sequenza , oppure le ripetizioni possono essere ovunque nel testo?
Mi spiego:
è sempre così: --> "TOTOTOBABABAGEGE"
o può essere anche
così ---> "TOTOTOBABABAGEGETOTOGEBAGEBATO"
?
di vico25 (utente non iscritto) data: 17/07/2013 11:29:07
No, sono sempre in sequenza per fortuna!
Certo sarebbe bello averne una che non è influenzata dall' 'ordine' in cui sono disposte, ma per il momento sarebbe già un ottimo risultato averne una così... :-D
Credo che il nocciolo sia 'adattare' il
For i = 2 To Len(s)
in modo da dirgli di 'saltare' ogni 2,3,... caratteri, ma non riesco a capire come farlo :-P
di Vecchio Frac data: 17/07/2013 11:49:29
Ci sto pensando... adesso però scappo a pranzo ;)
Vediamo se qualcuno raccoglie la sfida e ci prova prima di me :P
di Vecchio Frac data: 17/07/2013 13:02:28
Stavo pensando anche che il codice non sa, a priori, se deve scegliere coppi o terzine o quartine, ecc. Così per non generalizzarla troppo, e produrre risultati in fondo inutili, costruisco la mia Function in modo che sia tu a stabilire se vuoi caratteri singoli, coppie, terzine o altro, mediante il passaggio di un parametro ad hoc.
Concordi con l'impostazione?
di Vecchio Frac data: 17/07/2013 13:27:41
Allora in attesa che tu mi risponda ecco quello che ho prodotto.
Niente di che, sia chiaro, ma i sembra che funzioni :)
La Function accetta in ingresso il testo (ovviamente) e il numero di caratteri desiderato per ogni sequenza (accetta anche 1, nel qual caso restituisce una lista con i singoli caratteri della stringa, ma uno solo quindi senza ripetizioni). La Function restituisce una Collection che bisogna scorrere per la lista delle sequenza trovate. Ti ritorna Nothing se i parametri forniti non sono validi.
Esempio di utilizzo:
for each v in group_by("TOTOTOBABABACUCUCU", 2)
msgbox v
next
restituisce in sequenza to, ba, cu.
Naturalmente puoi assegnare a una collection il valore di group_by, eccoti un esempio più complesso e forse più utile:
set c = group_by("tortorbarbargerger", 3)
if c is nothing then exit sub
for each v in c
s = s & v & vbcrlf
next
msgbox "Le terzine univoche sono " & c.count & vbcrlf & s
Option Explicit
Function group_by(text As String, num_groups As Integer) As Collection
Dim c As Collection, i As Integer, s As String
Set c = New Collection
If num_groups < 1 Or num_groups > Len(text) 2 Then
Set group_by = Nothing
Exit Function
End If
On Error Resume Next
For i = 1 To Len(text) Step num_groups
s = Mid(text, i, num_groups)
c.Add s, (s)
Next
On Error GoTo 0
Set group_by = c
End Function |
di vico25 (utente non iscritto) data: 17/07/2013 15:18:11
Ciao,
scusami, ma al lavoro sono sempre incasinato su 3000 cose :-P
Esatto, una funzione del tipo
=nomefunzione('stringa con coppie/terzine/... ripetute','numero che idendifica se coppie, terzine,...')
es.
=nomefunzione("TOTOTOBABABACUCUCU",2)
rilasciando la stringa "TOBACU"
Ho provato ad incollarmi al volo il codice in excel e ad applicare la formula su una stringa presente in una cella, ma mi dà #VALORE!
Cmq appena ho un attimo di respiro la studio meglio, è da modificare?
Thanks
di Vecchio Frac data: 17/07/2013 15:34:24
Certo, non può funzionare così.
La function restituisce una Collection e la puoi manipolare solo da codice, nel modo che ti ho illustrato nel mio post.
Se preferisci una funzione che restituisca una matrice (per esempio) la devo rivedere.
Forse preferiresti il risultato anche così: una stringa unica con trattini a separare gli elementi "TO-BA-CU".
di vico25 (utente non iscritto) data: 17/07/2013 15:47:01
Si diciamo che l'ideale sarebbe che potesse essere fruibile come una qualsiasi funzione...
in modo da poter selezionare la stringa dal foglio excel, come se fosse applicassi un "stringa.estrai" diciamo
non so se ho reso l'idea...
Cmq appena esco dal tunnel di questa giornata mi guardo bene il codice che mi hai passato, a dire il vero ho solo fatto un copia incolla sul modulo e basta :-P
Grazie ancora
di Vecchio Frac data: 17/07/2013 15:53:40
Allora facciamo così.
Aspetto che tu "esca dal tunnel" ^_^ e che ti veda il codice proposto, poi aspetto tue indicazioni su come procedere (magari nel frattempo elabori altre idee).
Vuoi Approfondire?