calendario in cella excel

Anonimo
2016-07-09T09:08:59+00:00

ciao a tutti

vorrei velocizzare l'immissione di date in un foglio di excel e ho pensato a 2 soluzioni:

  • al posto di scrivere 09/07/2016 vorrei scrivere 09072016 e il programma dovrebbe in automatico riconoscere la data.
  • quando una cella è selezionata, combinazione di tasti e che compaia un calendario da cui scegliere una data.

cosa mi suggerite?

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
2016-07-17T06:52:18+00:00

Ma stai seguendo la procedura qui sotto(in inglese)?

E, come ti è già stato consigliato, c'è anche questo:

o la semplice, banale UserForm proposta nel mio (lontano....) primo post:

La risposta è stata utile?

0 commenti Nessun commento
Risposta accettata dall'autore della domanda
Anonimo
2016-07-09T14:07:29+00:00

Ciao gtsolid,

vorrei velocizzare l'immissione di date in un foglio di excel e ho pensato a 2 soluzioni:

  • al posto di scrivere 09/07/2016 vorrei scrivere 09072016 e il programma dovrebbe in automatico riconoscere la data.
  • quando una cella è selezionata, combinazione di tasti e che compaia un calendario da cui scegliere una data.

cosa mi suggerite? 

Ti sconsiglio il primo approccio.

Prova ad inserire un controllo calendario, dai controlli ActiveX, sul foglio e nel modulo di codice del foglio. incolla il segente codice:

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

Option Explicit

'--------->>

Private Sub Calendar1_Click()

    With ActiveCell

        .Value = CDbl(Calendar1.Value)

        .NumberFormat = "mm/dd/yyyy"

        .Select

    End With

End Sub

'--------->>

Private Sub Worksheet_SelectionChange(ByVal Target As Range)

    Dim Rng As Range

    Const mioIntervallo As String = "A1:A30"                 '<<=== Modifica

    If Target.Cells.Count > 1 Then

        Exit Sub

    End If

    Set Rng = Me.Range(mioIntervallo)

    With Calendar1

        If Not Application.Intersect(Rng, Target) Is Nothing Then

            .Left = Target.Left + Target.Width - Calendar1.Width

            .Top = Target.Top + Target.Height

            .Visible = True

            .Value = Date

        ElseIf .Visible Then

            .Visible = False

        End If

    End With

End Sub

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

Cliccando sulla cella (diciamo) A10, se vedrebbe qualcosa del genere:

![](http://fud.community.services.support.microsoft.com/Fud/FileDownloadHandler.ashx?fid=c2e409c7-200a-41c8-8d08-98857732e1d2)

Potresti scaricare il mio file di esempio Gtsolid20160709.xlsm a:

https://www.dropbox.com/s/69cio917kh4twrm/Gtsolid20160709.xlsm?dl=0

===

Regards,

Norman

![](http://fud.community.services.support.microsoft.com/Fud/FileDownloadHandler.ashx?fid=080b1f2a-fb91-4e40-90d5-86aa09f2e296)

La risposta è stata utile?

0 commenti Nessun commento

52 risposte aggiuntive

Ordina per: Più utili
  1. Anonimo
    2016-07-10T16:17:24+00:00

    Dopo la fine della tappa del tuor :-)

    Ho provato qualche data strana ed errata ad esempio nel mese e purtroppo si ricade nel problema che excel riconosce come data americata.

    Es. 011516 o 01152016 che dovrebbe dare errore ma viene trasformata in 15/01/2016.

    Quindi occorre anche una verifica che la variabile MM sia compresa tra 1 e 12 prima di comporre la data.

    Avrei pensato che si potrebbe aggiungere dopo la riga:

    MM = Mid(StringaData, 3, 2)

    la seguente riga:

     If MM < 1 Or MM > 12 Then Err.Raise 13

    per fare in modo che venga creato un errore rilevato dalla successiva fase di controllo.

    La risposta è stata utile?

    0 commenti Nessun commento
  2. Anonimo
    2016-07-10T12:51:46+00:00

    Visto he il problema della data "breve" (ggmmaa) è dato dal fatto che viene convertita in formato americano ho pensato, prendendo spunto dalla userform dell'esempio linkato da Mauro che impone un anno di quattro caratteri), di fare in modo che l'anno breve diventi lungo inserendo un suffisso.

    A tale scopo ho creato una function che, a meno di non aver sbagliato gli anni, si comporta come farebbe excel in caso di inserimento di data breve gg/mm/aa (se non sbaglio per valori compresi tra 00 e 29 antempone il 20 (anni duemila) altrimenti antempone il 19 (anni 1900).

    A questo punto dichiaro la variable Data come Date e se da errore il tutto viene passato alla condizione If Err.Number <> 0 then.

    Ho anche, in verità, creto una routine apposita da lanciare con l'evento change dopo aver dichiarato una variabile a livello di modulo.

    In questo modo penso sia più flessibile gestire quando lanciare il "convertitore" di data.

    Facendo qualche prova mi pare che si risolva il problema di date errate nel senso che non rappresentano una data valida (ovviamente non quello di inserimento da parte una data sbagliata rispetto alla data che avrebbe dovuto inserire).

    Questo il codice modificato (se avete voglia di provarlo ovviamente)

    '----

    Option Explicit

    Dim rngTarget As Range

    Private Sub Worksheet_Change(ByVal Target As Range)

      Const Cella1 As String = "A1"

      Dim cTrg As Range, i As Long

      On Error GoTo Esci

      With Application

        .EnableEvents = False

        .ScreenUpdating = False

      End With

        If Target.Row > Me.Range(Cella1).Row And _

         Target.Column = Me.Range(Cella1).Column Then

          If Target.Rows.Count = 1 Then

            Set rngTarget = Target

            Call InserimentoSemplificatoDate

          Else

            i = 0

            For Each cTrg In Target.Cells

              i = i + 1

              Set rngTarget = Target.Cells(i, 1)

              Call InserimentoSemplificatoDate

            Next cTrg

          End If

        End If

    Esci:

      With Application

        .EnableEvents = True

        .ScreenUpdating = True

      End With

    End Sub

    Sub InserimentoSemplificatoDate()

      'da richiamare con l'evento Worksheet_Change

      'Inserimento date facilitato

      'Inserire le date in formato ggmmaa o ggmmaaa o nei normali formati data

      'Le celle devono essere formattate come testo

      'rngTarget rappresenta l'oggetto Target dell'evento Worksheet_Change

      'tale variabile è da dichiarare tra le prime righe del modulo del relativo foglio

      Dim AnnoLimite As Integer

      Dim StringaData As String

      Dim GG As String, MM As String, AA As String, iAA As String

      Dim Data As Date

      Dim NunChrAnno As Integer

      On Error GoTo Esci

      AnnoLimite = 2016

          StringaData = rngTarget.Value

          If StringaData = "" Then GoTo Esci

          If Not IsDate(StringaData) Then

            If Len(StringaData) <> 6 And Len(StringaData) <> 8 Then

              MsgBox "Data errata", vbExclamation, "Data"

              rngTarget.Value = Empty

              GoTo Esci

            End If

            If Len(StringaData) = 6 Then

              NunChrAnno = 2

            ElseIf Len(StringaData) = 8 Then

              NunChrAnno = 4

            End If

            GG = Mid(StringaData, 1, 2)

            MM = Mid(StringaData, 3, 2)

            AA = PrefissoAnnoBreve(Mid(StringaData, 5, NunChrAnno)) & Mid(StringaData, 5, NunChrAnno)

            Data = CDate(GG & "/" & MM & "/" & AA)

          Else

            Data = rngTarget.Value

          End If

          If IsDate(Data) And Year(Data) >= AnnoLimite Then '<--- nel mio caso la condizione Year(Data) è solo =

            rngTarget.Value = Format(CDate(Data), "dd/mm/yyyy")

          Else

            MsgBox "Anno errato", vbExclamation, "Data"

            rngTarget.Value = Empty

          End If

    Esci:

      If Err.Number <> 0 Then

      Debug.Print Err.Number, Err.Description

        MsgBox "Data errata", vbExclamation, "Data"

        rngTarget.Value = Empty

      End If

    End Sub

    Function PrefissoAnnoBreve(sAnnoBreve As String) As String

      If Len(sAnnoBreve) = 2 Then

        If sAnnoBreve >= "00" And sAnnoBreve <= "29" Then

          PrefissoAnnoBreve = "20"

        Else

          PrefissoAnnoBreve = "19"

        End If

      End If

    End Function

    '---

    p.s. ho fatto anche una modifica che se le righe in cui vengono inserite le date sono più di una (Ctrl+Invio) la procedura le compili tutte. E' una cosa che va oltre la richiesta ma, visto che stavo rimaneggiando, ho voluto provare questa cosa :-)

    Ovviamente si può impostare che se il numero di righe sia più di una la procedura venga saltata o eseguita altra azione (così come ho lasciato che in caso di più colonne target il tutto passi per Err.Number <> 0).

    La risposta è stata utile?

    0 commenti Nessun commento
  3. Anonimo
    2016-07-10T12:08:58+00:00

    Ciao Mauro,

    sempre per pura discussione il problema da te sollevato è però diverso e cioè l'aver indicato una data diversa da quella che invece avresti dovuto inserire.

    Ma questo può accadere anche inserendo una data in formato normale o utilizzando la form (anche se forse l'attenzione che richiederebbe nel scegliere giorno mese e anno renderebbe meno probabile l'evento).

    Devo inserire 02/05/2016 e invece inserisco 03/05/2016. Ho sbagliato a inserire data e probabilmente nessun controllo può accorgersene (o meglio potrei fare un controllo che non sia una data precedente ad una data successiva eventualmente inserita come avviene sempre ad es. nelle date di registrazione dei programmi contabili) se non una successiva verifica di cosa sono andato ad inserire.

    Ma, se guardiamo al problema dell'utente nello specifico, cioé il velocizzare l'inserimento delle date probabilmente l'inserimento in formato tradizionale, soprattutto se le date sono tante  e magari in mesi differenti se non in anni, richiederebbe minor tempo rispetto all'inserimento con userform o tramite il calendario (e non risolverebbe del tutto il problema di inserire una data piuttosto che un'altra).

    Comunque guardando l'esempio della userform forse mi è venuta in mente un'idea per controllare almeno il numero di giorni superiore a quello ammesso per un mese :-)

    Visto che oggi niente mare vedo se riesco a cavare un minuscolo ragnetto dal buco (anche perché a dire il vero con le date non sono mai stato bravissimo :D )

    La risposta è stata utile?

    0 commenti Nessun commento