excel vba e gestione date

Anonimo
2017-09-14T10:07:07+00:00

Buon giorno a tutti,

premesso che non sono un esperto di VBA,

ho  un piccolo programma, trovato in internet, e adattato alle mie esigenze,  per modificare alcune voci tramite una userform.

Tutto funziona correttamente ma quando inserisco o modifico una data questa non viene correttamente gestita.

Inserendo/modificando, p.e. la data 06/03/2017, questa viene registrata come 03/06/2017.

Ho letto che le date in VBA seguono una "strada" diversa. Non sono riuscito  (meglio sarebbe dire non sono capace) a trovare una soluzione  per far rispettare il formato esatto inserito nella userform anche nel foglio di excel.

Qualcuno può aiutarmi?

Ringrazio.

Sergio

Link per il programma:

https://1drv.ms/x/s!Aj3IGrPU_k_ZhjPIyRsVXsG_tk32

Microsoft 365 e Office | Excel | Per la casa | Windows

Domanda bloccata. Questa domanda è stata eseguita dalla community del supporto tecnico Microsoft. È possibile votare se è utile, ma non è possibile aggiungere commenti o risposte o seguire la domanda.

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2017-09-20T09:49:17+00:00

Ciao Sergio,

La curiosità è la molla...della conoscenza.

Evviva la curiosità!

Avevo letto, nel web, che da excel 2010 avevano tolto l'oggetto calendario e quindi non avevo considerato tale evento.

Potresti scaricare il controllo calendario Qui al sito di Graham Mayor.

Ora hai stimolato la mia curiosità. 

Avrei trovato un articolo nel forum microsoft al seguente link:

https://answers.microsoft.com/it-it/office/wiki/office_2013_release-excel/excel-date-senza-il-controllo-activex-calendar-vba/7eb42157-ece0-4bda-af68-2a5364f383c7

Quel ottimo articolo di Fratello Mauro rappresenta un modo di gestire la mancanza del controllo Calendario dalle versioni più recenti di Excel. 

Hai una tua soluzione più semplice?

Credo che non ci sia modo più semplice o più robusto per immettere le date che un controllo calendario e, se fosse per me, vorrei sempre sfruttarlo!

Ci sono scaricabili anche altri controlli del tipo calendario. Ad esempio, uno creato da Jim Cone:

**http://www.contextures.com/exceldatepicker.html**

e un altro di Martin Green:

**http://www.fontstuff.com/vba/vbatut07.htm**

Comunque, se si trattasse di una versione di Excel a 64-bit, questi controlli non funzionerebbero. Tuttavia, in tal caso, potresti sfruttare il lavoro di Roberto Mensa, Gábor Madács e Krisztina Szabó:

https://sites.google.com/site/e90e50/calendar-control-class

Imparare è sempre stimolante.

Sono pienamente d'accordo!

===

Regards,

Norman

La risposta è stata utile?

0 commenti Nessun commento

9 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2017-09-19T06:14:52+00:00

    Ciao Norman,

    dopo diverse prove sul tuo programma ho capito il suo funzionamento e lo trovo sicuramente più semplice di quello che avevo scritto io.

    Per quanto riguarda il problema CDate ho capito il perché mi dava errore di Runtime come già scritto.

    Per quanto riguarda l'invitare l'utente ad inserire una data corretta e superare eventuali problemi ....

    avrei risolto con queste righe (dove esiste un textbox con delle date):

    If Me.TextBox5.Value = "" Then

        .Cells(lng, 6).Value = Me.TextBox5.Text

    ElseIf IsDate(Me.TextBox5.Text) Then

       .Cells(lng, 6).Value = CDate(Me.TextBox5.Text)

    Else

       MsgBox ("inserisci una data")

       Me.TextBox5.Value = ""

       TextBox5.SetFocus 

        Exit Sub   

    End If

    Da modificare in ogni textbox dove è presente una data. Ho provato a inserirla  anche nella tua versione del programma e funziona perfettamente.

    Ti ringrazio ancora dei tuoi suggerimenti che sono stati utili a risolvere il mio problema.

    Sergio

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  2. Anonimo
    2017-09-15T10:26:34+00:00

    Ciao Sergio,

    Avevo provato ad usare CDate ma mi dava un errore di Runtime e purtroppo non ho più la versione di quando avevo usato tale istruzione.

    Ricordo che mi dava tale errore quando introducevo un nuovo nominativo mentre nessun errore in caso di una modifica a nominativi già esistenti (considera  che il progetto che ti ho inviato è una parte di un programma gestionale molto più grande con possibilità di inserimento nominativi ex novo e/o modifica dei dati dei preesistenti).

    Attualmente, ho provato a risolvere il problema inserendo:

    Dim miadata as Date

    ....

     miadata = TextBox5.Text

    ....

     .Cells(lng, 6).Value = miadata

    e sembra funzionare comunque.

    Proverò a reintrodurre Cdate e vedere se riesco a ritrovare il famoso errore di Runtime.

    Credo che la funzione di conversione CDate funzioni in ogni versione di Excel.

    Se tu dovessi aver un problema con l'uso della funzione CDate, vorrei vedere il file poichè credo che di tratterebbe di in diverso problema.

    Comunque, hai provato il mio file di prova ?

    ===

    Regards,

    Norman

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  3. Anonimo
    2017-09-15T09:45:10+00:00

    Ciao Norman,

    ti ringrazio per i tuoi consigli.

    Avevo provato ad usare CDate ma mi dava un errore di Runtime e purtroppo non ho più la versione di quando avevo usato tale istruzione.

    Ricordo che mi dava tale errore quando introducevo un nuovo nominativo mentre nessun errore in caso di una modifica a nominativi già esistenti (considera  che il progetto che ti ho inviato è una parte di un programma gestionale molto più grande con possibilità di inserimento nominativi ex novo e/o modifica dei dati dei preesistenti).

    Attualmente, ho provato a risolvere il problema inserendo:

    Dim miadata as Date

    ....

     miadata = TextBox5.Text

    ....

     .Cells(lng, 6).Value = miadata

    e sembra funzionare comunque.

    Proverò a reintrodurre Cdate e vedere se riesco a ritrovare il famoso errore di Runtime.

    Per ora ti ringrazio tanto della tua attenzione e risoluzione.

    Sergio

    La risposta è stata utile?

    1 persona ha trovato utile questa risposta.
    0 commenti Nessun commento
  4. Anonimo
    2017-09-14T15:39:23+00:00

    Ciao Sergio,

    VBA parla solo una forma imbastardito di inglese, ossia americano, e quindi le date vengono interpretare come date nel formato ammericano mm/gg/aaaa.

    Pertanto per ovviare il problema che riscontri, nella procedura CommandButton1_Click(), potresti sostituire ili seguente comando 

                   .Cells(lng, 6).Value = Me.TextBox5.Text

    con:

                    .Cells(lng, 6).Value = CDate(Me.TextBox5.Text)

    Comunque, se fosse per me, per abbreviarla,  vorrei sostiuire la intera procedura

    Private Sub CommandButton1_Click()

        Dim lRisposta As Long

        Dim lRiga As Long

        Dim lng As Long

        

        lRisposta = MsgBox(Prompt:="Modificare il contenuto delle celle.", _

            Title:="Attenzione", _

            Buttons:=vbYesNo + vbQuestion)

        With sh

            If lRisposta = vbYes Then

                lRiga = .Range("B" & .Rows.Count).End(xlUp).Row

                For lng = 2 To lRiga

                    If CStr(.Cells(lng, 2).Value) = Me.ComboBox1.Text Then

                        .Cells(lng, 1).Value = Me.TextBox1.Text

                        .Cells(lng, 3).Value = Me.TextBox2.Text

                            .Cells(lng, 4).Value = Me.TextBox3.Text

                            .Cells(lng, 5).Value = Me.TextBox4.Text

                            .Cells(lng, 6).Value = Me.TextBox5.Text

                            .Cells(lng, 7).Value = Me.TextBox6.Text

                            .Cells(lng, 8).Value = Me.TextBox7.Text

                            .Cells(lng, 9).Value = Me.TextBox8.Text

                            .Cells(lng, 10).Value = Me.TextBox9.Text

                            .Cells(lng, 11).Value = Me.TextBox10.Text

                            .Cells(lng, 12).Value = Me.TextBox11.Text

                            .Cells(lng, 13).Value = Me.TextBox12.Text

                            .Cells(lng, 14).Value = Me.TextBox13.Text

                            .Cells(lng, 15).Value = Me.TextBox14.Text

                            .Cells(lng, 16).Value = Me.TextBox15.Text

                            .Cells(lng, 17).Value = Me.TextBox16.Text

                            .Cells(lng, 18).Value = Me.TextBox17.Text

                            .Cells(lng, 19).Value = Me.TextBox18.Text

                            .Cells(lng, 20).Value = Me.TextBox19.Text

                            .Cells(lng, 21).Value = Me.TextBox20.Text

                            .Cells(lng, 22).Value = Me.TextBox21.Text

                            .Cells(lng, 23).Value = Me.TextBox22.Text

                            .Cells(lng, 24).Value = Me.TextBox23.Text

                            .Cells(lng, 25).Value = Me.TextBox24.Text

                            .Cells(lng, 26).Value = Me.TextBox25.Text

                            .Cells(lng, 27).Value = Me.TextBox26.Text

                            .Cells(lng, 28).Value = Me.TextBox27.Text

                            .Cells(lng, 29).Value = Me.TextBox28.Text

                            .Cells(lng, 30).Value = Me.TextBox29.Text

                            .Cells(lng, 31).Value = Me.TextBox30.Text

                            

                            

                        Exit For

                    End If

                Next

            End If

        End With

    End Sub

    con:

    '=========>>

    Private Sub CommandButton1_Click()

        Dim lRisposta As Long

        Dim lRiga As Long

        Dim lng As Long, i As Long

        lRisposta = MsgBox(Prompt:="Modificare il contenuto delle celle.", _

                           Title:="Attenzione", _

                           Buttons:=vbYesNo + vbQuestion)

        With sh

            If lRisposta = vbYes Then

                lRiga = .Range("B" & .Rows.Count).End(xlUp).Row

                For lng = 2 To lRiga

                    If CStr(.Cells(lng, 2).Value) = Me.ComboBox1.Text Then

                        i = lng - (lng - 1 > 1)

                        For i = 1 To 30

                            Select Case i

                            Case 1: .Cells(lng, i).Value = _

                                             Me.Controls("TextBox" & i).Text

                            Case 5: .Cells(lng, i + 1).Value = _

                                             CDate(Me.Controls("TextBox" & i).Text)

                            Case Else: .Cells(lng, i - (i > 1)).Value = _

                                             Me.Controls("TextBox" & i).Text

                            End Select

                        Next i

                        Exit For

                    End If

                Next lng

            End If

        End With

    End Sub

    '<<=========

    Potresti scaricare il mio file di prova Sergio20170914.xlsm

    ===

    Regards,

    Norman

    La risposta è stata utile?

    0 commenti Nessun commento