Pagina 1 di 2 1 2 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 13
  1. #1
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725

    [excel] Considerare un valore di cella alfanumerico come il corrispettivo numerico...

    Cerco di spiegarmi meglio...

    Ho delle celle con valori del tipo:

    638 Ro 580 Mi
    743 Fi To 488 Mi
    743 Mi Na Ro Ve 369 Pa


    Io senza dover necessariamente dividere i valori numerici da quelli alfabetici vorrei fare le seguenti operazioni:

    580Mi - 638Ro = 580-638 = -58


    Ovvero far considerare i valori alfabetici (Mi e Ro)= 0 senza doverli rimuovere dalle celle.
    E possibile? Se si come? grazie infinite agli esperti di excel che interverranno!

    Per adesso invece anche se formatto le relative celle come numero ottengo sempre al posto del valore finale della sottrazione richiesta #VALORE!


  2. #2
    Non credo che si possa fare con le funzioni standard, ce ne vuole una fatta appositamente che poi verrà richiamata nelle formule come se fosse una normale funzione.

    Non ci metto molto a fartela però ho bisogno di sapere se effettuerai solo sottrazioni fra due operandi come negli esempi o anche operazioni più complesse e in quel csaso che contenuto ci sarà nella cella di origine.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  3. #3
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725
    Originariamente inviato da NonCeLaFaccio+
    Non credo che si possa fare con le funzioni standard, ce ne vuole una fatta appositamente che poi verrà richiamata nelle formule come se fosse una normale funzione.

    Non ci metto molto a fartela però ho bisogno di sapere se effettuerai solo sottrazioni fra due operandi come negli esempi o anche operazioni più complesse e in quel csaso che contenuto ci sarà nella cella di origine.

    Solo sottrazioni come il caso di esempio.
    Grazie mille amico
    "Vero sapiente è colui che sa di non sapere" (Socrate)

  4. #4
    L'ho fatta un po' in velocità ma dovrebbe funzionare

    codice:
    Public Function sottrai_numeri(casella)
    
       Dim filler, caratteri(), i, carattere, addendo(), segno, i_max
       
       filler = "+"
       ReDim Preserve caratteri(0)
       caratteri(0) = filler
       
       For i = 1 To Len(casella)
          ReDim Preserve caratteri(i)
          carattere = Mid(casella, i, 1)
          If (carattere >= 0) And (carattere <= 9) Then
             caratteri(i) = carattere
             filler = "-"
          Else
             caratteri(i) = filler
          End If
       Next
       
       i = 0
       ReDim Preserve addendo(i)
       segno = 1
       
       For Each carattere In caratteri
       
          If IsNumeric(carattere) Then
             addendo(i) = (addendo(i) * 10) + (segno * carattere)
          Else
             i = i + 1
             ReDim Preserve addendo(i)
             If carattere = "-" Then
                segno = -1
             End If
          End If
       
       Next
    
       i_max = i
       sottrai_numeri = 0
       
       For i = 0 To i_max
          sottrai_numeri = sottrai_numeri + addendo(i)
       Next
    
    End Function
    Devi creare un foglio excel xlsx, salvarlo come xlsm (con attivazione di macro), digitare ALT+F11, cliccare due volte su "Modulo1" nella finestrella dei progetti e poi incollare il codice nell'area bianca.

    Se modulo1 non è presente clicca col destro su VBAProject e inserisci un nuovo modulo.
    Se già ci sono altri moduli può darsi che tu debba inserirla nell'ultimo o in uno intermedio, fai un po' di prove.

    Fatto questo la richiami da una qualsiasi cella come se fosse una normale funzione:

    codice:
    =sottrai_numeri(A1)
    La function riceve la casella da esaminare, fa un primo ciclo in cui trasforma la stringa in array riportando i caratteri numerici e sostituendo gli altri con + se si trovano prima del primo numerico e con - se si trovano dopo.

    Poi esamina l'array ricostruendo i numeri a partire dalla sequenza di cifre ed assegnando il segno + al primo e il - agli altri e riporta i numeri così ottenuti nell'array addendi.

    E infine somma gli addendi.

    Funziona anche con più numeri con la regola che sottrae dal primo tutti quelli che seguono.

    Fai sapere come va.
    Ciao
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  5. #5
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725
    Originariamente inviato da NonCeLaFaccio+
    L'ho fatta un po' in velocità ma dovrebbe funzionare

    codice:
    Public Function sottrai_numeri(casella)
    
       Dim filler, caratteri(), i, carattere, addendo(), segno, i_max
       
       filler = "+"
       ReDim Preserve caratteri(0)
       caratteri(0) = filler
       
       For i = 1 To Len(casella)
          ReDim Preserve caratteri(i)
          carattere = Mid(casella, i, 1)
          If (carattere >= 0) And (carattere <= 9) Then
             caratteri(i) = carattere
             filler = "-"
          Else
             caratteri(i) = filler
          End If
       Next
       
       i = 0
       ReDim Preserve addendo(i)
       segno = 1
       
       For Each carattere In caratteri
       
          If IsNumeric(carattere) Then
             addendo(i) = (addendo(i) * 10) + (segno * carattere)
          Else
             i = i + 1
             ReDim Preserve addendo(i)
             If carattere = "-" Then
                segno = -1
             End If
          End If
       
       Next
    
       i_max = i
       sottrai_numeri = 0
       
       For i = 0 To i_max
          sottrai_numeri = sottrai_numeri + addendo(i)
       Next
    
    End Function
    Devi creare un foglio excel xlsx, salvarlo come xlsm (con attivazione di macro), digitare ALT+F11, cliccare due volte su "Modulo1" nella finestrella dei progetti e poi incollare il codice nell'area bianca.

    Se modulo1 non è presente clicca col destro su VBAProject e inserisci un nuovo modulo.
    Se già ci sono altri moduli può darsi che tu debba inserirla nell'ultimo o in uno intermedio, fai un po' di prove.

    Fatto questo la richiami da una qualsiasi cella come se fosse una normale funzione:

    codice:
    =sottrai_numeri(A1)
    La function riceve la casella da esaminare, fa un primo ciclo in cui trasforma la stringa in array riportando i caratteri numerici e sostituendo gli altri con + se si trovano prima del primo numerico e con - se si trovano dopo.

    Poi esamina l'array ricostruendo i numeri a partire dalla sequenza di cifre ed assegnando il segno + al primo e il - agli altri e riporta i numeri così ottenuti nell'array addendi.

    E infine somma gli addendi.

    Funziona anche con più numeri con la regola che sottrae dal primo tutti quelli che seguono.

    Fai sapere come va.
    Ciao
    Intanto GRAZIE INFINITE e appena ho 5 min lo provo e ti faccio sapere! GRAZIE mago di excel!

    Non ce l'ho fatta ad aspettare e ho provato subito..
    Però non devo aver capito come fare

    Ti spiego la funzione mi sembra di averla implementata correttamente... seguendo i passi da te indicati anche se al posto della voce modulo1 io ho trovato la voce foglio1 (nella colonna di sx) ho cliccato due volte e nel foglio bianco "generale" ho incollato la tua funzione. Poi nel foglio1 di excel ho incollato nella cella C1 il seguente codice di prova:

    codice:
    =sottrai_numeri(A1:B1)
    dove A1 conteneva 2a e B1 3b ma invece di darmi o -1 o 1 a seconda di come esegue la sottrazione... mi da solo... #NOME?




    "Vero sapiente è colui che sa di non sapere" (Socrate)

  6. #6
    E no, non devi metterlo in Foglio1 ma in Modulo1, se no non trova la function e ti segnala appunto NOME.
    Devi cliccare su VBAProject col destro e scegliere inserisci --> modulo (questo in excel 2007, nelle altre versioni non saprei).

    Inoltre la funzione si aspetta una singola cella come argomento, non due, perché dal tuo esempio mi era sembrato di capire così, quindi nella parentesi devi metterci una sola cella non A1:B1, altrimenti dimmi esattamente come sono fatti i dati di input e la adattiamo
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  7. #7

  8. #8
    Quella soluzione è molto carina ma non è stata "tradotta" bene, la formula corretta da inserire in B1 (in forma di matrice) è:

    codice:
    =1*STRINGA.ESTRAI(A1;CONFRONTA(VERO;VAL.NUMERO(1*STRINGA.ESTRAI(A1;RIF.RIGA($1:$9);1));0);CONTA.NUMERI(1*STRINGA.ESTRAI(A1;RIF.RIGA($1:$9);1)))
    e comunque sembra fermarsi a quattro cifre.
    Più tardi me la studio meglio.
    La democrazia rappresentativa ha fatto il suo tempo, è ora di passare alla democrazia diretta.
    www.beppegrillo.it

  9. #9
    Confermo, va elaborata un attimo, non ho riportato una formula ad hoc perché ho poco tempo.
    La linea ottimale è comunque questa.

    Buon lavoro

  10. #10
    Utente di HTML.it L'avatar di freetom
    Registrato dal
    Nov 2001
    Messaggi
    3,725
    Originariamente inviato da NonCeLaFaccio+
    E no, non devi metterlo in Foglio1 ma in Modulo1, se no non trova la function e ti segnala appunto NOME.
    Devi cliccare su VBAProject col destro e scegliere inserisci --> modulo (questo in excel 2007, nelle altre versioni non saprei).

    Inoltre la funzione si aspetta una singola cella come argomento, non due, perché dal tuo esempio mi era sembrato di capire così, quindi nella parentesi devi metterci una sola cella non A1:B1, altrimenti dimmi esattamente come sono fatti i dati di input e la adattiamo
    Adesso funzia

    es: CELLA A: 20jkhaslh12 (fa 20-12) risultato-> 8

    Però ribadisco che a me servirebbe qualcosa di leggermente diverso...
    Ovvero la sottrazione dovrebbe avvenire tra valori alfanumerici convertiti in numero presenti in due celle (o colonne distinte)

    Es.

    CELLA A:
    12ashg23

    CELLA B:
    44ui22

    operazioni svolte dalla formula:
    in A: 12ashg23 -> 1223
    in B: 44ui22 -> 4422
    B-A = 4422-1223 = 3199


    CELLA C: (contenente la formula)
    risultato: 3199

    Spero di essere stato un po' piu' chiaro questa volta e grazie ad entrambi
    anche se l'ultima formula suggerita da ibernet purtroppo non mi si attiva per nulla...
    e mi resta nella cella come testo...

    "Vero sapiente è colui che sa di non sapere" (Socrate)

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.