Valutazione 4.87/ 5 (100.00%) 5838 voti

Condividi:        

Ciclo FOR con Valore delle CheckBox

Vuoi potenziare i tuoi documenti Word? Non sai come si fa una macro in Excel? Devi creare una presentazione in PowerPoint?
Oppure sei passato a OpenOffice e non sei sicuro di come lavorare al meglio?

Moderatori: Anthony47, Flash30005

Ciclo FOR con Valore delle CheckBox

Postdi Valerio.Marchese » 26/04/17 11:31

Buongiorno a tutti,

scrivo in questo forum per ricevere un vostro prezioso aiuto in merito ad una Macro che ho creato all'interno di un file Excel 2013.

Il file Excel serve a gestire la prenotazione di alcuni strumenti di Laboratorio.

Esso si basa su una lista di richieste di prenotazioni dotate ciascuna di una CheckBox, che l'utente spunterà ogni volta che richiede una nuova prenotazione.

Ogni volta che una CheckBox viene spuntata, una e-mail automatica viene recapitata al mio indirizzo di posta aziendale per avvisarmi che qualcuno ha prenotato lo strumento.

La Macro che ho creato e che riporto di seguito funziona ma, essendo la lista di richieste composta da 700 righe e quindi 700 CheckBox, vorrei con voi capire se si può usare un ciclo For per minimizzare ed ottimizzare le righe di codice.

Private Sub CheckBox1_Click()

Dim OutApp As Object
Dim OutMail As Object
Dim ASSETID As Object
Dim A As String
Dim B As String
Dim C As String
Dim D As String

A = Range("g7")
B = Range("b7")
C = Range("n7")
D = Range("o7")

If CheckBox1.Value = True Then

If (Application.WorksheetFunction.CountIf(Range("fb8:fb24"), A) = 1) Then
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = "e-mail aziendale"
.Subject = "NUOVA PRENOTAZIONE STRUMENTO"
.Body = " HO INSERITO UNA NUOVA PRENOTAZIONE PER LO STRUMENTO " & B & " NEL PERIODO DAL " & C & " AL " & D
.Send
End With
Application.SendKeys "%a"
Set OutMail = Nothing
Set OutApp = Nothing
Application.ScreenUpdating = True

ElseIf (Application.WorksheetFunction.CountIf(Range("fb25"), A) = 1) Then
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = "e-mail aziendale"
.Subject = "NUOVA CALIBRAZIONE STRUMENTO"
.Body = " LO STRUMENTO " & B & " RISULTA IN CALIBRAZIONE DAL " & C & " AL " & D
.Send
End With
Application.SendKeys "%a"
Set OutMail = Nothing
Set OutApp = Nothing
Application.ScreenUpdating = True

End If

ElseIf CheckBox1.Value = False Then

Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = "e-mail aziendale"
.Subject = "DISDETTA PRENOTAZIONE STRUMENTO"
.Body = " HO DISDETTO UNA MIA PRENOTAZIONE PER LO STRUMENTO " & B & " NEL PERIODO DAL " & C & " AL " & D
.Send
End With
Application.SendKeys "%a"
Set OutMail = Nothing
Set OutApp = Nothing
Application.ScreenUpdating = True

End If

End Sub

Ho provato da solo a cercare la soluzione, abbozzando con scarso successo quanto di seguito riportato:

Private Sub CheckBox1_Click()

Dim OutApp As Object
Dim OutMail As Object
Dim ASSETID As Object
Dim A As String
Dim B As String
Dim C As String
Dim D As String
Dim i As Variant

For i = 1 To 700

A = Range("g" & i + 6)
B = Range("b" & i + 6)
C = Range("n" & i + 6)
D = Range("o" & i + 6)

If ("CheckBox" & i) = True Then

If (Application.WorksheetFunction.CountIf(Range("fb8:fb24"), A) = 1) Then
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = "e-mail aziendale"
.Subject = "NUOVA PRENOTAZIONE STRUMENTO"
.Body = " HO INSERITO UNA NUOVA PRENOTAZIONE PER LO STRUMENTO " & B & " NEL PERIODO DAL " & C & " AL " & D
.Send
End With
Application.SendKeys "%a"
Set OutMail = Nothing
Set OutApp = Nothing
Application.ScreenUpdating = True

ElseIf (Application.WorksheetFunction.CountIf(Range("fb25"), A) = 1) Then
Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = "e-mail aziendale"
.Subject = "NUOVA CALIBRAZIONE STRUMENTO"
.Body = " LO STRUMENTO " & B & " RISULTA IN CALIBRAZIONE DAL " & C & " AL " & D
.Send
End With
Application.SendKeys "%a"
Set OutMail = Nothing
Set OutApp = Nothing
Application.ScreenUpdating = True

End If

ElseIf ("CheckBox" & i) = False Then

Application.ScreenUpdating = False
Set OutApp = CreateObject("Outlook.Application")
Set OutMail = OutApp.CreateItem(0)
With OutMail
.To = "e-mail aziendale"
.Subject = "DISDETTA PRENOTAZIONE STRUMENTO"
.Body = " HO DISDETTO UNA MIA PRENOTAZIONE PER LO STRUMENTO " & B & " NEL PERIODO DAL " & C & " AL " & D
.Send
End With
Application.SendKeys "%a"
Set OutMail = Nothing
Set OutApp = Nothing
Application.ScreenUpdating = True

End If

Next

End Sub

Qualcuno di voi sarebbe così gentile da dirmi dove sbaglio ed eventualmente fornire una soluzione al mio problema?

Grazie a tutti in anticipo,
Valerio
Valerio.Marchese
Newbie
 
Post: 5
Iscritto il: 26/04/17 11:13

Sponsor
 

Re: Ciclo FOR con Valore delle CheckBox

Postdi alfrimpa » 26/04/17 15:19

Ciao Valerio

Io ti consiglierei di allegare anche il file (senza dati sensibili) perché con il solo codice non si può fare nulla.
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Ciclo FOR con Valore delle CheckBox

Postdi Valerio.Marchese » 26/04/17 16:24

alfrimpa ha scritto:Ciao Valerio

Io ti consiglierei di allegare anche il file (senza dati sensibili) perché con il solo codice non si può fare nulla.


Ecco il link al file completo in cui ho provveduto ad eliminare tutti i dati sensibili ma tenere la parte di codice per cui ho chiesto aiuto

https://www.dropbox.com/s/6icjrzrkl8vzs ... .xlsm?dl=0
Valerio.Marchese
Newbie
 
Post: 5
Iscritto il: 26/04/17 11:13

Re: Ciclo FOR con Valore delle CheckBox

Postdi alfrimpa » 26/04/17 18:18

Ciao Valerio

Ho visto il file e mi sembra che 700 checkbox siano una follia :)

Io avrei adottato una strategia diversa ossia: un'unica checkbox che ti segue.

Mi spiego: la checkbox è unica ma segue la selezione del cursore in colonna N.

Ora vorrei sapere (se questo approccio ti sembra giusto per le tue necessità) cosa deve succedere quando si seleziona/deseleziona la casella di controllo.

Ipotizzo: si seleziona la casella di controllo e a te viene inviata una mail con tutti i dati presenti sulla riga della casella e l'informazione che lo strumento è stato prenotato.

Se si deseleziona stessa mail che informa che la prenotazione è terminata.

Non so se ho interpretato bene.
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Ciclo FOR con Valore delle CheckBox

Postdi alfrimpa » 26/04/17 19:36

O forse, ancora meglio, utilizzare una userform
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Ciclo FOR con Valore delle CheckBox

Postdi Anthony47 » 26/04/17 23:04

Ciao Valerio, benvenuto nel forum.
Non ho capito l'interazione con il resto dell'automazione, pero' il mio consiglio e' di lasciare stare i checkboxes simuandoli direttamente in una cella Excel; come suggerito ad altro utente qui:
viewtopic.php?t=108145#p634351

Si usa "l'evento Before_DoubluClick" nella cella e si inserisce in cella un carattere che simula il checkbox.

Quanto all'intera applicazione io sono perplesso... Hai valutato l'ipotesi di un file Condiviso dove gli utenti scrivono le loro prenotazioni e il supervisore periodicamente prende visione delle richieste e gli assegna lo stato di Preso in carico e fa evolvere lo stato in funzione dell'avanzamento di processo?

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17646
Iscritto il: 21/03/06 16:03
Località: Ivrea

Re: Ciclo FOR con Valore delle CheckBox

Postdi alfrimpa » 26/04/17 23:16

Anthony anch'io l'avevo capita così.
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Ciclo FOR con Valore delle CheckBox

Postdi alfrimpa » 26/04/17 23:37

Io avevo pensato ad un'unica checkbox mobile che si sposta con il cursore (SelectionChange).
Alfredo

Win7 + Office 2007
Avatar utente
alfrimpa
Utente Senior
 
Post: 1201
Iscritto il: 30/12/13 17:01
Località: Napoli

Re: Ciclo FOR con Valore delle CheckBox

Postdi Valerio.Marchese » 27/04/17 07:32

alfrimpa ha scritto:Ciao Valerio

Ho visto il file e mi sembra che 700 checkbox siano una follia :)

Io avrei adottato una strategia diversa ossia: un'unica checkbox che ti segue.

Mi spiego: la checkbox è unica ma segue la selezione del cursore in colonna N.

Ora vorrei sapere (se questo approccio ti sembra giusto per le tue necessità) cosa deve succedere quando si seleziona/deseleziona la casella di controllo.

Ipotizzo: si seleziona la casella di controllo e a te viene inviata una mail con tutti i dati presenti sulla riga della casella e l'informazione che lo strumento è stato prenotato.

Se si deseleziona stessa mail che informa che la prenotazione è terminata.

Non so se ho interpretato bene.


Grazie per aver preso visione del mio file :)

Avevo inizialmente provato con singoli pulsanti "conferma prenotazione" ed "annulla prenotazione", ma non mi era ben chiaro come legarlo sempre e solo all'ultima riga inserita.
Con le CheckBox invece riesco a gestire separatamente ogni singola nuova prenotazione o disdetta, anche se a livello di VBA diventa molto più lungo e pesante.

Nel file originale, leggermente diverso da quello inviato per evitare la diffusione di dati sensibili, la spunta della checkbox permette all'utente di confermare la prenotazione dello strumento dopo aver compilato le informazioni nelle celle F:K, e permettere a me di prendere visione della nuova prenotazione tramite la ricezione di una e-mail anzichè dover periodicamente visionare il file.

La e-mail che ricevo contiene informazioni sul richiedente (colonna C), sullo strumento (colonna B) e sul periodo di prenotazione (colonne J e K).

Il deselezionamento della CheckBox invece significa che la prenotazione è stata annullata e non che questa è terminata (non serve questo controllo).
Valerio.Marchese
Newbie
 
Post: 5
Iscritto il: 26/04/17 11:13

Re: Ciclo FOR con Valore delle CheckBox

Postdi Valerio.Marchese » 27/04/17 07:36

Anthony47 ha scritto:Ciao Valerio, benvenuto nel forum.
Non ho capito l'interazione con il resto dell'automazione, pero' il mio consiglio e' di lasciare stare i checkboxes simuandoli direttamente in una cella Excel; come suggerito ad altro utente qui:
viewtopic.php?t=108145#p634351

Si usa "l'evento Before_DoubluClick" nella cella e si inserisce in cella un carattere che simula il checkbox.

Quanto all'intera applicazione io sono perplesso... Hai valutato l'ipotesi di un file Condiviso dove gli utenti scrivono le loro prenotazioni e il supervisore periodicamente prende visione delle richieste e gli assegna lo stato di Preso in carico e fa evolvere lo stato in funzione dell'avanzamento di processo?

Ciao


Ciao,

grazie mille per il tuo interessamento alla mia problematica :)

Puoi per favore chiarirmi la soluzione che hai pensato?

In merito alla tua perplessità invece si, ho pensato a quanto da te scritto ma così come creato il file mi sembra migliore in termini di efficienza in quanto le e-mail mi informano dei vari aggiornamenti sulle prenotazioni senza che io debba periodicamente controllare il file (la gestione degli strumenti non è il mio main role all'interno della società).
Valerio.Marchese
Newbie
 
Post: 5
Iscritto il: 26/04/17 11:13

Re: Ciclo FOR con Valore delle CheckBox

Postdi Valerio.Marchese » 27/04/17 07:47

Anthony47 ha scritto:Ciao Valerio, benvenuto nel forum.
Non ho capito linterazione con il resto dell'automazione, pero' il mio consiglio e' di lasciare stare i checkboxes simuandoli direttamente in una cella Excel; come suggerito ad altro utente qui:
viewtopic.php?t=108145#p634351

Si usa "l'evento Before_DoubluClick" nella cella e si inserisce in cella un carattere che simula il checkbox.

Quanto all'intera applicazione io sono perplesso... Hai valutato l'ipotesi di un file Condiviso dove gli utenti scrivono le loro prenotazioni e il supervisore periodicamente prende visione delle richieste e gli assegna lo stato di Preso in carico e fa evolvere lo stato in funzione dell'avanzamento di processo?

Ciao


Ciao,

Ho visto il topic e l'idea mi pare buona :D
Come implementarla mi è chiaro, ma come posso usarla per gestire tutte le righe di prenotazione e quindi l'invio delle e-mail di conferma?

Codice: Seleziona tutto

Private Sub Worksheet_BeforeDoubleClick(ByVal Target As Range, Cancel As Boolean)
If Target.Column = 1 Then
    Select Case Target.Value
    Case Is = ""
        Target.Value = "ü"
    Case Is = "ü"
        Target.Value = "û"
    Case Else  'Invece che Is = "û"
        Target.Value = ""
End Select
    Target.Font.Name = "Wingdings"
    Cancel = True
End If
End Sub

Valerio.Marchese
Newbie
 
Post: 5
Iscritto il: 26/04/17 11:13

Re: Ciclo FOR con Valore delle CheckBox

Postdi Anthony47 » 29/04/17 02:01

Non ho capito perche' hai voluto creare una versione "piu' sofisticata" della Worksheet_BeforeDoubleClick, comunque va bene anche cosi'.
Per l'invio della email devi accodare il codice che invia la mail a quello che inserisce /togli la spunta nella cella.

Codice: Seleziona tutto
'
End Select
    Target.Font.Name = "Wingdings"
    Cancel = True
End If
'>>>IL CODICE PER L'INVIO DELLE MAIL
If Target.Value = "ü" then
    'Il Codice per l'invio della Prenotazione
Else
    'Il codice per l'invio della Sprenotazione
Endif
'<<< FINE
End Sub

Continuo a vedere con scetticismo l'uso della mail rispetto al file condiviso, ma il mio lavoro e' altro.

Ciao
Avatar utente
Anthony47
Moderatore
 
Post: 17646
Iscritto il: 21/03/06 16:03
Località: Ivrea


Torna a Applicazioni Office Windows


Topic correlati a "Ciclo FOR con Valore delle CheckBox":


Chi c’è in linea

Visitano il forum: Nessuno e 42 ospiti