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

    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

        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

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

          #46588 Score: 0 | Risposta

          alexps81
          Moderatore
            55 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
                55 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: