verifica stringhe di testo excel 2003

Una macro, trovata in internet, mi ha “splittato” un testo (in versi) collocandolo su righe diverse.

Alla fine di ogni rigo mi ha “contato” le celle ocupate, scrivendomi il valore in una cella vuota (es. colonna G).

La stessa cosa ha fatto poi con le righe successive.

Alla fine, quindi,

Sulla riga A ho:

a1 “casa”; b1 “albero”; c1 “melo”; d1 “orizzonte”. In una cella, poniamo g1,  ho il valore 4 (numero celle con testo)

Sulla riga b ho:

a2 “casa”; b2 “albero”; c2 “melo”; d2 “orizzonte” e2 “cammello”. In  g2,  ho il valore 5 (numero celle con testo)

e cos’ via.

 

Vorrei con una macro poter modificare il valore di G al verificarsi di una determinata condizione.

Se, per esempio , la stringa in A1 finisse per vocale e se quella in B1 iniziasse per vocale il Valore in G1 dovrebbe essere 3 e non 4. Utilizzerei questo valore per ulteriori operazioni.

(Colorare lo sfondo delle celle, formattare il testo ecc; ma questo per il momento non può interessarmi!)

Ho tentato con diverse macro di ottenere quanto voglio. Dal punto di vista logico mi sembra a volte  abbastanza semplice; teoricamente anche dal punto di vista informatico. So che devo operare con istruzioni quali If..then.. else e operatori stringa, ma …tra il dire e il fare….c’è il mare!

 

C’è un’anima pia che ,avendo capito cosa devo alla fine realizzare, mi vuol dare una mano?

 

La macro che mi splitta il testo è la seguente.

 Sub boucle()

Dim cpt, total As Integer

cpt = 0

Worksheets("foglio1").Activate

Range("A2").Activate

While Not (ActiveCell.Value = "" And ActiveCell.Offset(0, 1).Value = "" And ActiveCell.Offset(0, 2).Value = "")

If ActiveCell.Value <> "" Then cpt = cpt + 1: total = total + cpt

If ActiveCell.Offset(0, 1).Value <> "" Then cpt = cpt + 1: total = total + cpt

If ActiveCell.Offset(0, 2).Value <> "" Then cpt = cpt + 1: total = total + cpt 

If ActiveCell.Offset(0, 3).Value <> "" Then cpt = cpt + 1: total = total + cpt 

ActiveCell.Offset(0, 7).Value = cpt

cpt = 0

ActiveCell.Offset(1, 0).Activate

Wend

End Sub

 

Con la macro successiva  son riuscito a leggere da A1  per estrarre la prima lettera della stringa.

Ho assegnato il suo valore ad una variabile. E –per vedere se funziona- ho fatto scrivere in A2  il valore  della variabile. Semplice? Per me grande soddisfazione!

 

Private Sub CommandButton3_Click()

'funziona.legge dalla cella a1 e colloca in A2 la prima lettera

Dim Sprova As String

Sprova = Cells(1, 1).Value

a = Left$(Sprova, 1)

Range("a2").Select

ActiveCell.Value = a

End Sub

 

Passo successivo e ragionamento…

Vediamo se mi riconosce le vocali;

Allora, dichiaro la variabile sVoc  che poi “riempio” con le vocali;

Vediamo se la sVoc funziona…. Me lo faccio dire da un msgsbox..

 

Se la procedura funziona, invece di far leggere il valore dall’msgbox potrei attivare una variabile

Asino=true /asino=false ; potrei passare alla cella successiva,con offset , verificare la prima lettera e mettere in un’altra variabile Scemo il risultato vero-falso; alla fine se asino=vero e scemo=vero, potrei implementare un contatore…se asino=vero e asino scemo=vero cont= cont+1

 

…e tutto questo da inserire nella macro principale, quella che splitta e conta celle, prima che l’istruzione passi alla riga successiva!!  Mi son perso!

 

Vediamo se va…con msgbox…

 

Dim Sprova As String, sVoc As String

 

Sprova = Cells(1, 1).Value   ‘ valore è pippo o ippo

sVoc = "aeiuo"

a = Right$(Sprova, 1) ‘ con Left$ mi legge la prima- con   a = Right$(Sprova, 1) mi legge l’ultima

If a = sVoc Then

MsgBox bravo

Else

Range("a2").Select

ActiveCell.Value = a

End If

 

End Sub

 

Come mi aspettavo….Non funziona! Alè!

a = Right$(Sprova, 1) mi scrive O in A2

 

a = Left$ (Sprova, 1)

Con Pippo mi scrive P in A2

 Con Ippo mi scrive i

 

In conclusione.

C’è un’anima pia che ,avendo capito cosa devo alla fine realizzare, e ,soprattutto, immedesimandosi nello sforzo e nella frustrazione del sottoscritto,  mi vuol dare una mano?

Grazie.

emilio

 

Informazioni domanda


Ultimo aggiornamento febbraio 27, 2018 Visualizzazioni 704 Si applica a:
Risposta

Ciao, ho visto e ti ringrazio, ma…

Forse, anzi senza forse, non capisco granché, però il codice non mi pare che risolva il mio problema.

<cut>

Ti ringrazio per la pazienza.

emilio



Pappa pronta, eh? ;-)

Bene....

 

Public Sub m()

    Dim sh As Worksheet
    Dim lCont As Long
    Dim lng As Long
   
    Set sh = ThisWorkbook.Worksheets("Foglio1")
    lCont = 0
   
    With sh
        For lng = 1 To 9
            If f(Right(.Cells(1, lng).Value, 1)) And _
                f(Left(.Cells(1, lng + 1).Value, 1)) Then
                 lCont = lCont + 1
             End If
        Next
    End With
   
    MsgBox 9 - lCont
    Set sh = Nothing
   
End Sub


Public Function f(ByVal s As String) As Boolean
    Select Case LCase(s)
        Case "a", "e", "i", "o", "u", "y"
        f = True
    End Select
End Function

 

La funzione f() può anche essere scritta così:

 

Public Function f(ByVal s As String) As Boolean
    If LCase(s) Like "[aeiouy]" Then
        f = True
    End If
End Function


Ovviamente 9 si può parametrizzare, ecc., ecc.

 

Qui il file utilizzato per l'esempio:

http://www.maurogsc.eu/esempiforum13/cellevocali.zip

--
Mauro Gamberini
Microsoft© MVP (Excel)
http://www.maurogsc.eu

Il problema è stato risolto?

Siamo spiacenti che questo non sia stato d'aiuto.

Fantastico! Grazie per aver scelto questa risposta.

Sei soddisfatto di questa risposta?

Grazie per il tuo commento, ci aiuta a migliorare il sito.

Sei soddisfatto di questa risposta?

Grazie per il tuo commento.