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

    frank_ciccio
    Partecipante
      3 pts

      Ciaoa a tutti.

      Nel workbook allegato c'è una macro per inserire nel range B7:D17 celle obbligatorie.

      Se scrivo in una cella a dx e a sx è vuota dà errore.

      Private Sub Worksheet_SelectionChange(ByVal Target As Range)
      'obbligo dati cella precedente
      
      Dim avviso As String
      
      If Intersect(Target, Worksheets("home").Range("B6:D17")) Is Nothing Then Exit Sub
      
      
      
      If Target.Cells.Count > 1 Then Exit Sub
      
      
      '-----------------------------------------------------------
      'sx/dx
      
      Application.EnableEvents = False
      If Target.Offset(0, -1) = "" Then
      Target.Offset(0, -1).Select
      If ActiveCell.Column = 1 And Target.Offset(0, -1).Value = "" Then ActiveCell.Offset(0, -1).Select
      
      avviso = MsgBox("Inserire prima i dati nella cella precedente < " _
      & Target.Offset(0, -1).Address & " >!", vbCritical + vbOKOnly + vbDefaultButton2, "ERRORE")
                       
      
      End If
      
      Application.EnableEvents = True
      
      '-----------------------------------------------------------
      'alto/basso
      
      'Application.EnableEvents = False
      'If Target.Offset(0, 1) = "" Then
      'Target.Offset(0, 1).Select
      'If ActiveCell.Column = 1 And Target.Offset(0, 1).Value = "" Then ActiveCell.Offset(0, 1).Select
      
      'avviso = MsgBox("Inserire prima i dati nella cella precedente < " _
      '& Target.Offset(0, 1).Address & " >!", vbCritical + vbOKOnly + vbDefaultButton2, "ERRORE")
                       
      
      'End If
      
      'Application.EnableEvents = True
      
      '-----------------------------------------------------------
      
      End Sub

      chiedo una modifica per celle obbligatorie da alto in basso.

      Se scivo in B8 e B9 deve dare errore.

      Spero di essermi spiegato.

      Grazie

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

      frank_ciccio
      Partecipante
        3 pts

        Ho corretto la macro per celle dall'alto in basso nel workbook allegato

        '-----------------------------------------------------------
        'alto/basso
        
        Application.EnableEvents = False
        If Target.Offset(-1, 0) = "" Then
        Target.Offset(-1, 0).Select
        If ActiveCell.Column = 1 And Target.Offset(-1, 0).Value = "" Then ActiveCell.Offset(-1, 0).Select
        
        avviso = MsgBox("Inserire prima i dati nella cella precedente < " _
        & Target.Offset(-1, 0).Address & " >!", vbCritical + vbOKOnly + vbDefaultButton2, "ERRORE")
        
        End If
        
        Application.EnableEvents = True
        
        '-----------------------------------------------------------

        c'è un piccolo problema.

        Se scrivo in C9 si sposta in C8 e poi in C8 dovrebbe restare in B9

        Se scrivo in B10 si sposta in C10 e va bene,

        Si può correggere?

        Grazie

         

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

        LukeReds
        Partecipante
          19 pts

          ciao che significa

          Se scrivo in C9 si sposta in C8 e poi in C8 dovrebbe restare in B9

           

          #54999 Score: 0 | Risposta

          alexps81
          Moderatore
            58 pts

            Ciao @frank_ciccio anche io sto facendo fatica a comprendere ciò che hai descritto.

            Mi viene da pensare che tu voglia semplicemente obbligare a compilare le celle nell'area "B6:D17" riga per riga e colonna per colonna.

            Chiarisco con un esempio:

            Se "B6" è compilata allora potrai compilare "C6" ma non potrai scrivere in "B7" finché "D6" è vuota....giusto?

            Quindi prima compili tutta la riga poi puoi passare a quella successiva. Ma anche la riga deve essere compilata seguendo una regola, ovvero da destra verso sinistra.

            Comunque io eviterei l'evento SelectionChange ma mi affiderei al Change.

            Prova a vedere se questa macro va bene:

            Private Sub Worksheet_Change(ByVal Target As Range)
                Dim area As Range, c As Range
            
                Set area = Range("B6:D17")
            
                If Intersect(Target, area) Is Nothing Then Exit Sub
                If Target.CountLarge > 1 Then Exit Sub
            
                On Error GoTo SafetyExit
            
                Application.EnableEvents = False
            
                For Each c In area
                    If c.Address = Target.Address Then Exit For
            
                    If Trim(c.Value & vbNullString) = vbNullString Then
            
                        MsgBox "Inserire prima i dati nella cella < " & _
                               c.Address(False, False) & " >!", _
                               vbCritical, "Errore"
            
                        Target.ClearContents
                        c.Select
                        Exit For
                    End If
                Next c
            
            SafetyExit:
                Application.EnableEvents = True
            End Sub

            La macro scorre ogni cella dell'area "B6:D17". Quando la cella ciclata arriva alla cella selezionata allora il ciclo si interrompe. Controllerà se ci sono celle vuote, a quel punto interrompe il ciclo e seleziona la cella vuota e mostra il messaggio.

            #55001 Score: 0 | Risposta

            frank_ciccio
            Partecipante
              3 pts

              Grazie alexps81 penso sia esatto.

              La devo provare in un workbook più grande.

              Grazie ancora

              #55003 Score: 0 | Risposta

              frank_ciccio
              Partecipante
                3 pts

                Ciao alexps81.

                Ho provato la macro e nel workbook c'è una convalida dati nelle celle C6:D17

                La macro funziona ma se scrivo del testo in queste celle il msgbox compare 2 volte.

                E' possibile che compaia solo una volta oppure il messaggio il primo "solo numeri"?

                Spero di essermi spiegato.

                Grazie ancora

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

                alexps81
                Moderatore
                  58 pts

                  A questo punto risolverei tutto tramite VBA: convalida dati e controllo celle vuote. Rimuovi quella convalida che controlla l'inserimento dei soli valori numerici in colonne C e D, poi sostituisci la macro precedente con questa nuova:

                  Option Explicit
                  
                  Private Sub Worksheet_Change(ByVal Target As Range)
                      Dim area As Range, c As Range
                  
                      Set area = Range("B6:D17")
                  
                      If Intersect(Target, area) Is Nothing Then Exit Sub
                      If Target.CountLarge > 1 Then Exit Sub
                  
                      On Error GoTo SafetyExit
                  
                      Application.EnableEvents = False
                      
                      If Target.Column >= 3 And Target.Column <= 4 Then
                          If Trim(Target.Value & vbNullString) <> vbNullString Then
                              If Not IsNumeric(Target.Value) Then
                                  MsgBox "Nelle colonne C e D è consentito solo valori numerici.", vbCritical, "Errore"
                                  Target.ClearContents
                                  GoTo SafetyExit
                              End If
                          End If
                      End If
                      
                      For Each c In area
                          If c.Address = Target.Address Then Exit For
                  
                          If Trim(c.Value & vbNullString) = vbNullString Then
                  
                              MsgBox "Inserire prima i dati nella cella < " & _
                                    c.Address(False, False) & " >!", _
                                     vbCritical, "Errore"
                                     
                              Target.ClearContents
                              c.Select
                              Exit For
                          End If
                      Next c
                  
                  SafetyExit:
                      Application.EnableEvents = True
                  End Sub
                  #55006 Score: 0 | Risposta

                  frank_ciccio
                  Partecipante
                    3 pts

                    Grazie alexps81

                    #55007 Score: 0 | Risposta

                    frank_ciccio
                    Partecipante
                      3 pts

                      Ciao alexps81.

                      La macro funziona è possibile una piccola modifica, se possibile?

                      1) Ora nell'allegato se scrivo in B14 mi dice inserire prima i dati in B11 e va bene

                      2) Scrivo un valore numero nelle celle rosa B14 e mi dice nserire prima i dati in B11 e va bene

                      3) Scrivo un valore testo nelle celle rosa B14 e mi dice nelle colonne D/C è consentito solo valori numerici e va bene

                      Qui come nell0opzione 2 dovrebbe spostarsi in B11

                      Spero di essermi spiegato.

                      Grazie

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

                      alexps81
                      Moderatore
                        58 pts

                        Basta invertire i controlli:

                        sposta questa parte tra Next c e SafetyExit:

                            If Target.Column >= 3 And Target.Column <= 4 Then
                                If Trim(Target.Value & vbNullString) <> vbNullString Then
                                    If Not IsNumeric(Target.Value) Then
                                        MsgBox "Nelle colonne C e D è consentito solo valori numerici.", vbCritical, "ERRORE"
                                        Target.ClearContents
                                        GoTo SafetyExit
                                    End If
                                End If
                            End If
                        
                        #55011 Score: 0 | Risposta

                        frank_ciccio
                        Partecipante
                          3 pts

                          Ciao,

                          spostato parte di macro ma non compare più avviso

                          Nelle colonne C e D è consentito solo valori numerici.

                           

                          Private Sub Worksheet_Change(ByVal Target As Range)
                              Dim area As Range, c As Range
                          
                              Set area = Range("B6:D17")
                          
                              If Intersect(Target, area) Is Nothing Then Exit Sub
                              If Target.CountLarge > 1 Then Exit Sub
                          
                              On Error GoTo SafetyExit
                          
                              Application.EnableEvents = False
                              
                              
                              
                              For Each c In area
                                  If c.Address = Target.Address Then Exit For
                          
                                  If Trim(c.Value & vbNullString) = vbNullString Then
                          
                                      MsgBox "Inserire prima i dati nella cella < " & _
                                            c.Address(False, False) & " >!", _
                                             vbCritical, "Errore"
                                             
                                      Target.ClearContents
                                      c.Select
                                      Exit For
                                  End If
                              Next c
                              
                              
                              If Target.Column >= 3 And Target.Column <= 4 Then
                                  If Trim(Target.Value & vbNullString) <> vbNullString Then
                                      If Not IsNumeric(Target.Value) Then
                                          MsgBox "Nelle colonne C e D è consentito solo valori numerici.", vbCritical, "ERRORE"
                                          Target.ClearContents
                                          GoTo SafetyExit
                                      End If
                                  End If
                              End If
                          
                          SafetyExit:
                              Application.EnableEvents = True
                          End Sub
                          
                          
                          #55012 Score: 0 | Risposta

                          alexps81
                          Moderatore
                            58 pts

                            Be'...a me sembra giusto come funzionamento. Se in colonna C o D metti una carattere alfabetico ma qualche cella precedente non è compilata...allora ti avvisa che devi prima compilare la cella vuota.

                            Se invece sono tutte compilate quelle precedenti, allora passa alla verifica del tipo di dato inserito: se è numerico allora ok, altrimenti di avvisa dell'ulteriore errore.

                            Altrimenti segnalerebbe 2 errori: il primo legato al fatto che in quelle colonne ci vanno solo numeri, il secondo invece che ci sono celle precedenti non compilate.

                            Comunque aggiungi anche: Target.Select nel controllo numerico. Aggiungi questa riga tra Target.ClearContents e GoTo SafetyExit

                            #55013 Score: 0 | Risposta

                            frank_ciccio
                            Partecipante
                              3 pts

                              Grazie ancora alexps81

                            Login Registrati
                            Stai vedendo 13 articoli - dal 1 a 13 (di 13 totali)
                            Rispondi a: celle obbligatorie
                            Gli allegati sono permessi solo ad utenti REGISTRATI
                            Le tue informazioni: