Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

formula per estrarre da stringhe di testo numeri racchiusi fra parentesi tonde e sommarli

545 views
Skip to first unread message

Miafiorentina

unread,
Nov 3, 2014, 5:55:43 AM11/3/14
to

Buongiorno a tutti,

il titolo dice parecchio.

All'università usiamo Excel 2003 e dobbiamo risolvere il problema descritto nel titolo.

Le stringhe sono si questo tipo

Zyn(70)Hcl(500)NA(70)Cup(75)

e sono scaricate nella colonna A da A1 in basso.

La formula dovrebbe leggere la stringa e restituire 715

I numeri contenuto possono essere più di una trentina.

Sto provando qualche formula matrice trovata in rete: per ora senza risultato.

Ringrazio chi solo leggerà questa richiesta

Message has been deleted

canapone

unread,
Nov 3, 2014, 8:28:18 AM11/3/14
to
Ciao,

spero si legga:

=SOMMA(STRINGA.ESTRAI(A1;PICCOLO(SE(STRINGA.ESTRAI(A1;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)));1)="(";RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)))+1);RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)-LUNGHEZZA(SOSTITUISCI(A1;"(";"")))));PICCOLO(SE(STRINGA.ESTRAI(A1;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)));1)=")";RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1))));RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)-LUNGHEZZA(SOSTITUISCI(A1;"(";"")))))-PICCOLO(SE(STRINGA.ESTRAI(A1;RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)));1)="(";RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)))+1);RIF.RIGA(INDIRETTO("1:"&LUNGHEZZA(A1)-LUNGHEZZA(SOSTITUISCI(A1;"(";""))))))^1)

devi confermare la formula come matrice.

Non saprei allegare il file dove sto facendo le prove.

Saluti

Miafiorentina

unread,
Nov 3, 2014, 9:05:23 AM11/3/14
to
Ciao,

provo ad adattare la formula al mio caso.

Ho fatto qualche prova ed i risultati mi garbano parecchio.

Bruno Campanini

unread,
Nov 3, 2014, 2:28:17 PM11/3/14
to
Miafiorentina explained on 03-11-14 :
Esistono numeri fuori dalle parentisi tonde?
E se esistono vanno considerati addendi?

Bruno

Tobia

unread,
Nov 3, 2014, 6:05:55 PM11/3/14
to


<Sto provando qualche formula matrice trovata in rete: per ora senza
risultato.


hanno inventato le regular expression proprio per questo.
Ad esempio:

([^\d]+|^)\d{2,3}[^\d]

trova e cattura tutti i numeri composti da 3 o 2 cifre dentro la stringa.

Bruno Campanini

unread,
Nov 3, 2014, 7:35:44 PM11/3/14
to
Miafiorentina expressed precisely :
Se ti può servire una UDF... somma i numeri interi
- comunque delimitati - che si trovano entro una stringa.
=========================================================
Public Function SumInString(X As String) As Long
Dim S As String, M As String, i As Long, SS As Long
For i = 1 To Len(X)
M = Mid(X, i, 1)
If IsNumeric(M) Then
S = S & M
Else
On Error Resume Next
SS = SS + CLng(S)
On Error GoTo 0
S = ""
End If
Next
SumInString = SS
End Function
=============================

Bruno

Miafiorentina

unread,
Nov 3, 2014, 11:19:34 PM11/3/14
to
Buongiorno,

non esistono numeri fuori dalle parentesi da sommare e la funzione funziona (allitterazione) perfettamente.

Spero mi lasciano libera di usare macro/udf al "lavoro".

Grazie
Message has been deleted
Message has been deleted

canapone

unread,
Nov 4, 2014, 2:51:19 AM11/4/14
to
Ciao a tutti,

il mio Alfredo mi ricorda spesso - parafrasando Sergio Leone - che quando un uomo con la formula incontra l'uomo con l'UDF, l'uomo con la formula è un uomo morto.

Mi arrendo.

paoloard

unread,
Nov 4, 2014, 3:52:07 AM11/4/14
to


"Miafiorentina" ha scritto nel messaggio
news:76098b5d-a69b-442d...@googlegroups.com...
Giusto per accademia, dato che questa non funziona sul 2003 ma sui
successivi:
=SOMMA(SE.ERRORE(1*SOSTITUISCI(SOSTITUISCI($A1;SINISTRA($A1;TROVA("#";SOSTITUISCI($A1;"(";"#";RIF.COLONNA($1:$50))));"");DESTRA($A1;LUNGHEZZA($A1)-TROVA("#";SOSTITUISCI($A1;")";"#";RIF.COLONNA($1:$50)))+1);"");""))
matriciale

paoloard

paoloard

unread,
Nov 4, 2014, 9:18:39 AM11/4/14
to


"paoloard" ha scritto nel messaggio news:m3a43d$qlt$1...@dont-email.me...



..
Le stringhe sono si questo tipo

Zyn(70)Hcl(500)NA(70)Cup(75)

e sono scaricate nella colonna A da A1 in basso.

La formula dovrebbe leggere la stringa e restituire 715

...

Giusto per accademia, dato che questa non funziona sul 2003 ma sui
successivi:
=SOMMA(SE.ERRORE(1*SOSTITUISCI(SOSTITUISCI($A1;SINISTRA($A1;TROVA("#";SOSTITUISCI($A1;"(";"#";RIF.COLONNA($1:$50))));"");DESTRA($A1;LUNGHEZZA($A1)-TROVA("#";SOSTITUISCI($A1;")";"#";RIF.COLONNA($1:$50)))+1);"");""))
matriciale

paoloard


Oppure questa matriciale che vale per qualsiasi versione:
=SOMMA(SE(NON(VAL.ERRORE(1*SOSTITUISCI(SOSTITUISCI($A1;SINISTRA($A1;TROVA("#";SOSTITUISCI($A1;"(";"#";RIF.COLONNA($1:$35))));"");DESTRA($A1;LUNGHEZZA($A1)-TROVA("#";SOSTITUISCI($A1;")";"#";RIF.COLONNA($1:$35)))+1);"")));1*SOSTITUISCI(SOSTITUISCI($A1;SINISTRA($A1;TROVA("#";SOSTITUISCI($A1;"(";"#";RIF.COLONNA($1:$35))));"");DESTRA($A1;LUNGHEZZA($A1)-TROVA("#";SOSTITUISCI($A1;")";"#";RIF.COLONNA($1:$35)))+1);"");0))

paoloard

Tobia

unread,
Nov 4, 2014, 7:33:14 PM11/4/14
to


Oppure questa matriciale che vale per qualsiasi versione:
=SOMMA(SE...

Potresti commentarcela un pochino per sommi capi questa formula sotto forma
di matrice?
grazie

paoloard

unread,
Nov 5, 2014, 3:19:35 AM11/5/14
to


"paoloard" ha scritto nel messaggio news:m3an7l$2h5$1...@dont-email.me...



"paoloard" ha scritto nel messaggio news:m3a43d$qlt$1...@dont-email.me...



..
Le stringhe sono si questo tipo

Zyn(70)Hcl(500)NA(70)Cup(75)

e sono scaricate nella colonna A da A1 in basso.

La formula dovrebbe leggere la stringa e restituire 715

...

meglio questa, vale per tutte le versioni ed è più veloce perché tiene conto
del numero esatto di numeri all'interno della stringa:

=SOMMA(1*SOSTITUISCI(SOSTITUISCI($A1;SINISTRA($A1;TROVA("#";SOSTITUISCI($A1;"(";"#";RIF.RIGA(INDIRETTO("r1:C"&LUNGHEZZA($A1)-LUNGHEZZA(SOSTITUISCI($A1;"(";""));1)))));"");DESTRA($A1;LUNGHEZZA($A1)-TROVA("#";SOSTITUISCI($A1;")";"#";RIF.RIGA(INDIRETTO("r1:C"&LUNGHEZZA($A1)-LUNGHEZZA(SOSTITUISCI($A1;"(";""));1))))+1);""))
ovviamente matriciale.

@per Tobia. Nel pomeriggio ti risponderò. Scusa adesso devo chiudere.
ciao paoloard

paoloard

unread,
Nov 5, 2014, 10:23:19 AM11/5/14
to


"Tobia" ha scritto nel messaggio news:m3br87$5mm$2...@speranza.aioe.org...
Meglio la formula finale:
=SOMMA(1*SOSTITUISCI(SOSTITUISCI($A1;SINISTRA($A1;TROVA("#";SOSTITUISCI($A1;"(";"#";RIF.RIGA(INDIRETTO("r1:C"&LUNGHEZZA($A1)-LUNGHEZZA(SOSTITUISCI($A1;"(";""));1)))));"");DESTRA($A1;LUNGHEZZA($A1)-TROVA("#";SOSTITUISCI($A1;")";"#";RIF.RIGA(INDIRETTO("r1:C"&LUNGHEZZA($A1)-LUNGHEZZA(SOSTITUISCI($A1;"(";""));1))))+1);""))


sviluppa in forma matriciale la formula:
=1*SOSTITUISCI(SOSTITUISCI($A1;SINISTRA($A1;TROVA("#";SOSTITUISCI($A1;"(";"#";RIF.COLONNA(A1))));"");DESTRA($A1;LUNGHEZZA($A1)-TROVA("#";SOSTITUISCI($A1;")";"#";RIF.COLONNA(A1)))+1);"")
questa, se guardi bene non fa altro che, prima con la funzione SINISTRA,
sostituire alla prima parentesi tonda il segno # e quindi sostituire alla
parte a sinistra della parentesi, compresa la parentesi, una stringa vuota
"". Poi, con la funzione DESTRA fare altrettanto dalla parte destra,
isolando così solo il numero racchiuso fra parentesi.
Se questa formula la trascini a destra, a seguito dell'aggiornamento di
RIF.COLONNA da A1 a B1 agisci sul secondo gruppo di parentesi isolando il
secondo numero e così via.
Sommare questi valori trasformando la formula in matriciale, da
RIF.COLONNA(A1) a RIF.COLONNA($1:$1) comporta per ò un errore dato che
quando TROVA cerca una parentesi ( alla fine della stringa restituisce un
messaggio di errore che si replica in SOMMA.
Con:
RIF.RIGA(INDIRETTO("r1:C"&LUNGHEZZA($A1)-LUNGHEZZA(SOSTITUISCI($A1;"(";""));1))
calcolo esattamente quante parentesi ( vi sono nella stringa, quindi quanti
numeri, limitando la matrice al numero esatto di numeri presenti nella
stringa, senza quindi la necessità di controllare l'errore di overflow.
Spero di essere stato chiaro.
Ciao paoloard

Tobia

unread,
Nov 5, 2014, 4:20:47 PM11/5/14
to
potenza delle espressioni regolari: risultato 715!

Function SumNumsInString(StringToSearch As String) As Double
Dim regex As Object
Dim rgxMatch As Object
Dim rgxMatches As Object
Dim NumSum As Double

Set regex = CreateObject("vbScript.RegExp")
With regex
.Global = True
.Pattern = "(()\d+())"
If .Test("Zyn(70)Hcl(500)NA(70)Cup(75)") Then
Set rgxMatches = .Execute(StringToSearch)
For Each rgxMatch In rgxMatches
If IsNumeric(Replace(rgxMatch, ",", "")) Then
NumSum = NumSum + Replace(rgxMatch, ",", "")
End If
Next rgxMatch
End If
End With
SumNumsInString = NumSum
End Function


Chiaramente si concateneranno le stringhe nel range ("A1:A50") e la si
passerą alla funzione.

Tobia

unread,
Nov 5, 2014, 4:23:04 PM11/5/14
to
<<meglio questa, vale per tutte le versioni ed è più veloce perché tiene
conto
<<del numero esatto di numeri all'interno della stringa:

<<=SOMMA(1*SOSTITUISCI(SOS........



fai la stessa cosa la regexp:

Pattern = "(()\d+())"


Potenza della sintesi! :-))

issdr

unread,
Nov 6, 2014, 3:34:49 PM11/6/14
to
Miafiorentina wrote:

> Le stringhe sono si questo tipo
>
> Zyn(70)Hcl(500)NA(70)Cup(75)
>
> e sono scaricate nella colonna A da A1 in basso.
>
> La formula dovrebbe leggere la stringa e restituire 715

Public Function Eval(st)
Eval = Evaluate(st)
End Function

in un foglio macro; poi installi http://www.codedawn.com/excel-add-ins.php

e usi =eval(RegExReplace(A1;"[^\d]+";"+")&"0")

come formula.

HTH

--
np: no song

Bruno Campanini

unread,
Nov 7, 2014, 8:08:19 PM11/7/14
to
Tobia formulated on Wednesday :
Riesci a fare anche questa?
3,1415929167812 ABX1 000,99pp 0.00000000001
(Risultato = 1004.13159291679)

dove:
"," è il separatore decimale
" " è il separatore di migliaia

Bruno
0 new messages