Aggiornare celle di excel



  • Aggiornare celle di excel
    di Andgiaim (utente non iscritto) data: 16/07/2012

    Ciao a tutti,
    premetto che non sono molto esperto di vba per excel . in pratica vorrei ho un foglio excel che mi gestisce degli ordini che sono suddivisi in base ad una anagrafica con gli ordini del cliente, una fase di consegna e così via.
    ho realizzato la seguente tabella excel:
    campi:
    cliente - città - provincia - numero prenotazione - causale - data prenotazione - tipologia - produttore


    ho successivamente realizzato una userform in cui gli dico di inserire i valori nelle celle sopra indicate usando questo codice:
    worksheets("pianoordini").cells(irr, "a").value = textcliente.text ' colonna (a)
    poi gli dico di eseguire un controllo che verifica l'ultima riga inserita:

    if checkbox.value = false then worksheets("pianoordini").cells(irr, "af").value = "x" else worksheets("entrate").cells(irr, "af").value = ""

    la tabella excel contiene anche altri campi excel
    data presunta consegna - data effettiva di consegna - note - data inizio installazione - data presunta installazione - data reale di fine installazione - note.
    avendo inserito la prima riga con il modulo di inserimento sopra citato vorrei a questo punto aggiornare i le celle excel rimaste inizialmente vuote (data presunta consegna - data effettiva di consegna - note - data inizio installazione - data presunta installazione - data reale di fine installazione - note) in quanto inizialmente mancano le informazioni necessarie.
    a questo punto vorrei realizzate un'altra userform che mi aggiorni le celle vuote in base al numero di prenotazione inizialmente inserito.
    potete aiutarmi per favore magari indicandomi qualche procedura o metodo ?

    grazie


     
    Di seguito posto il codice ancora incompleto
    
    
    Private Function UltimaRiga() As Long
    Dim vTemp As Variant
    Dim iRR As Long
        
        ' Calcolo la riga in cui inserire i dati (la prima riga libera)
        iRR = 4  ' riga di inizio
        ' Utilizzo la notazione riga,colonna
        vTemp = Worksheets("pianoOrdini").Cells(iRR, 4).Value
        Do While Not IsEmpty(vTemp)
            iRR = iRR + 1
            vTemp = Worksheets("pianoOrdini").Cells(iRR, 4).Value
        Loop
        UltimaRiga = iRR
    End Function
    
    
    
    Private Sub cmdInserisci_Click()
    Dim vTemp As Variant
    Dim iRR As Long
    
    
        ' Calcolo la riga in cui inserire i dati (la prima riga libera)
        iRR = UltimaRiga
    
        ' inserire i dati'
        Worksheets("pianoOrdini").Cells(iRR, "A").Value = TextCliente.Text      ' Colonna (A)
        Worksheets("pianoOrdini").Cells(iRR, "B").Value = TextCitta.Text        ' Colonna (B)
        Worksheets("pianoOrdini").Cells(iRR, "C").Value = TextProvincia.Text    ' Colonna (C)
        Worksheets("pianoOrdini").Cells(iRR, "D").Value = TextDistretto.Text    ' Colonna (D)
        
       'Prove di inserimento nuova riga con controllo dei valori inseriti da checkbox
        If checkbox.Value = False Then Worksheets("pianoOrdini").Cells(iRR, "M").Value = "X" Else Worksheets("ENTRATE").Cells(iRR, "AF").Value = ""
        
      
    Unload Me
    End Sub



  • di Patel (utente non iscritto) data: 16/07/2012

    Allega il file, sarà più facile capire, provare e risponderti


  • Allegato
    di Andgiaim data: 19/07/2012

    Ciao patel,
    in allegato trovi il file con estensione .xlsm
    fatto in excel 2010.
    attendo qualche tua delucidazione
    grazie



  • di Patel (utente non iscritto) data: 19/07/2012

    Ti allego un esempio abbastanza completo da cui potrai capire come modificare il tuo, tieni presente anche le validazioni dei vari campi in modo da impedire l'inserimento di dati non corretti



  • di andgiaim (utente non iscritto) data: 11/08/2012 22:08:04

    Ciao Patel, ho cambiato il codice utilizzando come esempio il file che mi hai allegato.
    Purtroppo non capisco bene il codice per il controllo delle date e come far funzionare la listbox per aggiornare il
    modulo.
    Ti allego il file in .xlsm
    Non so se puoi aiutarmi

    Grazie




  • di Vecchio Frac data: 13/08/2012 13:09:48

    Un paio di osservazioni che mi saltano all'occhio guardando il file allegato:
    - evitiamo i Goto che sono un retaggio arcaico e fonte di guai :)
    - utilizzare on error resume next con cautela perché sopprime gli errori senza reagire e possono verificarsi effetti imprevisti
    - specificare sempre in cima ad ogni finestra di codice "Option Explicit"
    - tipizzare sempre le dichiarazioni di variabili che altrimenti vengono memorizzate come variant con spreco di memoria e inefficienza delle’esecuzione: non "dim variabile" ma "dim variabile as ..."
    - scriviamo codice con una corretta indentazione altrimenti si fatica a leggerlo

    Andgiaim scrive "Purtroppo non capisco bene il codice per il controllo delle date"
    Il codice in textBox3_Change (che peraltro non esiste nello UserForm nel file allegato) verifica che ci sia una data digitata correttamente nel formato gg/mm/aaaa. Viene utilizzato un parsing molto dettagliato, forse evitabile, del testo contenuto nella testbox (il testo è già verificato all’uscita dalla textbox quindi si possono evitare ulteriori controlli superflui). La routine verifica anche che la data immessa sia compresa tra 1899 e 2101

    Infine, cosa significa per te Andgiaim "come far funzionare la listbox per aggiornare il modulo" ?






  • di andgiaim (utente non iscritto) data: 14/08/2012 11:49:55

    Ciao "Vecchio Frac"
    Ti allego un altro file in formato .xlsm del piccolo applicativo che voglio fare.
    Ho cambiato un po' il codice ma adesso mi si ripresenta un nuovo errore:

    Errore di Runtime '9':
    Indice non incluso nell'intervallo

    La riga del codice di errore evidenziato la trovi nel box "Codice VBA"
    Purtroppo non sono molto esperto nel vba.
    Spero che tu possa aiutarmi.
     
    Riga di codice d'errore evidenziata:
    
    ReDim Matrice(1 To Righe, 1 To Colonne)
    



  • di Vecchio Frac data: 14/08/2012 15:42:45

    Ti rispondo per come è impostato il foglio adesso, per l'errore che ti dà e una possibile soluzione.
    Ma l'intero modello è da rivedere, il codice può essere migliorato (soprattutto per la leggibilità).

    Quando attivi l'userform, lui cerca nel foglio "Registro" la zona dell'anagrafica cliente (non capisco perché parte da A5, che è la seconda riga della zona, invece che partire da A4 che sarebbe la prima). Se non ci sono dati inseriti, la zona risulta vuota. In particolare la variabile Righe viene impostata a zero (.Rows.Count vale 1 perché la zona è composta dalla sola cella di partenza A5 e poi gli si toglie uno). Quindi la successiva ReDim Matrice (1 To Righe) tenta di impostare un valore nella prima dimensione che sia minimo 1 massimo 0 e qui si inchioda :)
    Aggiungi l'If come ti mostro qui sotto e l'errore non si ripete.
    Solo che è da rivedere tutto l'impianto. Magari Vanni se ha seguito la pratica può intervenire con più cognizione. Ti si può aiutare, ma ci vuole del tempo per capire cosa si vuole ottenere.
    Purtroppo io non ho Office 2010 quindi non so se ci sono righe o colonna valorizzate oltre i limiti del mio Excel (che gestisce solo 256 colonne per 65535 righe, oltre a perdersi altre amenità aggiunte nelle nuove versioni).



     
    With Sheets("Registro").Range("A5").CurrentRegion
         Righe = .Rows.Count - 1
         
         If Righe < 1 Then Exit Sub
         
         Colonne = .Columns.Count
         ReDim Matrice(1 To Righe, 1 To Colonne)
    .
    .
    .
    End With






  • di andgiaim (utente non iscritto) data: 14/08/2012 18:04:58

    Ciao "Vecchio Frac",
    Ho appena modificato il codice VBA. Il problema stava infatti nella cella: A4 al posto di A5.
    Ho adesso riscontrato un altro problema. Non si tratta di un errore bensì dell'aggiornamento sulla riga sbagliata.
    Se selezione ade esempio l'ultima riga (nella ListBox1 ) non vengono visualizzati i dati nelle varie textbox e combobox e se clicco sul pulsante aggiorna si modifica la riga sottostante.
    Ti allego il file excel.
    Se puoi dargli un'occhiata

    Grazie



  • di Vecchio Frac data: 14/08/2012 20:54:50

    Io ti do volentieri una mano, ma dovresti metterci del tuo :)
    Il riferimento a iRow deve valorizzare le celle della riga corretta; quel iRow + 4 è sbagliato quanto lo era far aprtire l'aggiornamento da [a5] invece che da [a4]. Pertanto nell'evento click della listbox devi diminuire di uno il parametro riga, come ti mostro nel riquadro in basso.

    Dovresti però sforzarti di riordinare l'accozzaglia di codice che sta in questo povero file :)
    - Imposta Option Explicit all'inizio di ogni finestra di codice (e vedrai quanti altri errori ti salteranno fuori, ma ti salverà da errori di digitazione)
    - cura meglio l'indentazione del codice
    - molto codice è ridondante e superfluo (per esempio, per impostare alla lettera iniziale maiuscola tutti i textbox potresti sviluppare una funzioncina semplice semplice da richiamare quando serve, evitando codice in più)
    - potresti evitare molto codice anche impostando il tag dei controlli da azzerare o da predefinire e, con un ciclo For Each, eliminare del tutto il codice che controlla se un campo obbligatorio è stato compilato (basterà un semplice ciclo sui controlli con quel tag per vedere che siano compilati)
    - molte variabili potrebbero essere risparmiate utilizzando gli oggetit predefiniti

    ecc. :)
    Tutto questo non per smontarti, ma per spronarti a migliorare!
    Ora: raccogli le idee sul risultato finale, su quello che vuoi ottenere da Excel e produci un passo alla volta. Il resto verrà da sè anche con il nostro supporto! :)
     
    Private Sub ListBox1_Click()
    .
    .
    .
    iRow = riga + 3
    






  • di Vecchio Frac data: 14/08/2012 21:35:58

    E' antiestetico anche il fatto di poter selezionare la prima riga del ListBox, quella che contiene le intestazioni (e perchè non rendere visibile l'intestazione della listbox? mah)...
    Ecco come rimediare temporaneamente, in attesa di rivedere tutto, nel riquadro del codice.
     
    Private Sub ListBox1_Click()
        riga = ListBox1.ListIndex
        If riga = 0 Then Exit Sub      'se è selezionata la prima riga del listbox esci senza fare nulla
    .
    .
    .
    






  • di Vecchio Frac data: 14/08/2012 22:39:03

    Guarda, ho smanettato un po' :)
    Dai un'occhiata alla differenza nel codice.
    Mi sembra più compatto, più pulito e anche più leggibile, anche senza commenti.
    Ho pure aggiornato gli ordini di tabulazione delle diverse textbox nello userform, prima si saltava da un campo all'altro rischiando di perdersi :)
    Ovviamente il mio file è con Excel 2003; non dovresti avere problemi all'apertura.
    Buona spulciatura del codice ;)





  • di Vecchio Frac data: 15/08/2012 08:41:24

    Che poi, ci pensavo stamattina, forse non ti serve nemmeno l'userform, se quello che devi fare è controllare l'inserimento puoi farlo con un codice minimale e, per i dettagli, ad esempio gli elenchi nelle celle o la colorazione verdina sulla cella attiva, affidarti aagli strumenti propri di Excel (convalida dei dati, formattazione condizinale, ecc.). Il codice potrebbe essere minimo e ridursi ad esempio al posizionamento nella prima cella libera, al controllo del nome digitato, ecc.
    E' solo un'idea e forse ti semplifica la manutenzione... in fondo chi deve usare il tuo programma non sarà del tutto digiuno di Excel da non sapere come si digita in una cella ;)





  • di andgiaim (utente non iscritto) data: 18/08/2012 09:33:44

    Ciao "Vecchio Frac",

    Grazie tantissimo per il supporto! Le tue indicazioni mi hanno già risolto dei problemi che non riuscivo a trovare.
    Comunque non riesco a vedere l'allegato della penultima tua riposta in cui scrivi

    "Guarda, ho smanettato un po' :)
    Dai un'occhiata alla differenza nel codice."

    Grazie per l'aiuto



  • di Vecchio Frac data: 18/08/2012 21:26:08

    Non lo vedi perchè l'ho postato più di due giorni fa e quindi è stato eliminato dal sistema :)
    Lo riposto ed eventualmente te lo invio ad una casella di posta privata.