› Sviluppare funzionalita su Microsoft Office con VBA › celle obbligatorie
-
AutoreArticoli
-
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 Subchiedo 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.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.ciao che significa
Se scrivo in C9 si sposta in C8 e poi in C8 dovrebbe restare in B9
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 SubLa 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.
Grazie alexps81 penso sia esatto.
La devo provare in un workbook più grande.
Grazie ancora
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.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 SubGrazie alexps81
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.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 IfCiao,
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 SubBe'...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
Grazie ancora alexps81
-
AutoreArticoli
