Trova sostituisci parte stringa



  • Trova sostituisci parte stringa
    di StefanoNeri (utente non iscritto) data: 30/06/2017 05:29:28

    Buongiorno a tutti ,
    vi seguo spesso e trovo molti spunti interessanti dai quali customizzare le mie soluzioni.

    Ho questo problema: ho un file excel , esportato da un gestionale, che contiene una serie di righe che specificano una distinta di misurazioni da fare su un pezzo di produzione
    le righe sono sequenziali delle caratteristiche --- es quota 19±0.1 ; quota 11.5 ±0.2 , ecc ---
    le colonne ne danno le specifiche --- es. colonna A --> descrizione ; colonna B --> valore massimo accettabile , ecc

    nello specifico , i dati da gestire sono:

    colonna E --> codice a 4 cifre che identifica il riferimento della riga ( es. riga 2 = valore cella 2010 ; es. riga 3 = 2020 )
    colonna O --> valore riscontrato della misurazione ( provenienti da inserimenti manuali nel file)
    colonna W --> formula che richiama la caratteristica ( es. A02010 + A02020 ) --- che tradotto significherebbe "somma il valore della colonna O sulla riga con riferimento 2010 con quella 2020. I dati nella colonna W sono stringhe di testo.

    Mi servirebbe quindi decodificare con una macro , sempre con riferimento all'esempio sopra , la stringa A02010 + A02020 ---> =O2 + O3
    in modo che l'operatore che usa il file riscontri il valore del calcolo nelle celle in O dove in W c'è una formula

    Grazie della collaborazione

    (premesso che la rimozione di A0 non è un problema )ho provato con Replace o Sostituisci sostituisco solo il campo 2010 con la misurazione , senza fare il calcolo



  • di patel data: 30/06/2017 07:45:21

    allega un file di esempio con i dati ed il risultato desiderato





  • di stefano.neri data: 30/06/2017 07:55:07

    Ciao Patel ,

    premetto che volevo sviluppare in test la cosa su un altro foglio e poi fare copia incolla in quello che invece ho allegato.

    Considera di diverso solo i riferimenti e cioè :

    Colonna E ---> O
    Colonna O ---> M
    Colonna W ---> copio nella colonna M



  • di patel data: 30/06/2017 08:38:58

    avevo chiesto un file di esempio con i dati ed il risultato desiderato , nel tuo non ci capisco niente





  • di stefano.neri data: 30/06/2017 09:59:37

    Ciao Patel ,
    vedi il file che allego ora ( esempio )

    L'operatore misura e inserisce manualmente dei dati nella colonna K e prosegue con inserimenti manuali finchè nella colonna P non trova una formula ; in quel caso il valore da associare alla riga corrispondente in K è il risultato della formula.
    Il problema però nasce dal fatto che la formula ( ereditata da un altro sistema ) deve essere convertita. L'esempio riporta nella cella P16 una formula A02090 + 2 che convertita correttamente sarebbe K10 + 2 ( K10 in quanto "A02090" significava , nel gestionale importato , "assegna il valore della colonna K corrispondente alla riga che contiene nella colonna E il valore 2090" )



  • di patel data: 30/06/2017 10:25:50

    Continuo a non capire, passo la palla a qualcuno più vispo





  • di Vecchio Frac data: 30/06/2017 10:44:16

    cit. " passo la palla a qualcuno più vispo"
    ---> LOL, più che la palla, scarichi il barile :)

    Per restare nell'ultimo esempio allegato, in K31 va il risultato dell'operazione ASSOLUTO(K29-K30) perchè la formula dice "prendi il valore assoluto di (valore inserito a mano del codice 3090 - valore inserito a mano del codice 3080)".
    I codici, presumo e mi auguro, sono univoci.
    Non vedo difficoltà insormontabili e per quanto mi riguarda io ho capito :)
    Se trovo un momento mi ci dedico.
    Chiedo a stefano.neri che competenze ha in materia di VBA (per poter poi parlare anche in modo più tecnico).





  • di stefano.neri data: 30/06/2017 12:29:11

    Ciao Vecchio Frac ,
    non credo di aver particolari competenze in materia ; credo di essere un discreto utilizzatore di excel che si è appassionato nell'ultimo anno alle macro per ottimizzazioni lavorative ; credo con buoni risultati.

    Più che altro sono solito trovare soluzioni simili sul web ( anche qui ) e customizzarle in funzione delle mie esigenze.

    Se guardi il mio primo allegato c'è quello che sono riuscito a fare. E' tutto in bozza in quanto l'ho iniziato da pochi giorni e mi dedico part time. I pulsanti con macro annesse sono tutti funzionanti (alcuni daranno errore in quanto "parlano" con altri file /cartelle che non ho caricato ).




  • di stefano.neri data: 30/06/2017 13:36:16

    parzialmente risolto....

    Manca tutta la parte del ciclo FOR.

     
    Sub correggiformula()
    
    
    Dim risultato As String
    
    valore = Range("E10").Value
    form = Range("K10").Value
    
    Range("P16").Select
    
    Cells.Replace what:="A0", replacement:="", lookat:=xlPart _
    , searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
    ReplaceFormat:=False
    
    Cells.Replace what:="ABS", replacement:="ASS", lookat:=xlPart _
    , searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
    ReplaceFormat:=False
    
    Cells.Replace what:=valore, replacement:=form, lookat:=xlPart _
    , searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
    ReplaceFormat:=False
    
    Range("K16").Value = "=" & Range("p16").Value
    
    End Sub
    



  • di Vecchio Frac data: 30/06/2017 13:41:49

    Quale "parte del ciclo for" ? per scandire tutte le celle della colonna P?
    Io comunque avrei affrontato il problema in modo diverso :)





  • di Vecchio Frac data: 30/06/2017 13:55:02

    Comunque non va bene ugualmente... in questa routine Cells.Replace interviene su tutte le celle del foglio per cui qualsiasi occorrenza di "A0" viene eliminata e qualsiasi ricorrenza della stringa "abs" (anche minuscola) viene sostituita da "ASS".

    Vorrei sapere comunque se a te interessa avere le formule nelle celle di destinazione, oppure il risultato di tali formule: la risposta deve essere "voglio le formule" se intendi modificare ancora i valori inseriti a mano in colonna K, così che le formule sono dinamiche; se invece una volta avviata l'elaborazione, questa si esaurisce e i valori inseriti a mano diventano immodificabili, allora vale la seconda risposta.

    Infine ti invito a inserire sempre la direttiva Option Explicit in testa ai tuoi moduli (Editor VBA >> Strumenti >> Opzioni > [Editor] >> Dichiarazione di variabili obbligatoria).





  • di stefano.neri data: 30/06/2017 14:03:17

    Ciao , in primis , grazie.

    Riguardo alla tua domanda...mi servono i risultati.

    Sotto vedi un'evoluzione della precedente con un ciclo FOR ma con degli errori.
    Anche il discorso dell'ABS/ASSe del A0 è corretto...ci stavo lavorando a step.

    Tu cosa mi consigli ?


      
     
    Option Explicit
    
    Sub correggiformula()
    
    Dim risultato As String
    i = 1
    valore = Range("i, 5").Value
    form = Range("i, 11").Value
    
    For i = Righe To 1 Step -1
    Cells(i, 16).Select
    
    If Selection.Value > 0 Then
    
    Cells.Replace what:="A0", replacement:="", lookat:=xlPart _
    , searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
    ReplaceFormat:=False
    
    Cells.Replace what:="ABS", replacement:="ASS", lookat:=xlPart _
    , searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
    ReplaceFormat:=False
    
    Cells.Replace what:=valore, replacement:=form, lookat:=xlPart _
    , searchorder:=xlByRows, MatchCase:=False, searchformat:=False, _
    ReplaceFormat:=False
    
    Range("i, 11").Value = "=" & Range("i, 16").Value
    
    Next i
    
    End Sub
    



  • di Vecchio Frac data: 30/06/2017 14:14:39

    Il primo consiglio è continuare a provare perchè sbagliando s'impara :)

    Il secondo consiglio è scrivere su un foglio di carta i passi che faresti se dovessi farlo a mano (è quello che ho dovuto fare io, a senza alcuna informazione aggiuntiva; o, vedila come vuoi, se tu fossi Excel e dovessi seguire un set di istruzioni pedissequo per raggiungere un risultato).

    Il terzo consiglio è ripensare a quel Cells.Replace che non va bene perchè lavora su tutte le celle del foglio e non sulla singola cella che devi esaminare.

    Il quarto consiglio è avere pazienza e darmi un po' di tempo in modo che possa buttare giù un pezzo di codice e vedere se funziona in modo da commentarlo insieme :)





  • di Vecchio Frac data: 30/06/2017 14:53:28

    Allego la mia proposta (si basa sul secondo file che hai allegato).
    Purtroppo non posso fare test veritieri, ho messo qualche valore a caso perchè le celle con i campi da compilare a mano non lo erano :)
     
    Sub correggiformula_VF()
    Dim re As Object, ma As Object
    Dim tabella As Range, ac As Range, c As Range, c1 As Range
    Dim fA As String, s As String
    Dim ur As Long
    
        Sheets("Foglio 2").Select
        ur = Range("A1").CurrentRegion.Rows.Count
        Set tabella = Range("P2..P" & ur)
        
        Set re = CreateObject("VBScript.RegExp")
        re.Global = True
        re.IgnoreCase = False        'ignore case
        
        re.Pattern = "A0d{4}"
        
        For Each c In tabella.SpecialCells(xlCellTypeConstants)
            If re.test(c) Then
                s = c
                For Each ma In re.Execute(c)
                    If ma <> "" Then
                        Set c1 = tabella.Offset(, -11).Find(Mid(ma, 3), lookat:=xlWhole, LookIn:=xlValues)
                        s = Replace(s, ma, c1.Offset(, 6))
                    End If
                Next
                Cells(c.Row, "K") = Evaluate(s)
            End If
        Next
        
        MsgBox "Finito", vbInformation
    End Sub
    






  • di stefano.neri data: 30/06/2017 16:07:11

    Ciao ,
    verificata con qualche dato e per i rilevamenti singoli funziona. Dà errore se trova un valore duplice da sostituire ( es. A02090 - A02080

    Può essere una soluzione dargli una ciclicità fino a quando non riscontra più nulla da sostituire?



  • di Vecchio Frac data: 30/06/2017 17:49:55

    Non riesco a riprodurre l'errore rispetto alla tua ultima osservazione (cioè scrivere A02090 - A02080 funziona).
    La ciclicità c'è già: "For Each c" controlla le celle con "formula" e converte ognuna di esse nella stringa da valutare sostituendo ai codici il rispettivo valore attraverso il ciclo "For Each ma" che ricerca nella stringa il pattern "A0" seguito da 4 cifre.





  • di stefano.neri data: 01/07/2017 05:40:20

    Ciao ,
    capito il problema.
    Riguarda i numeri interi.

    Con numeri interi OK , con numeri decimali ( es. 10,1 dà #VALORE! )

    Ora provo a correggere



  • di Vecchio Frac data: 01/07/2017 08:52:30

    Ah ecco. Basterà sostituire la virgola col punto prima dell'evaluate:
    s = Replace(s, ",", ".")
    
    Cells(c.Row, "K") = Evaluate(s)
    A me non succedeva perchè nell'esempio il separatore dei numeri decimali è il punto. Certo che le espressioni devono essere perfette e valutabili altrimenti si produce errore.





  • di stefano.neri data: 04/07/2017 21:40:41

    Ciao , scusa il ritardo. Ottimo Risolto

    Quando finisco tutto il lavoro al massimo te lo condivido così mi dai un parere



  • di stefano.neri data: 04/07/2017 21:48:06

    Vecchio frac , magari ne sei a conoscenza...

    Premesso che il mio lavoro servirebbe per inserire dei dati di misurazioni presi con un calibro ; se questo avesse una interfaccia / presa dati sarebbe possibile far confluire i dati direttamente da lì?

    Grazie in anticipo per la collaborazione



  • di Vecchio Frac data: 04/07/2017 21:55:25

    Bè per quel che ne so dipende dalla "presa dati"... se lo strumento espone la porta seriale allora sì penso che si possa intercettare il dato in uscita.





  • di stefano.neri data: 05/07/2017 07:27:26

    Sì , lo strumento ha la porta seriale. Viene già utilizzato per questo scopo con un software.
    Mi chiedevo se fosse possibile rilevare la misurazione con lo strumento e sua interfaccia e passare / visualizzare i dati su excel.

    Adesso credo li passi ad un database del software SPC



  • di Vecchio Frac data: 05/07/2017 09:16:34

    Il produttore dovrebbe fornire col software, per comunicare con lo strumento, un driver, una libreria DLL, un componente COM. Il software dovrebbe essere in grado di esportare almeno in formato testo (csv, txt, ecc.), che Excel è in grado di gestire.