" Crearsi agenda app.ti parte 2

Crearsi una Agenda Appuntamenti: seconda parte. - dal 04/09/04 pagina vista: volte

Attenzione: ricordo la necessità di scaricare l'.ocx necessario al MonthView (vedi articolo "parte prima").

Abbiamo visto nella prima parte, la struttura delle istruzioni e loro posizionamento sfruttando opportunamente gli eventi:

  • selezione di un giorno nel MonthView (DayClick)

  • cambio nella TextBox1 e TexiBox2 (Change)

  • pressione sul CommandButton1 (Click)

La nostra Agenda però non è completa: manca infatti la possibilità di cancellare un appuntamento già registrato.

In questa seconda parte ci occuperemo di come aggiungere le opportune modifiche per completare l'opera. Quando selezioniamo una data nel MonthView, se vengono trovati appuntamenti registrati, si popolano le due ListBox.

Solo in questo modo vedremo tutti gli apppuntamenti presenti per quella data, ed è appunto selezionando l 'orario corrispondente all'appuntamento che vogliamo eliminare, che potremo agire, eliminandola, sulla riga che contiene la data, l'orario, e la descrizione dell'appuntamento scelto.

Per questo passaggio possiamo usare due sistemi basati entrambi su un Click sull'orario da eliminare, presente nella ListBox1: usare una variabile dimensionata come tipo di dati "CDate", che ci serva per la ricerca dei dati correlati alla data e all'orario sul foglio di lavoro, oppure usare una TextBox che, al Click sull'orario da eliminare, si renda uguale all'orario stesso. Questa TextBox poi la renderemo invisibile in esecuzione, impostando la sua proprietà Visible a False. Quindi l'istruzione sarà:

  • Private Sub ListBox1_Click()
    TextBox4 = ListBox1.Text       
    (TextBox4 perchè ne abbiamo aggiunta un'altra)
    End Sub

Abbiamo poi bisogno per la nostra modifica, di un secondo CommandButton che ci consenta di rintracciare, leggendo la data che sarà nella TextBox1 e l'orario che sarà nella TextBox4, la riga che corrisponde a questi due valori, e la cancelli. Dobbiamo usare questa procedura perchè non è possibile risalire alla riga da cancellare, leggendo il numero indice corrispondente all'orario selezionato nella ListBox. La ListBox la carichiamo sfruttando AddItem, e il numero indice dei dati nella lista non corrisponderà mai al numero indice riga del foglio, riga dal quale un valore è stato caricato.

Dovremo quindi ripetere un ciclo di ricerca, che è del tutto simile al ciclo utilizzato quando selezioniamo un giorno nel MonthView. Dovremo poi ripetre un aggiornamento dei valori nelle ListBox per eliminare anche qui l'orario scelto, e dovremo quindi rimuovere tutti i dati presenti per svolgere un nuovo ciclo di AddItem.

E qui impariamo una tecnica diversa per sfruttare istruzioni ripetitive: quando all'interno di routines troviamo blocchi di istruzioni che si ripetono anche in altre routines, conviene creare delle macro composte solo dalle istruzioni che si ripetono, e all'interno delle routines richiamare il nome delle macro anzichè riscrivere gli stessi blocchi di istruzioni. Vediamo quindi quali sono questi blocchi e come li useremo:

  • un blocco di istruzioni comune ad altre routine è il reperimento dei dati sul foglio di lavoro, per caricare le listbox, creiamo quindi una macro che chiameremo CaricaDati (queste istuzioni sono contenute nella routine Private Sub MonthView1_DateClick(ByVal DateClicked As Date) e dovremo usarla anche nel CommandButton2_Click() )

Sub CaricaDati()
data = CDate(TextBox1)
Dim CL As Object
riga = Sheets(1).Range([A5], [A5].End(xlDown)).Rows.Count
Set zona = Sheets(1).Range(Cells(5, 1), Cells(riga + 4, 1))
For Each CL In zona
If CL = data Then
W = CDate(CL.Offset(0, 1).Value)
ListBox1.AddItem W
ListBox2.AddItem CL.Offset(0, 2).Value
i = i + 1
End If
Next
If i > 0 Then
MsgBox "Sono Presenti " & i & " Appuntamenti"
Else
MsgBox "Nessun Appuntamento per questa data"
End If

End Sub

sostituiremo quindi tutto questo blocco di istruzioni nelle due routine su citate, chiamando semplicemente il nome di questa macro sopra (poi vediamo come).

  • Secondo blocco di istruzioni che diventa un'altra macro; è il blocco di istruzioni che si occupra di rimuovere i dati nelle due ListBox, quindi chiameremo qusta macro Rimuovi

Sub Rimuovi()
n = ListBox1.ListCount - 1
If n >= 1 Then
For Z = n To 0 Step -1
ListBox1.RemoveItem Z
Next
End If
n = ListBox2.ListCount - 1
If n >= 1 Then
For Z = n To 0 Step -1
ListBox2.RemoveItem Z
Next
End If
End Sub

o se preferite una istruzione più breve:

Sub Rimuovi()
ListBox1.Clear
ListBox2.Clear
End Sub

 

  • Terzo blocco di istruzioni che può essere racchiuso in una macro, sono le istruzioni relative all'ordinamento dati. In realtà in questo esercizio queste istruzioni vengono usate una sola volta, ma visto che stiamo esemplificando e questo blocco si presta ad essere impostato come macro a se stante, così facciamo, e chiameremo la macro OrdinaDati

Sub OrdinaDati()
Set ordina = Sheets(1).Range(Cells(5, 1), Cells(riga + 4, 3))

ordina.Sort Key1:=Range("B4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom

ordina.Sort Key1:=Range("A4"), Order1:=xlAscending, Header:=xlGuess, _
OrderCustom:=1, MatchCase:=False, Orientation:=xlTopToBottom
End Sub

Tutte queste macro le inseriremo nello stesso modulo UserForm, senza necessità di creare un modulo standard.

Ora vediamo come cambiano le routines rispetto agli esempi riportati nella prima parte:

  • routine connessa al click nel MonthView  (controllate con la stessa nella prima parte)

Private Sub MonthView1_DateClick(ByVal DateClicked As Date)
TextBox1 = MonthView1.Value
Rimuovi
TextBox4 = ""
CaricaDati      
 'si chiama la macro "CaricaDati"
End Sub

  • routine per cancellare il contenuto delle due ListBox  attivata da un Cambio della TextBox1 (quella delle date) (controllate con la stessa nella prima parte)

Private Sub TextBox1_Change()
Rimuovi    
'si chiama la macro "Rimuovi"
End Sub

  • Nella routine del CommandButton1, cambia solo la parte finale destinata all'ordnamento, per cui spariscono le istruzioni relative che vengono sostituite dal riciamo della macro OrdinaDati; vediamo solo la parte finale:

Private Sub CommandButton1_Click()

...omissis

Cells(iRow, 3) = TextBox3.Value
TextBox2 = ""
TextBox3 = ""
OrdinaDati     
  'si chiama la macro "OrdinaDati"
Resume
End Sub

Le altre routine non pertinenti richiami alle macro restano invariate.

Ora vediamo la routine associata al Click del CommandButton2, quello che serve per elininare un appuntamento. La routine inizia con due controlli: se si preme il pulsante e non è selezionanto il giorno (textbox1) o l'orario (textbox4), si avvisa col relativo messaggio e si esce dalla routine. Una volta che le tue texbox contengono dati, li si assegna a due variabili (data e ora) dichiarandi il "tipo di dati" (CDate). Si prende con la variabile "riga" il numero di righe (di dati, quindi) presenti nella colonna A. Poi si inizia un ciclo che cerchi in "zona" la data uguale alla variabile "data" e nella cella a sinistra (Offset(0, 1)) l'orario "ora". Trovata la coppia di valori, si pone una domanda per confermare la cancellazione dell'appuntamento. In caso si confermi, si elimina l'intera riga, poi si richiamano de due macro "Rimuovi" (che pulisce anche le due ListBox) e "CaricaDati" (che ripopola le due ListBox). Poi si pulisce la textbox4.

Private Sub CommandButton2_Click()
If TextBox1 = "" Then
MsgBox "Devi selezionare il giorno"
Exit Sub
End If

If TextBox4 = "" Then
MsgBox "Devi selezionare l'orario"
Exit Sub
End If
'--------
data = CDate(TextBox1)
ora = CDate(TextBox4)

Dim CL As Object
riga = Sheets(1).Range([A5], [A5].End(xlDown)).Rows.Count
Set zona = Sheets(1).Range(Cells(5, 1), Cells(riga + 4, 1))
For Each CL In zona
miotime = CDate(CL.Offset(0, 1).Value)
If CL = data And TimeValue(miotime) = ora Then
domanda = MsgBox("Sicuro di cancellare l'App.to del " & data & " alle ore " & ora & "", vbYesNo)
If domanda = vbYes Then
CL.EntireRow.Delete
MsgBox "L'appuntamento del " & data & " all'ora " & ora & " eliminato"
Exit For
End If
End If
Next
Rimuovi
CaricaDati
TextBox4 = ""
End Sub

L'immagine della Form con la modifica del CommandButton2 (Cancella Appuntamento) nel momento in cui si è premuto per cancellare un appuntamento:

 

File consultabile e scaricabile :   AppuntamentiD.zip   23 Kb  

 

Buon lavoro.

prelevato sul sito www.ennius.altervista.org