Funzione Mid



  • Funzione Mid
    di trump61 data: 19/01/2015 02:38:00

    Ciao, sono di nuovo qui per chiedere un aiuto. Con questo codice pensavo di risolvere il mio problema, in pratica volevo estrarre da una tabella (che sono turni lavorativi settimanali), dei nominativi e una data per poter realizzare automaticamente dei moduli di cambio turno. Le celle che contengono i turni dove è stato messo un cambio turno si presentano così es. "M Bianchi " che è la persona che cambia il turno con il nominativo presente in colonna A, sto cercando di prelevare questi dati e per il momento copiarli su un foglio così da avere una base da dove proseguire perchè non so ancora bene come realizzare la cosa. Ho subito incontrato il primo problema nel foglio settimanale in una cella ci puo' essere scritto soltanto il Turno esempio "M" o come sopra "M Bianchi" o un turno di straordinario che viene riportato così "M + P" ed è quest'ultima forma che mi da i problemi perchè quando faccio partire il codice mi ritrovo nelle celle dove ho deciso di copiare i valori i nomi come previsto ma anche "+M" come nell' esempio che ho inserito che non vorrei ci fosse non riesco a trovare una forma che mi discrimini questa cosa e la cosa non va bene.
    spero di essermi spiegato, vi ringrazio per il vostro aiuto che è arrivato sempre.
     
    Sub prova()
    Dim X As Integer
    For X = 3 To 9
    If Mid(Cells(4, X), 3) <> "" Or Mid(Cells(4, X), 3, 1) <> "+" Then
    Cells(2, X + 12) = Mid(Cells(4, X), 3)
    Cells(1, X + 12) = Cells(2, X)
    End If
    If Mid(Cells(5, X), 3) <> "" Or Mid(Cells(5, X), 3, 1) = "+" Then
    Cells(3, X + 12) = Mid(Cells(5, X), 3)
    End If
    
    Next
    Range("N2") = Range("A4")
    Range("N3") = Range("A5")
    End Sub
    



  • di Vecchio Frac data: 19/01/2015 07:04:14

    Usa InStr per verificare la presenza di un carattere nella stringa, e se c'è usa Split per separare le sottostringhe.

    Ma prima di codificare, cioè prima " per il momento copiarli su un foglio così da avere una base da dove proseguire perchè non so ancora bene come realizzare la cosa", è meglio che studi bene cosa vuoi fare, perchè intrapresa una strada poi è spesso difficile tornare indietro, rischi di perdere giorni o settimane di lavoro.
     
    s = cells(4,x)
    If Instr(s, "+") > 0 then
        'c'è un +, separo le sottostringhe
        v = Split(s, "+")
        'dopodichè in v(0) c'è la parte a sinistra e in v(1) la parte a destra del "+"
        'qui il codice che tratta le sottostringhe
    else
        'resto del codice se non c'è un +
    end if






  • di scossa data: 19/01/2015 09:51:31

    cit. V.F.: "Usa InStr per verificare la presenza di un carattere nella stringa, e se c'è usa Split per separare le sottostringhe."

    Io, più semplicemente, userei InStrRev (vedi codice sotto).


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)

     
    Sub prova()
    Dim X As Long
    Dim nAt As Long
    For X = 3 To 9
      nAt = InStrRev(Cells(4, X), " ") + 1
      Cells(2, X + 12) = Mid(Cells(4, X), nAt)
      Cells(1, X + 12) = Cells(2, X)
      Cells(3, X + 12) = Mid(Cells(5, X), nAt)
    Next
    Range("N2") = Range("A4")
    Range("N3") = Range("A5")
    End Sub



  • di scossa data: 19/01/2015 10:12:17

    Scusate, piccola correzione (non avevo verificato l'output richiesto)



    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)


     
    Sub provaScossa()
    Dim X As Long
    Dim nAt As Long
    For X = 3 To 9
      nAt = InStrRev(Cells(4, X), " ") + 1
      Cells(1, X + 12) = Cells(2, X)
      If nAt > 1 And Len(Cells(4, X)) > nAt + 2 Then
        Cells(2, X + 12) = Mid(Cells(4, X), nAt)
        Cells(3, X + 12) = Mid(Cells(5, X), nAt)
      End If
    Next
    Range("N2") = Range("A4")
    Range("N3") = Range("A5")
    End Sub



  • di scossa data: 19/01/2015 10:23:04

    Secondo me, è sbagliato testare su Cells(4, X) anche per la riga sotto, quindi modificherei in:


    P.S.: che senso ha, ad esempio, la cella con P + M senza un nome?

    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)


     
    Sub provaScossa()
    Dim X As Long
    Dim nAt As Long
    For X = 3 To 9
      Cells(1, X + 12) = Cells(2, X)
      nAt = InStrRev(Cells(4, X), " ") + 1
      If nAt > 1 And Len(Cells(4, X)) > nAt + 2 Then Cells(2, X + 12) = Mid(Cells(4, X), nAt)
      nAt = InStrRev(Cells(5, X), " ") + 1
      If nAt > 1 And Len(Cells(5, X)) > nAt + 2 Then Cells(3, X + 12) = Mid(Cells(5, X), nAt)
    Next
    Range("N2") = Range("A4")
    Range("N3") = Range("A5")
    End Sub



  • di trump61 data: 19/01/2015 15:15:27

    Ciao, grazie prima di tutto sto leggendo adesso le vostre preziose risposte. Rispondo all' ultima perchè ancora non ho potuto studiare gli altri codici. "P + M" o "M + P" sono la prima lettera il turno ordinario che l'agente deve svolgere la + indica il turno a straordinario che l' agente deve svolgere oltre il suo turno ordinario. Quindi non c'è bisogno che ci sia un nome



  • di trump61 data: 20/01/2015 03:00:11

    Ciao, ho cercato di capire i codici che avete postato, in primis grazie, devo dire che quello di "Vecchio Frac" non lo riesco proprio a capire, Perchè penso sia fuori della mia portata, quello si Scossa (L'ultimo da i risultati che volevo) sto a fatica cercando di interpretarlo.
    Premetto che è la prima volta che mi imbatto nell' istruzione "InStrRev"
    "nAt = InStrRev(Cells(4, X), " ") + 1" ? lui cerca nelle stringhe presenti nelle celle controllate dal ciclo for lo spazio vuoto non capisco, qui dovrebbe dare il numero di dove trova il primo spazio vuoto ? ad esempio se nella cella ci fosse "P Rossi" il valore della var. nAt sarebbe 2 + 1 cioè nAt= 3 ? o sbaglio?
    "If nAt > 1 And Len(Cells(4, X)) > nAt + 2 Then Cells(2, X + 12) = Mid(Cells(4, X), nAt)"
    Qui proprio la spariamo alla grande ma scrivo quello che capisco di questa riga di codice.
    Se la var. nAt è > di 1 e il numero dei caratteri che è presente nelle celle(4, X) è maggiore della var. nAt + 2
    Poi le celle controllate con il ciclo contengono stringhe che che partono dal carattere partire dal carattere che corrisponde al valore determinato dalla var nAt es. " Pavarotti è la stringa contenuta nella cella il valore di nAt è 3 il risultato sarà "varott"i ?



  • di trump61 data: 20/01/2015 03:13:03

    Scusate le ultime due righe non si capiscono
    Then cioè poi le celle individuate con Cells(2, X + 12) saranno uguali alle quello che c'è nelle celle Mid(Cells(4, X), nAt) ma a causa dell' istruzione Mid i le stringhe presenti nelle celle Cells(4, X) saranno differenti perchè le srtinghe invece di partire dal primo carattere partiranno l valore della variabile nAt es. nAt = 3, nella cella dove c'è stringa iniziale c'è la parola "Pavrotti" nella cella dove inseriremo il risultato ci sarà "varotti? o sbaglio?
    grazie per la tua pazienza



  • di scossa data: 20/01/2015 09:53:50

    cit. trump61: "Premetto che è la prima volta che mi imbatto nell' istruzione "InStrRev" ......"

    Dalle mie parti c'è un detto: "aiutati che il ciel t'aiuta"

    Posiziona il cursore sull'istruzione InStrRev e premi F1. Leggi cosa dice l'help al riguardo, poi se ancora non ti è chiaro ne parliamo.


    scossa's web site
    Se tu hai una mela, ed io ho una mela, e ce le scambiamo, allora tu ed io abbiamo sempre una mela per uno.
    Ma se tu hai un'idea, ed io ho un'idea, e ce le scambiamo, allora abbiamo entrambi due idee. (George Bernard Shaw)



  • di trump61 (utente non iscritto) data: 27/01/2015 18:18:27

    Ciao, torno a rompere le scatole dopo 10 giorni di influenza(devastante), ho seguito il tuo consiglio e a dire il vero spesso con l'Help di Excel non mi ritrovo molto ed anche questa volta...però girando in rete ho trovato questa
    "La funzione Microsoft Excel InStrRev restituisce la posizione della prima occorrenza di una stringa in un'altra stringa, a partire dalla fine della stringa. Questo è simile alla funzione INSTR che restituisce la posizione della prima occorrenza, a partire dall'inizio della stringa". Credo di aver capito, o quasi Cioè mi sembra che Es InStrRev ("Casetta", "a") il risultato dovrebbe essere 7 o sbaglio? cioè cerca la prima "a" a partire dal fondo ma conta dal primo carattere. Vorrei chiedervi un consiglio se secondo voi è possibile realizzare un modulo su un foglio e compilarlo ricavando i dati che ho estratto con il codice discusso qui con un ciclo che mi riporta tutti i cambi turni e ogni volta che cambiano i dati me lo stampi. Mi sa che la cosa è complicata o creare più moduli e riempirne uno per dato.
    Grazie per la vostra attenzione