Estrarre giorni settimana



  • Estrarre giorni settimana
    di wizards data: 08/11/2017 09:03:46

    Un saluto a tutti.
    Non sono molto pratico di VBA e cerco di risolvere un problema relativo ad una colonna di dati.
    Con le formule in Excel ci sarei riuscito ma vorrei capire come gestire la stessa situazione con VBA.

    Il mio problema è il seguente:
    ho un a colonna di dati con range C1:C200

    in questo elenco ci possono essere :
    dati alfanumerici e/o celle vuote e distribuiti casualmente i nomi dei sette giorni della settimana (scritti senza la i accentata)

    Dovrei riconoscere i nomi della settimana e spostarli in colonna A stessa riga, lasciando la corrispondente cella C vuota

    Ho cercato varie soluzioni sia nel forum che in rete ma non ho trovato la soluzione corretta.

    Sono veramente alle prime armi
    un ringraziamento a coloro i quali potranno suggerirmi una possibile soluzione




  • di Luca73 data: 08/11/2017 09:11:39

    Ciao Alcune indicazioni non VBA per darti qualche dritta poi dicci dove trovi le difficoltà.
    1) con un ciclo for passi tutte le celle nel range C1:C200 puoi usare
    1.a) ciclo For Each...next
    1.b) oppure un ciclo for ... next con una variabile indice della riga
    1.c) oppure un ciclo do..loop until e ad ogni cella sposti l'attenzione ad una riga più in basso finchà la cella sotto è vuota
    1.d) oppure un ciclo do..loop while e ad ogni cella sposti l'attenzione ad una riga più in basso fintanto che la cella in esame è piena
    2) Analizzi il testo della cella
    3) se il testo è uguale a lunedi o uguale a martedi o ....
    4) allora
    4.1) il testo della cella corrispondene in riga A (funzione offset) diventa quel testo
    4.2) svuoti o cancelli la cella in analisi

    Tutto qui
    Prova, inviaci il codice e procediamo passo -passo





  • di wizards data: 08/11/2017 16:54:52

    Ciao e grazie per il suggerimento

    Ho provato a scrivere qualche riga ma tieni conto che di VBA so veramente poco.

    ho completato il ciclo per un giorno e poi se va bene lo ricopio per gli altri.

    Ho forti dubbi sul copia ed incolla il valore.
    Non ho ancora capito invece come cancellare la cella C dopo lo spostamento in A

    grazie per i tuoi consigli
     
    dim r as interger
    dim valore as string
    
    For r = 1 To 200
    
          valore = Cells(r, 3).Value                                          ' leggo i valori di ogni cella della colonna C
              if valore= "Lunedi" then                                        ' Se il valore coincide con la stringa cercata.....
                 Cells(r, 3).Select                                                 ' seleziono il contenuto della cella 
    	Range(r, 3).Copy                                                     ' copio il contenuto della cella 
                           ActiveCell.Offset(r, -2).Value                    ' seleziono la riga corrispondente della colonna A   
                              Range(r,1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False                     ' copio il valore 
                                                                                            'svuoto la cella C con "" (non ho trovato questa indicazione)
    if valore= "Martedi" then
    Cells(r, 3).Select
    
    if valore= "Mercoledi" then
    Cells(r, 3).Select
    
    if valore= "Giovedi" then
    Cells(r, 3).Select
    
    if valore= "Venerdi" then
    Cells(r, 3).Select
    if valore= "Sabato" then
    Cells(r, 3).Select
    
    if valore= "Domenica" then
    Cells(r, 3).Select
    
    
    Next



  • di Zer0Kelvin data: 08/11/2017 20:44:38

    Ciao.

    -Puoi usare una sola if unendo le condizioni con l'operatore Or (oppure), vedi 1.

    -Offset ti permette di puntare una cella tramite lo scostamento (offset) relativo, vedi 2
    la sintassi è

    Range.Offset( Riga, Colonna)

    Per maggiori informazioni puoi consultare l'help del VBA dall'editor (tasto F1).

    In VBA non occorre selezionare un range per assegnargli un valore.
     
    1) 
    If A = 5 Or A = 6 then...
    
    1)
    Range("A1").Offset( 0, 1)
    equivale a 
    Range("B1")



  • di wizards data: 08/11/2017 22:29:50

    Grazie per il tuo suggerimento
    Però non ho capito:
    a) se il codice che ho scritto è corretto aldilà delle "scorciatoie"
    b) come cancellare la cella Cx una volta acquisito il valore e copiato nella cella Ax ( Forse : Range(r,c).ClearContents ?? )

    oltremodo sono impossibilitato a provare il codice in quanto ho il notebook in riparazione ma intanto volevo provare a capire le modalità di scrittura del codice
    Con l'operando OR mi sembra di capire che il codice diventerebbe così:




     
    Sub Copia-sposta
    
    dim r as interger
    dim valore as string
    
    For r = 1 To 200
    
          valore = Cells(r, 3).Value                                          ' leggo i valori di ogni cella della colonna C
              if valore= "Lunedi" or "Martedi" or "Mercoledi" or  "Giovedi" or "Venerdi" or "Sabato" or "Domenica" then ' Se il valore coincide con la stringa cercata.....
                 Cells(r, 3).Select                                                 ' seleziono il contenuto della cella 
    	           Range(r, 3).Copy                                          ' copio il contenuto della cella 
                           ActiveCell.Offset(r, -2).Value                    ' seleziono la riga corrispondente della colonna A   
                              Range(r,1).PasteSpecial Paste:=xlPasteFormats, Operation:=xlNone, _
            SkipBlanks:=False, Transpose:=False                     ' copio il valore 
                                   Range(r,3).ClearContents                'svuoto la cella C con "" (non ho trovato questa indicazione)
    Next
    end Sub



  • di Zer0Kelvin data: 09/11/2017 00:38:16

    Penso che da solo non ne vieni a capo: dunque...
    1) nei nomi di routine puoi usare solo lettere, numeri e il segno di sottolineatura
    2) quando concateni dei valori logici, devi riportare l'intera condizione
    3) in VBA non c'è bisogno di usare Select per agire su una cella
    4) per spostare un range si può usare Range.Cut che equivale a fare Taglia/Incolla (vedi help VBA)

    Se pensi, in futuro, di avere a che fare con le macro, ti consiglio di investire un pò di tempo nello studio dei rudimenti del VBA.
    Per cominciare può andar bene anche solo consultare l'help del VBA che è fatto piuttosto bene. 
     
    Sub Copia_sposta()
    Dim R As Integer
    Dim Valore As String
        For R = 1 To 200
            Valore = Cells(R, 3)
            If Valore = "Lunedi" Or Valore = "Martedi" Or Valore = "Mercoledi" _
            Or Valore = "Giovedi" Or Valore = "Venerdi" Or Valore = "Sabato" _
            Or Valore = "Domenica" Then ' Se il valore coincide con la stringa cercata.....
                Cells(R, 3).Cut Cells(R, 1)        ' sposto il contenuto della cella
            End If
        Next
    End Sub



  • di wizards data: 09/11/2017 19:44:53

    Grazie per la risposta
    Guardando l'help del VBA , a dir la verità mi sono confuso ancora di più
    Se riesco ad avere un aiuto più concreto sarei grato a tutti
    Grazie
    ciao



  • di Zer0Kelvin data: 09/11/2017 20:43:38

    Mi rendo conto che all'inizio è dura.
    Riguardo all'aiuto più concreto, la macro che ho allegato più sopra è funzionante; a cosa ti riferivi?



  • di wizards data: 10/11/2017 19:43:58

    La macro è perfetta
    Mi riferivo agli errori che ho fatto in quanto in un primo momento non capivo bene cosa mi avevi segnalato.
    Ho cercato meglio in giro ed ho compreso le tue indicazioni
    Per me è dura ma cerco di imparare il più possibile
    Ancora grazie per tutti i suggerimenti
    Ciao