Acquista i nostri libri consigliati su Amazon.it
+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo
Visualizzazione dei risultati da 1 a 10 su 16

Se cella contiene valore scrivi stringhe su celle adiacenti

  1. #1
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Ciao a tutti. L'intento è quello di riassumere la descrizione dei movimenti in estratto conto Home Banking scaricato in una colonna excel, copiandone (o modificandone) parte del contenuto in altra colonna, ed aggiungendo nelle colonne sucessive ulteriori valori descrittivi da me impostati.

    Esempio:
    se in colonna A ho "Bonifico blabla.. scuola PIO IX ..blablaa" , voglio scrivere nella rispettiva riga:
    in B "retta asilo", in C "bonifico", in D "istruzione" in E "bebè"
    se in A ho "ADDEBITO SDD FASTWEB blaalbalbaa..", voglio scrivere in B "ADSL", in C "RID", in D "casa", in E "internet"
    ecc..

    Per quanto riguarda la colonna B, la funzione sarebbe =SE(VAL.ERRORE(TROVA(" PIO IX ";A1));"...";"retta asilo"). Idem per le altre colonne.
    Trattandosi tuttavia di 30/40 causali frequenti, predisporre una funzione nidificata sarebbe a dir poco illegibile e poco pratica da aggiornare.

    Pensavo quindi di risolvere in VBA attraverso un Select Case (salvo suggerimenti migliori), ma con Excel sono piuttosto impacciato.
    Il CASE dovrebbe in sostanza esprimere questo concetto:
    Function fncDescrizione(R As Range) As Variant
        Select Case R(2)
        Case (=IF(R(1).Value=Like"* PIO XII *"))
            fncDescrizione = "retta asilo"  ' qui potrei aggiungere anche R(3)="bonifico"; R(4)="istruzione"; R(5)="bebè" ??
        case (=IF(R(1).Value=Like"ADDEBITO SDD FASTWEB*))
            fncDescrizione = "ADSL"
        Case Else
            fncDescrizione = "ALTRO"
        End Select
    End Function
    
    ma non so come scriverlo correttamente, né se posso inserire nel medesimo CASE anche i valori per le colonne successive.
    Ringrazio per ogni aiuto sul codice, o su alcuni link che possano orientarmi rapidamente alla soluzione (ne ho visti molti, ma nessuno esaustivo)

  2. #2
    Sgrubak non è in linea Scribacchino
    Post
    523
    Like Inviati  
    9
    Like Ricevuti  
    2
    Io lascerei perdere anche la macro.
    Le formule, se ho capito quel che vuoi fare, son più versatili...
    Procederei così:
    1) Organizzo i dati ricorrenti in un foglio, avendo cura che siano univoci
    Col1                 |Col2  |Col3 |Col4 |Col5     |
    ADDEBITO SDD FASTWEB |ADSL  |RID  |casa |internet |
    
    2) Nel secondo foglio importo i dati dalla banca e giocando con la formula CONFRONTA otterrei il numero della riga interessata nella tabella precedente da riutilizzare nelle colonne adiacenti, passandola come parametro per la formula INDIRETTO
    =INDIRETTO("B"&CONFRONTA(...)) --Variare la lettera per ciascuna colonna interessata
    

    Così facendo se aggiungi nuovi elementi alla tabella generale, non devi riscrivere ne formule ne codice. Ti basta inserire una riga in coda e hai risolto.

  3. #3
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Grazie Sgrubak.
    Provo ad utilizzare il tuo metodo

    Però mi piacerebbe capire perché se scrivo
    Function fncDescrizione(R As Range) As Variant
        
        Select Case R(1)
        Case (R(1) Like "PIO XII")
            fncDescrizione = "retta asilo"
        Case ((R(1) = "PIO XII"))
            fncDescrizione = "retta asilo"
        Case (R(1) Like "* PIO XII *")
            fncDescrizione = "retta asilo"
        Case ((R(1) = "ADDEBITO SDD FASTWEB"))
            fncDescrizione = "FASTWEB"
        Case Else
            fncDescrizione = "ALTRO"
        End Select
    End Function
    
    scrivendo su colonna B =fncDescrizione(A1)
    il risultato è che mi restituisce retta asilo solo se la cella in A è vuota, altrimenti mi restituisce sempre ALTRO

    Qual'è l'espressione costante corretta affinché in B mi restituisca retta asilo se nella stringa in A trova "* PIO XII *" ?

    ..
    Ultima modifica di surfgarden; 12-10-2020 10:31 

  4. #4
    Sgrubak non è in linea Scribacchino
    Post
    523
    Like Inviati  
    9
    Like Ricevuti  
    2
    Ti lascio alcune considerazioni su cui fare dei tentativi:
    1) non ho mai utilizzato la notazione del tuo esempio [R(1)]. Ho sempre verificato quanto memorizzato nella proprietà Value del Range [R.Value].
    2) Credo, ma non ho fatto prove, che quel Select Case non abbia la sintassi corretta. Dovrebbe essere:
    Select Case R.Value
        Case Like "*PIO XII*"
            fncDescrizione = "retta asilo"
        '... e così via...
        Case Else
            fncDescrizione = "ALTRO"
    End Select
    
    3) Utilizza bene il debug. Metti un bel punto di interruzione e verifica cosa c'è nelle variabili/proprietà che stai utilizzando. Così sei sicuro che in A1 ci sia il valore che ti aspetti e lo confronti per bene con le varie stringhe dei Case. Attento anche all'utilizzo del carattere speciale[*]. Nel tuo esempio c'è uno spazio all'inizio ed uno alla fine. Se nella stringa in cui cerci non ci sono, sei fregato. Attento anche che non ci sia il doppio spazio tra PIO e XII.

  5. #5
    Sgrubak non è in linea Scribacchino
    Post
    523
    Like Inviati  
    9
    Like Ricevuti  
    2
    In merito al mio precedente punto 1), andando a spulciare la documentazione sull'oggetto Range, vedo di averci preso.

    In pratica, con il codice come l'hai impostato tu, vai ad effettuare un confronto tra un oggetto Range (restituito da R(1) ) ed una stringa ("PIO XII"), che credo restituisca sempre [False]. Quest'ultimo valore booleano viene di nuovo confrontato con l'oggetto di tipo Range [R(1)] in testa al Select Case

    Ecco perché ti sempre "ALTRO"... Non esisterà nessuna corrispondenza tra le casistiche precedenti e quindi esce con il [Case Else].

    Sul perché a cella vuota intercetti un Case prima, onestamente va oltre le mie capacità. Ci sarà sicuramente qualche cast implicito di cui non sono a conoscenza, mi spiace...

  6. #6
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    In merito al mio precedente punto 1), andando a spulciare la documentazione sull'oggetto Range, vedo di averci preso.

    In pratica, con il codice come l'hai impostato tu, vai ad effettuare un confronto tra un oggetto Range (restituito da R(1) ) ed una stringa ("PIO XII"), che credo restituisca sempre [False]. Quest'ultimo valore booleano viene di nuovo confrontato con l'oggetto di tipo Range [R(1)] in testa al Select Case

    Ecco perché ti sempre "ALTRO"... Non esisterà nessuna corrispondenza tra le casistiche precedenti e quindi esce con il [Case Else].

    Sul perché a cella vuota intercetti un Case prima, onestamente va oltre le mie capacità. Ci sarà sicuramente qualche cast implicito di cui non sono a conoscenza, mi spiace...
    ho provato a scriverlo come l'hai postato tu, ma la sintassi del Case me la dà in rosso
    Function fnc2Descrizione(R As Range) As Variant
    
    Select Case R.Value
        Case Like "* PIO XII *"
            fnc2Descrizione = "retta asilo"
        Case Like "ADDEBITO SDD FASTWEB*"
            fnc2Descrizione = "FASTWEB"
        '... e così via...
            Case Else
            fnc2Descrizione = "ALTRO"
    End Select
    End Function
    
    Anni fa, avevo chiesto aiuto in altro contesto http://forum.masterdrive.it/excel-80...00/#post363066 , per cui provavo ad adattarne lo schema, ma evidentemente vale solo per restituire valori numerici, pur cercando nel Range un valore stringa

  7. #7
    Sgrubak non è in linea Scribacchino
    Post
    523
    Like Inviati  
    9
    Like Ricevuti  
    2
    Quote Originariamente inviato da surfgarden Visualizza il messaggio
    ho provato a scriverlo come l'hai postato tu, ma la sintassi del Case me la dà in rosso...
    Ok. Errore mio:
    Select Case True
        Case R.Value Like "*PIO XII*"
            fncDescrizione = "retta asilo"
        '... e così via...
        Case Else
            fncDescrizione = "ALTRO"
    End Select
    
    Così è per forza corretto perché verifica se l'operatore Like restituisce True e lo confronta con il True impostato come costante in testa al Select Case. Alla prima condizione vera esce.

  8. #8
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Perfetto !!!

    Credo cmq che abbraccerò le funzioni CONFRONTA e INDIRETTO che mi hai suggerito. E' uno schema più pratico nel mio caso specifico.

    Grazie mille


  9. #9
    surfgarden non è in linea Scolaretto
    Post
    146
    Like Inviati  
    0
    Like Ricevuti  
    0
    Quote Originariamente inviato da Sgrubak Visualizza il messaggio
    ...
    2) Nel secondo foglio importo i dati dalla banca e giocando con la formula CONFRONTA otterrei il numero della riga interessata....
    ho un problemino col "gioco"..
    per facilità ho riassunto in unico foglio.
    Non riesco ad impostare l'argomento stringa della matrice in modo che mi restituisca la riga anche quando vi sono nel VALORE caratteri che precedono il testo in matrice:

    https://imgur.com/iiOOZ5p


    in sostanza, non riesco ad applicare l'equivalente di Like "*xxx*" in VBA

  10. #10
    Sgrubak non è in linea Scribacchino
    Post
    523
    Like Inviati  
    9
    Like Ricevuti  
    2
    Quote Originariamente inviato da surfgarden Visualizza il messaggio
    ...Non riesco ad impostare l'argomento stringa della matrice in modo che mi restituisca la riga anche quando vi sono nel VALORE caratteri che precedono il testo in matrice...
    Cito dalla guida:
    "Se corrisp è uguale a 0 e valore è una stringa di testo, nell'argomento valore sarà possibile usare i caratteri jolly, ovvero il punto interrogativo (?) e l'asterisco (*). Usare il punto interrogativo e l'asterisco per indicare rispettivamente un carattere singolo e una sequenza di caratteri qualsiasi. Se si desidera trovare un punto interrogativo o un asterisco, digitare una tilde (~) prima del carattere."

    Prova con:
    =CONFRONTA( CONCATENA("*";B2;"*") ; $A$2:$A$5 ; 0 )
    
    Omettendo l'ultimo parametro, Excel sottintende 1, quando invece a te serve esplicitare lo 0: corrisp Facoltativo. Numero -1, 0 o 1. L'argomento corrisp specifica il modo in cui Excel deve confrontare valore con i valori contenuti in matrice. Il valore predefinito è 1.
    Così concateni anche i caratteri Jolly ed effettua una ricerca mirata all'interno della stringa, indipendentemente dall'ordinamento dei dati in cui stai cercando.

+ Rispondi al messaggio
Pagina 1 di 2 12 ultimoultimo

Potrebbero interessarti anche ...

  1. Risposte: 7
    Ultimo Post: 21-10-2017, 16:12
  2. Dividere testo nelle celle adiacenti
    Da moro54 nel forum Microsoft Excel
    Risposte: 13
    Ultimo Post: 06-02-2015, 09:41
  3. Eliminare valore in celle mantenendo la formula in altra cella
    Da Codice_da_Vinci nel forum Microsoft Excel
    Risposte: 9
    Ultimo Post: 02-06-2013, 13:12
  4. Concatenare 2 celle con valore + cella testo
    Da datalife nel forum Microsoft Excel
    Risposte: 4
    Ultimo Post: 17-02-2013, 10:25
  5. Intervalli celle non adiacenti
    Da Nick nel forum Microsoft Word
    Risposte: 5
    Ultimo Post: 02-09-2005, 13:25