Partire da zero



  • Partire da zero
    di keroba79 data: 29/01/2014 18:42:31

    Salve a tutti ragazzi, mi sono appena iscritto per tuffarmi in questo mondo che mi affascina tantissimo.
    Premetto che ho iniziato a leggere il codice vba da zero provando a fare esperimenti trovati qua e la nel web..... ma con scarsi risultati.
    Credo che sia più opportuno iniziare a creare qualcosa da zero e cercare di capire "cosa" si sta creando.
    Vengo al dunque..!!
    Vorrei fare questo esercizio con excel vorrei creare una "userform" con un pulsante che una volta cliccato mi registri in una tabella la data e l'ora attuale e cliccando nuovamente il pulsante registri il dato in una riga successiva.
    Vorrei che i dati che verranno registrati non siano modificabili.

    Credo che non sia complicato e confido in un vostro aiuto per una lezione aggiuntiva.
    Grazie anticipatamente keroba79 excel2010



  • di patel data: 29/01/2014 18:56:46

    www.homeandlearn.org/index.html





  • di keroba79 (utente non iscritto) data: 30/01/2014 23:10:58

    Grazie per il link e per tutto il corso in vba purtroppo in inglese " so perfettamente che il linguaggio vba è in questa lingua" ma ho ben altri siti dove imparare tutti in italiano certo non ti aiutano a fare un po di pratica come io avevo richiesto.
    Evidentemente avete altri problemi da risolvere grazie lo stesso.!!

    p.s. al forum manca una voce per cancellare l'iscrizione



  • di mister_x (utente non iscritto) data: 31/01/2014 00:56:59

    ciao

    www.archi.forumup.it/forum-15-archi.html

    troverai delle lezioni di Alexsandra in italiano (16) per iniziare da 0

    saluto Alexsandra per il suo contributo dato nel realizzare le lezioni,





  • di keroba79 (utente non iscritto) data: 13/02/2014 22:30:21

    Salve di nuovo a tutti grazie all'aiuto di mister_x sono riuscito ad implementare piccoli studi riguardo il vba.
    In allegato ho postato il file excel su cui sto facendo delle prove vi spiego in breve come dovrebbe funzionare:
    nel foglio1 c'è un pulsante che se cliccato, apre una userform.
    nel foglio2 ci sono 2 tabelle una per ingresso e una per uscita
    la userform ha due label di descrizione ingresso e uscita con relativi commandbutton, un calendario a comparsa per selezionare il giorno e l'ora attuale del sistema.

    Diciamo che "Grezzamente" funziona dal bottone del foglio uno si apre la userform e cliccando sul commandbutton1 dell'ingresso mi riporta i dati nella tabella relativa.

    Ora la mia domanda è questa: vorrei che cliccando successivamente sul commandbutton1 venga compilata la seconda riga della stessa tabella.

    ho provato in vari modi ma non riesco a capire come fare.

    Grazie anticipatamente



  • di Vecchio Frac data: 13/02/2014 22:47:18

    Ciao keroba79,
    patel è sempre di poche parole, dote che a me manca perchè di solito sono molto prolisso ^_^
    Il punto forte di patel è inoltre la sua capacità di scovare sempre link interessanti.
    Il fatto che si debba masticare un po' di inglese, purtroppo è una costante che ritroverai spesso nel tuo percorso di studio. I siti di riferimento sono in inglese (stackoverflow, cpearson, ecc.) e quindi dobbiamo fare i conti con questa realtà.
    Vorrei anche ricordare (un po' a tutti) che il punto cruciale non è di "avere altri problemi da risolvere": l'attività del forum è di puro volontariato e nessuno qui è stipendiato per offrire consulenza; alle volte capita di non ricevere risposta subito, e bisogna solo aver pazienza. Magari corredando le proprie richieste con particolari aggiuntivi.
    Nel tuo caso sei stato esauriente nell'esporre sia la premessa che l'esigenza.
    Occorre quindi avere solo un attimo di fiducia ^_^

    Nel merito del tuo problema specifico, cioè ricavare la prima cella disponibile su cui inserire i dati, considera che ci sono diversi metodi. Uno dei più frequenti è simulare la pressione del tasto End (Fine su tastiera italiana)-freccia giù, per posizionare il cursore sull'ultima cella disponibile, quindi farlo risalire a ritroso sulla colonna interessata con lo stesso mezzo (End-freccia su). In tal modo otterrai la posizione dell'ultima cella valorizzata (puristi attenzione! ho detto che è solo uno dei metodi ^_^).

    Vuoi provare a immaginare il resto? ^_^

    @patel
    in effetti qualche volta qualche parola di accompagnamento la puoi aggiungere :D
     
    'un modo, e neanche il più elegante:
    last_row = sheets(1).cells(sheets(1).rows.count,1).end(xlup).row






  • di patel data: 14/02/2014 08:12:00

    VF
    io sono fatto così, ma non sono permaloso, se vorrai aggiungere commenti ai miei interventi saranno ben graditi





  • di keroba79 (utente non iscritto) data: 17/02/2014 19:54:07

    Eccomi di nuovo qui volevo intanto ringraziare "vecchi frac" per l'aiuto ho utilizzato il tuo codice in maniera simile e funziona.
    Adesso ho altri 2 quesiti semplici "credo" dopodichè per me è risolto.
    1* Cliccando sul pulsante che si trova nel foglio 1 parte la userform ma se clicco su commandbutton1 va in errore, cosa che non fa se vado sul foglio2.
    2* Ho una textbox1 con l'orario del sistema e un DTPicker1 per la data da selezionare, la tabella che ho nel foglio2 "dove riportare i dati" è divisa per data e ora, il codice postato qui sotto è relativo alla data.
    Come faccio a inserire anche l'orari nella stessa tabella?

    E come al solito grazie in anticipo
    Allego il file con il nome keroba79
     
    Private Sub CommandButton1_Click()
    Dim lRiga As Long
    With Worksheets("Foglio2")
    lRiga = .Range("b" & Rows.Count).End(xlUp).Row
    .Cells(lRiga + 1, 2).Select
    Cells(lRiga + 1, 2).Value = DTPicker1
    End With
    End Sub



  • di Vecchio Frac data: 17/02/2014 20:34:43

    Hai referenziato un oggetto che manca sul mio pc quindi non sono in grado di avviare correttamente il progetto.

    1) Comunque dovresti riportarci l'errore (cit. "se clicco su commandbutton1 va in errore"), il codice, la descrizione e dove si ferma.
    A naso manca un punto prima di Cells:
    Cells(lRiga + 1, 2).Value = DTPicker1
    dovrebbe essere
    .Cells(lRiga + 1, 2).Value = DTPicker1
    Alle volte un punto fa la differenza :)

    2) non potendo provare non posso sparare a caso. Forse DTPicker contiene in sè anche le informazioni sull'orario. Se formatti il risultato del DTPicker con Format(DTPicker1, "hh:nn") ottieni ora e minuti o no?





  • di keroba79 (utente non iscritto) data: 17/02/2014 20:56:11

    Allora l'errore me lo da solo se clicco il pulsante di avvio della userform del foglio1 cosa che non accade se vado nel foglio2, e avvio la funzione da progetto del vba il codice compila perfettamente la tabella.
    l'errore che mi da è questo:
    Errore di run-time '1004':
    Errore nel metodo Select per la classe Range.

    Il DTPicker non mi restituisce l'orario come formattazione, e l'ora è in una textbox dovrei solo includere il codice in quello che già c'è.
    In pratica cliccando sul pulsante deve compilare due eventi.
    Compilare la data del DTPicker nella colonna "b"
    Compilare l'orario nella colonna "c"

    Grazie "VFrac"



  • di Vecchio Frac data: 17/02/2014 21:51:30

    1) Secondo me manca il punto prima di Cells.
    Inoltre non serve preselezionare il range, puoi assegnargli direttamente il valore.

    2) Secondo me il DTPicker contiene anche informazioni sull'ora, comunque dovrei verificarlo.
    cit. "una volta cliccato mi registri in una tabella la data e l'ora attuale": tu vuoi inserire l'ora del momento attuale.
    L'istruzione Now() contiene un riferimento alla data e all'ora attuale.
    Quindi in colonna C imposti Now() da cui prelevi solo ora e minuti nel formato che vuoi (quello che allego è solo un esempio per indicarti come potresti fare).

    p.s. nota che DTPicker non ti serve... "FormatDateTime(Now(), vbShortDate)" assolve egregiamente allo scopo.

     
    Private Sub CommandButton1_Click()
    Dim lRiga As Long
        With Worksheets("Foglio2")
            lRiga = .Range("b" & Rows.Count).End(xlUp).Row
            .Cells(lRiga + 1, 2).Value = DTPicker1
            .Cells(lRiga + 1, 3).Value = FormatDateTime(Now(), vbShortTime)
        End With
    End Sub






  • di keroba79 (utente non iscritto) data: 19/02/2014 03:37:51

    Volevo ringraziare vecchio frac per aver risolto il mio problema posto il codice ho sostituito solo la textbox1 perchè mi riporta in visualizzazione l'ora corrente.
     
    Private Sub CommandButton1_Click()
    Dim lRiga As Long
        With Worksheets("Foglio2")
            lRiga = .Range("b" & Rows.Count).End(xlUp).Row
            .Cells(lRiga + 1, 2).Value = DTPicker1
            .Cells(lRiga + 1, 3).Value = TextBox1
        End With
    End Sub
    Private Sub CommandButton2_Click()
    Dim lRiga As Long
        With Worksheets("Foglio2")
            lRiga = .Range("e" & Rows.Count).End(xlUp).Row
            .Cells(lRiga + 1, 5).Value = DTPicker1
            .Cells(lRiga + 1, 6).Value = TextBox1
        End With
    End Sub



  • di Vecchio Frac data: 19/02/2014 13:36:30

    Poichè sei partito da zero e ti stai muovendo, mi pare, molto bene, mi sento di darti uno spunto di miglioramento.
    Hai scritto sostanzialmente lo stesso codice per i due commandbutton, duplicandolo (o meglio, replicandolo), in modo da svolgere essenzialmente lo stesso compito: potresti creare una sottoprocedura con parametro da attivare alla pressione dei due command button. La sottoprocedura viene informata su quale command button sia stato premuto (passaggio di parametro) e si comporta di conseguenza in modo leggermente differenziato.

    Il concetto è:
    - per ogni commandbutton gestirne l'evento "click"
    - indipendentemente di quale commandbutton sia stato cliccato, eseguire lo stesso pezzo di codice
    - in funzione di quale commandbutton sia stato cliccato, eseguire l'operazione specifica

    In attuazione:
    - vedi codice seguente.
    La parte con IIf nella nuova sub che ho inserito è quella che decide in quale colonna sistemare il dato, in funzione del parametro "i" passato (che identifica il commandbutton premuto).
    Si potrebbe fare i difficili e pensare a un array di controlli, ma non voglio adesso confondere le nozioni.

     
    Option Explicit
    
    Private Sub CommandButton1_Click()
        Call inserisci_data_ora(1)
    End Sub
    
    Private Sub CommandButton2_Click()
        Call inserisci_data_ora(2)
    End Sub
    
    Private Sub inserisci_data_ora(i as integer)
    Dim lRiga As Long
        With Worksheets("Foglio2")
            lRiga = .Range("b" & Rows.Count).End(xlUp).Row
            .Cells(lRiga + 1, IIf(i = 1, 2, 5)).Value = DTPicker1
            .Cells(lRiga + 1, IIf(i = 2, 3, 6)).Value = TextBox1
        End With
    End Sub






  • di keroba79 (utente non iscritto) data: 20/02/2014 22:29:59

    File allegato Accesso ingressi keroba79
    Grazie vecchio frac sempre puntuale e chiaro con le tue risposte mi sono appuntato il codice e l'ho anche provato essendo un pivellino non ci sarei mai arrivato.
    Tornando a noi nel file allegato tutto il progetto che ho fatto ma mi sono tenuto sul mio codice anche per capire bene.
    Adesso ho un problema per accedere alla registrazione degli orari ogni utente si logga con user e pass, per questo ho creato una seconda userform per le credenziali e se l'accesso va a buon fine con il comando show mi parte la form delle registrazioni orari.
    Il problema sta nel fatto che quando si avvia la seconda form, non mi visualizza l'orario attuale e andando a vedere il debug il codice che mi evidenzia è questo:
    Application.OnTime Now + TimeSerial(0, 0, 1), "ColorText", , False
    Ho messo un piccolo pulsante nella cella "A" riga "100" per richiamare il tutto "solo per recuperare dagli errori fatti", se faccio partire il tutto da questo pulsante funziona tutto e mi visualizza anche l'orario.
    Vorrei sapere come risolvere senza questo pulsante.
    Poi volevo chiederti se era possibile in base a chi effettua il log di registrare il proprio nome affianco alla registrazione degli orari del foglio2.
    Grazie in anticipo.
    p.s. per accedere " user:accesso1 pass:0000 ma se vai nel codice puoi vederlo benissimo.
    Excel 2010



  • di Vecchio Frac data: 21/02/2014 20:24:00

    cit. "Il problema sta nel fatto che quando si avvia la seconda form, non mi visualizza l'orario attuale"
    ---> Il codice di avvio dell'userform è sbagliato: in Excel (a differenza di Access per esempio) il form non viene caricato con l'evento Load ma con l'evento Initialize.
    Oltretutto il nome della textbox era sbagliato (textbox2 nel form si chiama textbox1).
    Inoltre attenzione, perchè Option Explicit non va messo in mezzo al codice, a caso, ma deve essere la prima riga della finestra di codice.

     
    'codice di userform1
    'non Private Sub Form_Load() ma:
    Private Sub userform_initialize()
        Me.TextBox1.Text = Format(Now, "DD/MM/YYYY")
    End Sub