| | 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 | |
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 |
|
|