Stellar Blade Un'esclusiva PS5 che sta facendo discutere per l'eccessiva bellezza della protagonista. Vieni a parlarne su Award & Oscar!
 
Pagina precedente | 1 | Pagina successiva
Vota | Stampa | Notifica email    
Autore

Duplice uso della verifica celle compilate

Ultimo Aggiornamento: 17/03/2019 08:38
Post: 254
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Junior
2010
OFFLINE
06/03/2019 06:11

-- Scusate l'avevo postato nella sezione sbagliata --
Buonasera,
con questo script, verifico se alcune celle sono compilate e se non è cosi avvio un messaggio di avviso:

Sub CreaNuovoOrdine()
Dim ws As Worksheet
Dim ws1 As Worksheet
NomeFoglio = [S2]
If Range("C2") = "" Or Range("F2") = "" Or Range("H2") = "" Or Range("F4") = "" Or Range("H4") = "" Then
MsgBox ("i Campi obbligatori non sono tutti compilati "): Exit Sub
End If
Set wh = Worksheets(ActiveSheet.Name)
Set ws1 = Worksheets("Master")
For Each ws In Worksheets
If ws.Name = NomeFoglio Then
MsgBox "Il foglio " & NomeFoglio & " già esiste"
Exit Sub
End If
Next
ActiveSheet.Copy After:=Worksheets(Sheets.Count)
If wh.Range("S2").Value <> "" Then
ActiveSheet.Name = wh.Range("S2").Value
End If

'ws1.Visible = False
ActiveSheet.Shapes.Range(Array("Button 1")).Delete
ActiveSheet.Rows("10:4040").EntireRow.Hidden = False

MsgBox ("Operazione effettuata")

End Sub [\CODE]
Ma vorrei aggiungere una seconda verifica.
In pratica:
punto 1: se i campi non sono compilati avvisami..se invece sono tutti compilati prosegui con la macro.
punto 2:Slegare l'esecuzione della macro dalla necessità di pigiare il bottone specifico "Crea nuovo ordine" ma in automatico.
Forse aggiungendo
in Private Sub Worksheet_Change(ByVal Target As Range)
Call CreaNuovoOrdine
???

Grazie in anticipo.

Download (530 KB)
BG66
Excel 2010
Post: 3.283
Registrato il: 03/04/2013
Utente Master
Excel 2000 - 2013
OFFLINE
06/03/2019 08:44

Buona giornata, BG66;
l'idea dell'Evento Worksheet_Change è coerente con la tua richiesta, ma dovresti indicare in base a quale Input si debba sviluppare l'Evento.

Voglio dire, nel tuo File sono previsti cinque Campi obbligatori:
- CLIENTE (Cella C2)
- N° ORDINE (Cella F2)
- DATA (Cella H2)
- LUNGH.REALE (Cella F4)
- IMPIANTO (Cella H4)

In Worksheet_Change dovresti indicare in base a quale Input attivare l'evento.
Non puoi pensare di attivare l'evento in Base a:

 
Option Explicit

Private Sub Worksheet_Change(ByVal Target As Range)
    If Not Intersect(Target, Range("C2,F2,H2,F4,H4")) Is Nothing Then
        Call CreaNuovoOrdine
    End If
End Sub

Verrebbe attivato il Codice VBA CreaNuovoOrdine ad ogni compilazione di uno dei cinque Campi; verrebbe visualizzato il messaggio:

i Campi obbligatori non sono tutti compilati



Ovviamente si potrebbe pensare a una serie di verifiche all'interno deell'Evento Worksheet_Change ma dovresti condurre dei Test approfonditi.
Dico "dovresti" in quanto non riesco a condurre i Test personalmente visto che i Codici VBA sono protetti da Password.



Giuseppe

Windows XP - Excel 2000
Windows 10 - Excel 2013
Post: 2.168
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
06/03/2019 12:49

ciao
potresti utilizzare un piccolo work-around che al posto di visualizzarti il messaggio "Campi obbligatori....", lo "stampa" in una cella dedicata.

Nell'esempio, in A1 c'è un conta.valori delle 6 celle interessate; l'evento change, come vedi, ad inizio disabilita gli eventi per poi riabilitarli alla fine in modo da evitare un loop infinito.

Nella cella A2 viene stampato "Mancano campi...."

Quanto la cella A1 arriva al valore 6 (ovvero tutti i campi interessati valorizzati), allora viene eseguita la macro e viene scritto "eseguo macro" in A2-

saluti
Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Range("A1") <> 6 Then
        Range("A2") = "Mancano dati"
    Else
        Range("A2") = "eseguo macro"
        'TUA MACRO
    End If
    Application.EnableEvents = True
End Sub





Domenico
Win 10 - Excel 2016
Post: 254
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Junior
2010
OFFLINE
06/03/2019 20:10

Ciao a tutti,
@GiuseppeMN
Scusami pensavo di aver "ripulito" completamente il file prima di postarlo ( provvedo immediatamente)

@Domenico
Soluzione efficace, domattina provo ad applicarlo sul master.... però il message box era più minaccioso..😉

A presto e grazie ad entrambi.
[Modificato da BG66 06/03/2019 20:10]
BG66
Excel 2010
Post: 2.169
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
07/03/2019 10:04

Re:
BG66, 06/03/2019 20.10:

Ciao a tutti,
.... però il message box era più minaccioso..😉



Potresti metterci un PopUp a scomparsa automatica....vedi tu

Rifacendomi allo stesso test di ieri:

Private Sub Worksheet_Change(ByVal Target As Range)
    Application.EnableEvents = False
    If Not Intersect(Target, Range("C2,F2,H2,F4,H4,S2")) Is Nothing Then
        If Range("A1") <> 6 Then
            MessageBoxTimer
        Else
            'TUA MACRO
            MsgBox "Ho eseguito la macro"
        End If
    End If
    Application.EnableEvents = True
End Sub
Sub MessageBoxTimer()
    Dim AckTime As Integer, InfoBox As Object
    Set InfoBox = CreateObject("WScript.Shell")
    AckTime = 1
    Select Case InfoBox.Popup("Click OK (La finestra si chiude automaticamente).", _
    AckTime, , 0)
        Case 1, -1
            Exit Sub
    End Select
End Sub


Saluti



Domenico
Win 10 - Excel 2016
Post: 257
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Junior
2010
OFFLINE
07/03/2019 14:31


Ciao Domenico,
per preservare la mia incolumità fisica...resto sulla tua prima soluzione.
La seconda con la frequenza di utilizzo del file...non potrei escludere...l'ideazione di un agguato al sottoscritto da parte degli utenti finali....😡

AGGIUNTA POSTUMA ----
Ti chiedo un ulteriore sforzo,se oltre alla verifica dei 6 campi volessi che verificasse anche che la cella in D6 non contenesse l'errore #N/D ?
----------------------
Grazie ancora.
[Modificato da BG66 07/03/2019 14:57]
BG66
Excel 2010
Post: 2.171
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
07/03/2019 15:38

Usa if not iserror.... Sono da cellulare e per il momento non posso integrare la sub.
[Modificato da dodo47 07/03/2019 15:50]
Domenico
Win 10 - Excel 2016
Post: 258
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Junior
2010
OFFLINE
09/03/2019 07:05

Ciao Domenico,
fatta aggiunta:
If Range("S9") <> 5 Then
      Range("K9") = "Attesa inserimento dati"     
      Else         
      Range("K9") = ""         
' nuova aggiunta >>>>>>>>>>>>>>>>>>>>>>>>>>
            Dim rng1 As Boolean          
            If Not IsError(Range("A1").Value) Then         
            MsgBox "Valore nominale non corretto"         
           Exit Sub     
Else         
     Call CreaNuovoOrdine        
           End If 
<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<    
      End If     
Set rng = Nothing     
Application.EnableEvents = True 
End Sub

E in questo modo "gli dico" di uscire se trova l'errore.
Ma come faccio...dopo aver effettuato la correzione a fargli riprendere e terminare la macro?

Grazie ancora.

[Modificato da BG66 09/03/2019 07:06]
BG66
Excel 2010
Post: 259
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Junior
2010
OFFLINE
13/03/2019 13:22

Ciao Domenico ( @dodo47 ),
ho continuato a ragionare sul da farsi

E in questo modo "gli dico" di uscire se trova l'errore.
Ma come faccio...dopo aver effettuato la correzione a fargli riprendere e terminare la macro?



ma non trovo il bandolo.

Riesci a darmi qualche dritta?

Grazie se puoi.
BG66
Excel 2010
Post: 2.182
Registrato il: 06/04/2013
Utente Veteran
2010
OFFLINE
13/03/2019 17:58

ciao

Ovviamente se la cella A1 ha un errore, c'è una formula.

Ora non so quale sia, ma ipotizziamo che la cella A1 dipenda dalla cella C3 che contiene un numero statico.

Una volta che hai intercettato l'errore in A1 (if IsError....), proponi una inputBox del valore corretto di C3 affinchè A1 non vada in errore e prosegui.
(Scusa ma non conosco i riferimenti esatti)

Ora, poichè potresti immettere in C3 un valore che continua a dare errore, metti il controllo in un loop che, finchè la cella A1 va in errore, ti richiede il valore di C3

....
Do While IsError(Range("a1"))
valore = InputBox("Immetti valore corretto in c3")
Range("c3") = valore
Loop


...prosegue tua macro

Spero di essermi più o meno spiegato.

saluti



[Modificato da dodo47 13/03/2019 19:06]
Domenico
Win 10 - Excel 2016
Post: 260
Registrato il: 13/12/2015
Città: MILANO
Età: 58
Utente Junior
2010
OFFLINE
17/03/2019 08:38

[RISOLTO]
Ciao Domenico,
il risultato finale è:
Sub CreaNuovoOrdine()     
Dim ws As Worksheet     
Dim ws1 As Worksheet     
NomeFoglio = [S2] 
If Range("C2") = "" Or Range("F2") = "" Or Range("H2") = "" Or Range("F4") = "" Or Range("H4") = "" Then     MsgBox ("i Campi obbligatori non sono tutti compilati "): Exit Sub 
End If  
Do While IsError(Range("D6")) 
valore = InputBox("Immetti valore corretto della lunghezza") Range("F4") = valore 
Loop     
Set wh = Worksheets(ActiveSheet.Name)     
Set ws1 = Worksheets("Master")     
For Each ws In Worksheets         
If ws.Name = NomeFoglio Then         
MsgBox "Il foglio " & NomeFoglio & " già esiste"         
Exit Sub         
End If     
Next     
ActiveSheet.Copy After:=Worksheets(Sheets.Count)         
If wh.Range("S2").Value <> "" Then         
ActiveSheet.Name = wh.Range("S2").Value         
End If          
ws1.Unprotect Password:="abc"         
ws1.Protect Password:="abc"                  
ws1.Visible = False         
ActiveSheet.Shapes.Range(Array("Button 1")).Delete
ActiveSheet.Rows("10:4040").EntireRow.Hidden = False
ActiveSheet.Protect Password:="abc"
ActiveSheet.Range("C12").Select
MsgBox ("Buon lavoro")  
End Sub


Perfettamente funzionante.

Grazie ancora e alla prossima.
[Modificato da BG66 17/03/2019 08:43]
BG66
Excel 2010
Vota: 15MediaObject5,00111 1
Amministra Discussione: | Chiudi | Sposta | Cancella | Modifica | Notifica email Pagina precedente | 1 | Pagina successiva
Nuova Discussione
 | 
Rispondi
Cerca nel forum
Tag discussione
Discussioni Simili   [vedi tutte]
Feed | Forum | Bacheca | Album | Utenti | Cerca | Login | Registrati | Amministra
Tutti gli orari sono GMT+01:00. Adesso sono le 20:41. Versione: Stampabile | Mobile | Regolamento | Privacy
FreeForumZone [v.6.1] - Copyright © 2000-2024 FFZ srl - www.freeforumzone.com