Scrivi AS in caso di



  • Scrivi AS in caso di...
    di Lisa B. data: 26/02/2016 09:43:29

    Ciao a tutti,

    ho scritto questo codice che mi permette di trascrivere nelle celle dove viene richiamato, dei dati contenuti in altre celle ma tralasciandone alcune parti...

    Esempio:

    la cella D19 continene la formula:

    =RegExpReplace(AD19)

    Nella cella viene trascritto quello che è contenuto in AD19 tralasciando però le lettere S o F.

    Contenuto cella D19 = 3 (cella trascritta automaticamente da macro)

    Contenuto cella AD19 = 3S (cella origine)

    Ora vorrei implementare alla macro la funzione di trascrivermi "AS" ogni qual volta che nella cella di origine vi sia la dicitura FER, DISP, MAL e DS.

    Qualcuno sa aiutarmi???
     
    Option Explicit
    
    Function RegExpReplace(selectString As String) As String
    Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
        
        With objRegExp
            .Global = True
            .IgnoreCase = True
            
                If Len(selectString) = 1 Then
                    .Pattern = ""
                Else
                    .Pattern = "(S|F)$"
                End If
        
        RegExpReplace = .Replace(selectString, "")
        
        End With
    End Function



  • di Lisa B. data: 26/02/2016 12:05:01

    ... Mi sono forse espressa male???



  • di patel data: 26/02/2016 12:45:24

    ti sei espressa bene, ma non sono molti qui nel forum a masticare le espressioni regolari, devi aspettare l'intervento di qualche guru tipo scossa, vecchio frac ....





  • di Lisa B. data: 26/02/2016 14:25:23

    Grazie mille....



  • di cromagno data: 26/02/2016 18:56:11

    Ciao a tutti,
    concordo con quanto ha detto patel (un saluto) .... anche per me sono semi-sconosciute, comunque prova con questa "integrazione":
     
    Option Explicit
    
    Function RegExpReplace(selectString As String) As String
    Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
        
        With objRegExp
            .Global = True
            .IgnoreCase = True
            .Pattern = "(FER|DISP|MAL|DS)"
            
            If .test(selectString) Then
                RegExpReplace = "AS"
            Else
                
                If Len(selectString) = 1 Then
                    .Pattern = ""
                Else
                    .Pattern = "(S|F)$"
                End If
        
                RegExpReplace = .Replace(selectString, "")
            End If
        End With
    End Function
    



  • di Lisa B. data: 26/02/2016 19:03:13

    Grazie per ora...

    Domani mattina proverò immediatamente....

    Ancora grazie



  • di Mohican1989 data: 26/02/2016 23:14:32

    Non so cosa sia ma sembra molto interessante.
    Lisa scusa se non posso aiutarti ma puoi aiutare tu me, qual è lo scopo della macro ?

    Edit: Ok ho letto qualcosa su internet, figata, stavo imparando qualcosa sui pattern per dei file in xml che usiamo al lavoro e questa ricerca mi ha aperto un mondo ^^.

    Visto che cromagno sembra abbastanza ferrato sull argomento chiedo anche lui:
    1- Il pattern "(FER|DISP|MAL|DS)" può essere sotituito tranquillamente con "FER|DISP|MAL|DS" visto che non serve un raggruppamento giusto ?
    2-Io ho usato la funzione replace solo come worksheetfunction quindi (stringachecontieneiltesto,stringvecchia,stringanuova,occorrenza), invece qui mi pare che sostuisca i caratteri matchati dal pattern contenuti nella stringa indicata, è corretto ?



  • di cromagno data: 27/02/2016 00:54:20

    Ciao Mohican,
    come detto prima... ne so molto poco di questo particolare argomento.

    Ne avevo letto in passato ma non essendomi mai servite non ho approfondito...
    Per aiutare ho solo "ripassato" qualcosina tramite web.

    Comunque, visto che 2 teste (o più) sono meglio di una, apri direttamente una nuova discussione e magari insieme si capisce meglio come usarle



  • di Lisa B. data: 27/02/2016 07:32:20

    Buongiorno a tutti… ho provato la soluzione proposta da CROMAGNO mah… ahimè non funziona… MAL. DISP, FER e DS rimangono tali…
    Scrivendo invece la macro sotto riportata, risolvo il problema legato a MAL DISP FER e DS… in quanto nella casella di destinazione mi compare la scritta AS (escludendo però la parte legata al togliere la lettera S o F dagl’altri codici) ma ovviamente non mi funziona più la parte per cui la macro è nata...

    Attivando anche la parte superiore, la macro funziona con l’esclusione delle S e F ma torna a non funzionare più per quanto riguarda MAL. DISP, FER e DS.

    UFF... non ce ne esco….. come posso far funzionare assieme le due parti???

    Nel caso che non si riuscisse a far scrivere AS al posto di MAL, DISP, FER o DS perché la prima parte della formula esclude l’ultima lettera se S o R….. anche la sola lettera A mi potrebbe andare bene.


     
    Function RegExpReplace(selectString As String) As String
    Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
        
    '    With objRegExp
    '        .Global = True
    '        .IgnoreCase = True
    '            If Len(selectString) = 1 Then
    '                .Pattern = ""
    '            Else
    '                .Pattern = "(S|F)$"
    '            End If
    '
    '    RegExpReplace = .Replace(selectString, "")
    '
    '    End With
        
            
        With objRegExp
            .Global = True
            .IgnoreCase = True
                    If Len(selectString) = 1 Then
                .Pattern = "(MAL|DISP|FER|DS)"
                Else
                    .Pattern = "(MAL|DISP|FER|DS)$"
    
            End If
            
        RegExpReplace = .Replace(selectString, "AS")
            
            End With
               
    End Function



  • di cromagno data: 27/02/2016 11:38:43

    Ciao Lisa,
    a questo punto servirebbe un file di esempio con quello che hai e quello che il codice ti dovrebbe dare come risultato...
    Per come avevo capito funziona... ma evidentemente ho capito male



  • di Lisa B. data: 27/02/2016 12:49:01

    Allego file appena possibile.....



  • di Albatros54 data: 27/02/2016 13:32:14

    Se ho capito
     
    Function RegExpReplace(selectString As String) As String
        Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
    
        With objRegExp
            .Global = True
            .IgnoreCase = True
            .Pattern = "(S|F)$"
            s = selectString
            If .test(s) Then
                RegExpReplace = .Replace(selectString, "")
            Else
                .Pattern = "(MAL|DISP|FER|DS)$"
                RegExpReplace = .Replace(selectString, "AS")
    
            End If
    
    
        End With
    End Function
    






  • di Lisa B. data: 27/02/2016 14:58:28

    Siiiiiiiiii

    Funzionaaaaaa


    Mille grazie



  • di Mohican1989 data: 27/02/2016 15:21:16

    Quale delle 2 ha dato esito positivo al risultato che volevi ? Con quella di Cromagno mi sembrava andasse bene invece con quella di Albatros il DS diventa D e non AS anche perchè se non ho capito male in quella di Albatros verifica prima la presenza di S o F come ultimo carattere, se lo trova lo toglie altrimenti verifica se gli ultimi caratteri sono MAL FER DS o DISP ma nel caso di DS viene subito verificato il match con la S e restituisce quindi D e non AS.



  • di Lisa B. data: 27/02/2016 15:58:37

    Ho risoltoccon quello di Albatros

    Mettendo DSI al posto di DS



  • di Mohican1989 data: 27/02/2016 17:00:22

    Potresti postare la soluzione ?

    Non capisco come mai quella di cromagno non raggiungeva il tuo scopo.

    Inoltre se metto DSI al posto di DS e uso la funzione di albatros DSI rimane DSI ...



  • di Albatros54 data: 27/02/2016 17:24:25

    .Pattern = "(MAL|DISP|FER|DSI)$"





  • di Mohican1989 data: 27/02/2016 17:32:51

    Quindi ha cambiato sia il pattern nella funzione che la stringa di origine ... Mi sembra si sia fatto più lavoro di quello necessario ma potrei sbagliarmi.



  • di Albatros54 data: 27/02/2016 17:34:20

    Che soluzione avresti proposto?





  • di Mohican1989 data: 27/02/2016 17:44:20

    Quella di cromagno a mio avviso non presentava "bug" infatti ho chiesto più volte cosa non andasse bene in quella da lui proposta.



  • di Albatros54 data: 27/02/2016 17:55:30

    Questa soluzione dovrebbe togliere qualsiasi dubbio
     
    Function RegExpReplace(selectString As String) As String
        Dim objRegExp As Object
        Set objRegExp = CreateObject("vbscript.regexp")
    
        With objRegExp
            .Global = True
            .IgnoreCase = True
            .Pattern = "(MAL|DISP|FER|[DS]{2})$"
            s = selectString
            If .test(s) Then
                RegExpReplace = .Replace(selectString, "AS")
            Else
                .Pattern = "(S|F)$"
                RegExpReplace = .Replace(selectString, " ")
    
            End If
    
    
        End With
    End Function






  • di Mohican1989 data: 27/02/2016 19:28:28

    Non sto dicendo che la tua non funzioni ma, la prima funzione necessitava di modificare la stringa di origine, l' ultima che hai postato funziona anche se la stringa di origine ha dentro "SD" o "SS" o "DD" (anche se è cosa non è possibile visto le casistiche postate da Lisa)

    Il problema e che volevo capire dove fosse sbagliata quella di cromagno. Perchè probabilmente mi sta sfuggendo la cosa a me e rompo le scatole per niente ma cerco di imparare da ogni situazione proposta.



  • di Lisa B. data: 27/02/2016 21:28:03

    Un quella di moican disf fer mal ecc rimangino tali.... Non mi cambiano



  • di Mohican1989 data: 27/02/2016 21:46:09

    ... Mi sembra strano Lisa a me funziona sul tuo file usando sia L ultima di albatros sia quella di cromagno. Non capisco come mai non ti vada. Pensavo di non aver capito qualcosa io ma penso che hai copiato male la funzione allora.

    Comunque chiudo la polemica volevo solo capire se lo scoop era raggiungibile con entrambe e a mio parere si



  • di Albatros54 data: 28/02/2016 07:06:50

    Non si tratta di fare polemica,si tratta solo di esternare le proprie idee.
    Comunque quella di CRomagno(che Saluto), funziona, solo che bisogna, per le esigenze di Lisa, modificare la riga di codice che posto.
    Ciao
     
    RegExpReplace = "AS" <<<===da modificare in
    
    RegExpReplace = .Replace(selectString,  "AS")
    






  • di cromagno data: 28/02/2016 09:48:35

    Ciao tutti,
    premetto che se "Lisa" ha risolto son contento per lei, ma....
    provando i due codici, il mio nella colonna "J" e quello di Albatros (che saluto) nella colonna "K", risulta che riferendosi alla cella "L36", il mio restituisce "AS" (testo in blu) come da istruzioni di Lisa mentre quello di Albatros restituisce "D" (testo in rosso). Allego file "Prove - RegEx".

    Ripeto, se per Lisa è a posto così non mi dilungo oltre



  • di Mohican1989 data: 28/02/2016 11:28:42

    Ciao cromagno, nei vari post che forse non hai avuto modo di leggere Lisa ha prima cambiato la stringa di origine ds in dsi è così il pattern della macro di albatros poi albatros ha postato un altro codice che funziona senza modificare la stringa di origine di Lisa.

    A mio avviso è sicuramente più pulito scrivere il risultato della funzione usando replace ma non vedo perche quella di cromagno con L istruzione regexp="AS" non debba funzionare, alla fine il risultato è lo stesso no?



  • di cromagno data: 28/02/2016 11:32:46

    Ciao Mohican,
    si, in effetti ho letto velocemente gli altri post e non ho fatto caso alle modifiche di Lisa (mi sono riferito solo al file che ha allegato).

    cit. "ma non vedo perche quella di cromagno con L istruzione regexp="AS" non debba funzionare, alla fine il risultato è lo stesso no?"

    Anche io non vedo la differenza ma non insisto in quanto ci potrebbero essere aspetti che mi sfuggono delle RegEx.