Login Registrati
Stai vedendo 9 articoli - dal 1 a 9 (di 9 totali)
  • Autore
    Articoli
  • #46575 Score: 0 | Risposta

    frank_ciccio
    Partecipante
      3 pts

      Ciao a tutti.

      Questa macro è per inserire una data obbligatoria nella colonna B se viene modificato il range B:AO.

      E' possibile modificare la macro se viene inserito nella colonna B un valore diverso da una data si visualizzi un msgbox "errore valore non valido, inserire una data"

      Private Sub Worksheet_Change(ByVal Target As Range)
      
      '------------------------------------------------------------------------------
      'data obbligatoria_new
        
        Dim avviso As String, sSh As String
         
      
       'If Intersect(Target, Worksheets("convalida").Range("B7:AO66")) Is Nothing Then Exit Sub 'nei fogli
       If Intersect(Target, ActiveSheet.Range("B7:AO5000")) Is Nothing Then Exit Sub 'nei fogli
       
       
        'If Target.Cells.Count > 1 Then Exit Sub
           
          If Cells(Target.Row, 2) = "" Then
            Application.EnableEvents = False
            Cells(Target.Row, 2).Select
            Application.EnableEvents = True
            avviso = MsgBox("Manca la data nella cella < " & _
              Cells(Target.Row, 2).Address & " > !", vbCritical + vbOKOnly + vbDefaultButton2, "ERRORE!")
          End If
           
      
      '------------------------------------------------------------------------------
      
      End Sub
      
      Allegati:
      You must be logged in to view attached files.
      #46580 Score: 0 | Risposta

      Luca73
      Partecipante
        58 pts

        Ciao Io userei una macro fatta così in modo che alla fine la convalida sia interna allamacro stessa

         

        Sub pippo()
        Dim pluto
        pluto = InputBox("Inserire Data")
        On Error GoTo DataErr
            pluto = CDate(pluto)
        On Error GoTo 0
        msgbox pluto
        Exit Sub
        
        DataErr:
        pluto = InputBox("La data non è corretta inserire nuova Data")
        Resume
        End Sub
        
        #46581 Score: 0 | Risposta

        LucaSR
        Partecipante
          15 pts

          Ciao, non ho mai provato con le date, ma con la convalida dati c'è anche la possibilità di inserire in una cella "solo ed esclusivamente date"

          #46583 Score: 0 | Risposta

          frank_ciccio
          Partecipante
            3 pts

            Ciao Lucasr, c'è nella convalida dati l'opzione solo data come nell'allegato in questa risposta.

            Io chiedovo di aggiungere alla macro del post #46575 una convalida dati come nell'allegato di questa risposta.

            Allegati:
            You must be logged in to view attached files.
            #46585 Score: 0 | Risposta

            LucaSR
            Partecipante
              15 pts

              frank_ciccio ha scritto:

              E' possibile modificare la macro se viene inserito nella colonna B un valore diverso da una data si visualizzi un msgbox "errore valore non valido, inserire una data"

              Non ho aperto l'allegato, ma con la convalida dati puoi benissimo inserire un messaggio di errore come sopra 

              #46586 Score: 0 | Risposta

              frank_ciccio
              Partecipante
                3 pts

                Io chiedevo di abbinare, unire la convalida dati alla macro.

                #46588 Score: 0 | Risposta

                alexps81
                Moderatore
                  58 pts

                  Ovviamente va testato, ma secondo me dovresti modificare questa linea di codice:

                  If Cells(Target.Row, 2) = "" Then
                  

                  con questa:

                  If Not IsDate(Cells(Target.Row, 2)) Then
                  #46589 Score: 0 | Risposta

                  vecchio frac
                  Senior Moderator
                    272 pts

                    alexps81 ha scritto:

                    con questa:

                    If Not IsDate(Cells(Target.Row, 2)) Then

                    Prova a vedere cosa succede se il Target da testare contiene la stringa "31/02"   

                    ?isdate("31/02")
                    Vero

                    Del resto bisogna anche stare attenti che il valore non esprima un orario... risulta sempre una data valida

                    ?isdate("11:30")
                    Vero
                    
                    ?isdate("11/30")
                    Vero

                    E non solo IsDate accetta un formaot orario, ma lo accetta in molti formati. Uno dei quali prevede l'uso del punto come separatore, il che rende tutto ancora più una confusione (soprattutto se devi discriminare se l'input è solo numerico o anche una data):

                    ?isdate("11.30")
                    Vero
                    
                    ?isdate("30.11")
                    Falso

                     

                    #46591 Score: 0 | Risposta

                    alexps81
                    Moderatore
                      58 pts

                      Ok ho potuto testare...ed ovviamente hai ragione. Comunque le date sono una brutta bestia. Io di solito ci vado giù pesante e testo tutto con una Function...poi se ci sono metodi migliori ben vengano   

                      A questo punto io farei così:

                      In un modulo standard:

                      Option Explicit
                      
                      Function DataValida(ByVal data As String) As Boolean
                      Dim datePartes() As String
                      Dim giorno As Integer
                      Dim mese As Integer
                      Dim anno As Integer
                      
                      datePartes = Split(data, "/")
                      
                      If UBound(datePartes) <> 2 Then
                          DataValida = False
                          Exit Function
                      End If
                      
                      giorno = Val(datePartes(0))
                      mese = Val(datePartes(1))
                      anno = Val(datePartes(2))
                      
                      If mese < 1 Or mese > 12 Then
                          DataValida = False
                          Exit Function
                      End If
                      
                      If giorno < 1 Or giorno > Day(DateSerial(anno, mese + 1, 0)) Then
                          DataValida = False
                          Exit Function
                      End If
                      
                      DataValida = True
                      
                      End Function

                      mentre la nell'evento Change del foglio sostituirei questo rigo:

                      `If Cells(Target.Row, 2) = "" Then
                      `

                      con questo:

                      If DataValida(Cells(Target.Row, 2)) = False Then
                      

                      anzi modificherei il resto così:

                      ........
                      ........
                      ........
                          If DataValida(Cells(Target.Row, 2)) = False Then
                            Application.EnableEvents = False
                            Cells(Target.Row, 2).Select
                            avviso = MsgBox("Manca la data nella cella < " & _
                                     Cells(Target.Row, 2).Address & " > !", vbCritical + vbOKOnly + vbDefaultButton2, "ERRORE!")
                           Cells(Target.Row, 2) = ""
                            Application.EnableEvents = True
                          
                          End If
                      End Sub
                      
                    Login Registrati
                    Stai vedendo 9 articoli - dal 1 a 9 (di 9 totali)
                    Rispondi a: vba formato data
                    Gli allegati sono permessi solo ad utenti REGISTRATI
                    Le tue informazioni: