Discussione:
Option Button e valore Boolean
(troppo vecchio per rispondere)
Asterix4you
2006-10-13 10:43:36 UTC
Permalink
Ciao ragazzi! sono alle prime armi con VBA.
E' possibile!! e come posso far variare il valore nell'istruzione
sotto indicata False in True e viceversa con due option button
(SettimanaCorta e SettimanaLunga) in una UserForm a seconda delle
esigenze.

impostazione attuale:(e funziona!)
txtComputabili.Value = ContaLavorativi(txtDataIniziale, txtDataFinale,
False)


specifico che ColtaLavorativi è uno script inserito in moduli ed il
valore Settimana As Bollean


se imposto True restituisce 5 giorni lavorativi
altrimenti False mi restituisce 6 giorni lavorativi.


grazie1000
Giovanni Zezza
2006-10-13 11:27:42 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
Ciao ragazzi! sono alle prime armi con VBA.
E' possibile!! e come posso far variare il valore nell'istruzione
sotto indicata False in True e viceversa con due option button
(SettimanaCorta e SettimanaLunga) in una UserForm a seconda delle
esigenze.
Non ho capito che cosa vuoi sapere e dove sia il problema.

Dato per scontato che tu sappia come fare un'assegnazione, e conosca
l'operatore booleano Not, il problema è forse nell'interfaccia? in che cosa
in particolare?

Io avrei scelto piuttosto dei bottoni Radio per selezionare i due possibili
valori, ma a parte questo non riesco a capire in che cosa incontri
difficoltà. Prova a riformulare meglio la domanda.

Ciao.
Asterix4you
2006-10-13 12:10:09 UTC
Permalink
Post by Giovanni Zezza
Io avrei scelto piuttosto dei bottoni Radio per selezionare i due possibili
valori, ma a parte questo non riesco a capire in che cosa incontri
difficoltà. Prova a riformulare meglio la domanda.
Partiamo dal fatto che sono alle prime armi!!!
Ho un modello di documento Word che in apertura mi visualizza un form
dove ho svariati campi di cui DataIniziale , DataFinale e su un
cmdCalcola calcola i Computabili (che corrispondono in realtà ai
giorni lavorativi).

txtComputabili.Value = ContaLavorativi(txtDataIniziale, txtDataFinale,
False)


Ho la necessità di dover calcolare i giorni computabili o come
settimana corta o come settimana lunga (ed avrei pensato a due
OptionButton) se hai altre soluzioni ben vengano!!
(in sintesi devo comandare il Valore Settimana As Boolean inserito in
un modulo con due OptioButton SettimanaCorta o SettimanaLunga)

Lo script di ContaLavorativi e copiato in un modulo ed ha come valore
Settimana As Boolean


Public Function ContaLavorativi(dtmDataIniziale As Date, dtmDataFinale
_
As Date, Settimana As Boolean) As Integer
'Autore:
'Accetta:
' DataIniziale = data iniziale del periodo scelto
' DataFinale = data finale del periodo scelto
' Settimanacorta = True se bisogna considerare la settimana corta
'Restituisce: numero di giorni computabili/lavorativi del periodo
'La funzione utilizza Festivo() e Pasqua() usabili anche
separatamente
Dim DataDaContare As Date, Conto As Integer
If Not IsDate(dtmDataIniziale) Or Not IsDate(dtmDataFinale) Or
dtmDataIniziale > _
dtmDataFinale Then
ContaLavorativi = 0
Exit Function
End If
DataDaContare = dtmDataIniziale - 1
If Settimana Then
Do
DataDaContare = dtmDataDaContare + 1
If Not Festivo(DataDaContare) And Weekday(DataDaContare) <> 7
Then
Conto = Conto + 1
End If
Loop Until DataDaContare = dtmDataFinale
Else
Do
DataDaContare = DataDaContare + 1
If Not Festivo(DataDaContare) Then Conto = Conto + 1
Loop Until DataDaContare = dtmDataFinale
End If
ContaLavorativi = Conto
End Function
Giovanni Zezza
2006-10-13 14:01:21 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
Ho la necessità di dover calcolare i giorni computabili o come
settimana corta o come settimana lunga (ed avrei pensato a due
OptionButton) se hai altre soluzioni ben vengano!!
(in sintesi devo comandare il Valore Settimana As Boolean inserito in
un modulo con due OptioButton SettimanaCorta o SettimanaLunga)
Ma di nuovo non dici dove sia il problema.

Immagino che l'evento Click di cmdCalcola chiami la funzione
ContaLavorativi; prima di farlo, andrà a vedere quale dei due OptionButton
è selezionato (proprietà .Value di SettimanaCorta e SettimanaLunga) e
chiamerà la funzione in un modo o nell'altro (If SettimanaCorta.Value Then
... Else ... End If).

In alternativa, potresti fare in modo che un evento di SettimanaCorta e
SettimanaLunga (.Change, immagino) cambi il valore di una variabile, ma mi
sembra una complicazione inutile.

Due OptionButton in un gruppo vanno benissimo, è che io sono abituato ad
un'altra terminologia e li chiamo bottoni Radio, sicché non avevo capito.

Potresti anche, ancora più semplicemente, usare due bottoni comando, uno
per il calcolo con la settimana lunga e uno con la settimana corta.

Ciao.
Asterix4you
2006-10-13 14:51:46 UTC
Permalink
Post by Giovanni Zezza
Immagino che l'evento Click di cmdCalcola chiami la funzione
ContaLavorativi; prima di farlo, andrà a vedere quale dei due OptionButton
è selezionato (proprietà .Value di SettimanaCorta e SettimanaLunga) e
chiamerà la funzione in un modo o nell'altro (If SettimanaCorta.Value Then
... Else ... End If).
Ciao.
Esatto hai centrato il mio problema!
Si l'evento click cmdCalcola chiama la funzione ContaLavorativi

Ho inserito in un frame del Form i due OptionButton. (Corta e Lunga) e
sono fermo li e non so come farli vedere quale dei due è selezionato.

Potresti essere più esplicito con un esempio di come impostare if..
then... else ..end If
non so proprio da dove iniziare!
-come fare per vedere quale dei due optButton è selezionato?
-come impostare i due optButton?


Grazie alla tua Santa pazienza!
Giovanni Zezza
2006-10-13 15:28:51 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
Ho inserito in un frame del Form i due OptionButton. (Corta e Lunga) e
sono fermo li e non so come farli vedere quale dei due è selezionato.
Quello selezionato ha .Value = True.
Post by Asterix4you
Potresti essere più esplicito con un esempio di come impostare if..
then... else ..end If
Non c'è molto di più da esplicitare: If SettimanaLunga.Value Then <chiama
la funzione per la settimana lunga> Else <chiama la funzione per la
settimana corta> End If (se, come dici, hai chiamato i bottoni
SettimanLunga e SettimanaCorta). Può darsi che tu debba qualche
qualificatore prima di SettimanaLunga, il nomr del form o Me, e per
converso potresti evitare di scrivere .Value, perché è la proprietà di
deafult.

Se avessi più di due bottoni, per selezionare altre condizioni mutuamente
esclusive, potresti usare un Select Case ... End Select. In questo caso
invece basta controllare un solo OptionButton, perché se uno è vero l'altro
è certamente falso (si suppone ovviamente che la proprietà TripleState sia
falsa).
Post by Asterix4you
-come fare per vedere quale dei due optButton è selezionato?
Quello selezionato ha .Value = True.
Post by Asterix4you
-come impostare i due optButton?
Crea un gruppo (una Cornice) e ce li sbatti dentro; poi, come per tutti
controlli, li chiami con un nome che ti ricordi qualcosa e scrivi un
caption che significhi qualcosa per l'utente.

Ciao.
Asterix4you
2006-10-14 13:59:54 UTC
Permalink
Post by Giovanni Zezza
Crea un gruppo (una Cornice) e ce li sbatti dentro; poi, come per tutti
controlli, li chiami con un nome che ti ricordi qualcosa e scrivi un
caption che significhi qualcosa per l'utente.
Ciao.
Funziona solo OptionButton SettimanaLunga
se scelgo l'opzione SettimanaCorta si blocca Word.


Private Sub cmdCalcola_Click()

If Not IsDate(txtDataIniziale.Text) Then
MsgBox "errore nella data iniziale", vbExclamation, "Attenzione!!!"
txtDataIniziale.Text = ""
txtDataIniziale.SetFocus
Exit Sub
Else
dtmDataIniziale = txtDataIniziale.Text
End If

If Not IsDate(txtDataFinale.Text) Then
MsgBox "errore nella data finale", vbExclamation, "Attenzione!!!"
txtDataFinale.Text = ""
txtDataFinale.SetFocus
Exit Sub
Else
dtmDataFinale = txtDataFinale.Text
End If

' calcolo la fifferenza tra i due periodi
txtTotali.Value = DateDiff("D", txtDataIniziale, txtDataFinale) + 1
' calcolo i giorni computabili/lavorativi
If SettimanaLunga.Value Then
txtComputabili.Value = ContaLavorativi(txtDataIniziale, txtDataFinale,
False)
Else
txtComputabili.Value = ContaLavorativi(txtDataIniziale, txtDataFinale,
True)
End If

End Sub
Giovanni Zezza
2006-10-14 22:38:08 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
Funziona solo OptionButton SettimanaLunga
se scelgo l'opzione SettimanaCorta si blocca Word.
Avrai sbagliato qualcosa nella funzione che calcola i giorni, perché
per il resto non mi sembra ci siano errori.

Se il codice è quello che hai postato, questo passaggio è sospetto:

...
If Settimana Then
Do
Post by Asterix4you
Post by Asterix4you
DataDaContare = dtmDataDaContare + 1
...
Loop Until DataDaContare = dtmDataFinale
Else
...

Incrementi dmtDataDaContare (che non si sa che cosa sia), invece che
la variabile di controllo del ciclo DataDaContare.

Ciao.
Asterix4you
2006-10-15 20:51:09 UTC
Permalink
Post by Asterix4you
...
If Settimana Then
Do
Post by Asterix4you
DataDaContare = dtmDataDaContare + 1
...
Loop Until DataDaContare = dtmDataFinale
Else
...
Incrementi dmtDataDaContare (che non si sa che cosa sia), invece che
la variabile di controllo del ciclo DataDaContare.
Ciao Giovanni
ho risolto così;
' calcolo i giorni lavorativi/computabili
If optLunga.Value = True Then txtComputabili =
Val(ContaLavorativi(DataIniziale, DataFinale, False))
If optCorta.Value = True Then txtComputabili =
Val(ContaLavorativi(DataIniziale, DataFinale, True))
e funziona perfettamente al variare i radioButton

Grazie dei tuoi consigli
Giovanni Zezza
2006-10-16 09:05:01 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
ho risolto così;
' calcolo i giorni lavorativi/computabili
If optLunga.Value = True Then txtComputabili =
Val(ContaLavorativi(DataIniziale, DataFinale, False))
If optCorta.Value = True Then txtComputabili =
Val(ContaLavorativi(DataIniziale, DataFinale, True))
e funziona perfettamente al variare i radioButton
Non è necessario confrontare il valore con True: optCorta.Value è già un
booleano, quindi basta "If optCorta.Value Then ...".

Non capisco neanche il senso di Val(): 1) perché hai già definito "Function
ContaLavorativi(...) As Integer"; 2) perché txtComputabili[.Value] è una
stringa.

Se funzionano i due If distinti, poi, (e funzionano solo perché i due
valori sono per costrizione dell'interfaccia mutualmente esclusivi) non si
vede perché non debba funzionare il logicamente più corretto If ... Then
... Else.

Tutto ciò detto, quello che funziona funziona.

Ciao.
Asterix4you
2006-10-16 09:50:34 UTC
Permalink
Post by Giovanni Zezza
Tutto ciò detto, quello che funziona funziona.
Ciao.
In sintesi non sono un programmatore e non posso darti la spiegazione
tecnica, ho solo copiato quà e là un po di codici e funzioni ed
applicati al mio piccolo progetto. (per ora funziona secondo le mie
esigenze).
Se vuoi studiare il mio (caso strano) script ti mando il file Word dove
risiede il codice.

Mi manca l'ultimo scalino per completare l'opera. (ti prego aiutami)

Ho una TextBox1, ho i soliti due (radioButton) optCorta e optLunga ed
in fine TextBox2
quesito:

TextBox1= Anni di Servizio (casella inserimento)
TexBox2 = giorni di ferie spettanti (casella sola lettura)
optCorta e optLunga

devo ottenere nel Form i risultati sottoindicati:

da 0 a 5 anni di servizio = 25 giorni di ferie se settimanaCorta
= 30 giorni di ferie se
settimanaLunga

da 6 a 15 anni di servizio = 35 giorni di ferie se settimanaCorta
= 40 giorni di ferie se
settimamaLunga

da 16 a 40 anni di servizio = 45 giorni di ferie se settimanaCorta
=50 giorni di ferie se
settimamaLunga

come si traduce in VB tutto ciò (ricordati che sono ignorante in
materia)

Salutoni a Giovanni
Giovanni Zezza
2006-10-16 10:16:51 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
Se vuoi studiare il mio (caso strano) script ti mando il file Word dove
risiede il codice.
Percaritàdiddio, NO!
Post by Asterix4you
da 0 a 5 anni di servizio = 25 giorni di ferie se settimanaCorta
= 30 giorni di ferie se
settimanaLunga
da 6 a 15 anni di servizio = 35 giorni di ferie se settimanaCorta
= 40 giorni di ferie se
settimamaLunga
da 16 a 40 anni di servizio = 45 giorni di ferie se settimanaCorta
=50 giorni di ferie se
settimamaLunga
come si traduce in VB tutto ciò (ricordati che sono ignorante in
materia)
E ignorante rischi di restare, se almeno non tenti di scrivere una funzione
così semplice.

Public Function GiorniFerie (Anni as Integer, _
SettimanaLunga As Boolean) _
As Integer

Select Case Anni
Case 0 To 5
GiorniFerie = 25
Case 6 To 15
GiorniFerie = 35
Case 16 To 40
GiorniFerie = 45
Case Else
' GiorniFerie = ??
End Select

If SettimanaLunga Then
GiorniFerie = GiorniFerie + 5
End If

End Function

Per l'integrazione con l'interfaccia, vale quanto detto in precedenza.

Ciao.
Asterix4you
2006-10-16 19:22:21 UTC
Permalink
Post by Giovanni Zezza
Per l'integrazione con l'interfaccia, vale quanto detto in precedenza.
Ciao
Giovanni scusami e non mandarmi a quel paese.
Lo steep corretto dei giorni è questo:

da 0 a 5 anni di servizio = 26 giorni di ferie se settimanaCorta
= 30 giorni di ferie se
settimanaLunga


da 6 a 15 anni di servizio = 28 giorni di ferie se settimanaCorta
= 32 giorni di ferie se
settimamaLunga


da 16 a 25 anni di servizio = 32 giorni di ferie se settimanaCorta
=37 giorni di ferie se
settimamaLunga

oltre 25 anni di servizio = 39 giorni di ferie se settimanaCorta
=45 giorni di ferie se
settimanaCorta


come puoi notare non ci sono incrementi di 5 , quindi credo che lo
script che mi hai gentilmente compilato non si possa applicare.

Hai la soluzione finale?
Giovanni Zezza
2006-10-16 22:06:07 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
Giovanni scusami e non mandarmi a quel paese.
Perché no?
Post by Asterix4you
come puoi notare non ci sono incrementi di 5 , quindi credo che lo
script che mi hai gentilmente compilato non si possa applicare.
E non vuoi proprio neanche far finta di aver provato a pensare di
tentare di aggiustarlo per adattarsi al problema?

Sai che una condizione semplice si può tradurre con il costrutto If
... Then ... Else ... End If, e una condizione multipla con Select
Case ... Case ... End Case, non ti manca nulla per poter risolvere il
problema.

O bisogna declinarti tutte le possibili combinazioni di tutte le
possibili condizioni?
Post by Asterix4you
Hai la soluzione finale?
Hai già scritto una possibile soluzione in italiano, si tratta solo di
sostituire ai costrutti italiani con quelli vba.

Per esempio:

Select Case Anni
Case 0 To 5
If SettimanaLunga Then
GiorniFerie = 26
Else
GiorniFerie = 30
End If
Case ....
...
End Case

e così via uguale per gli altri casi, mutati gli estremi
dell'intervallo e i giorni. Se ti fossi preso la briga di leggere
l'help del costrutto Select, sapresti che l'ultima condizione può
essere resa con:

Case Is > 25
If SettimanaLunga Then
...
Else
...
End If
End Case

Alternativamente, puoi naturalmente mettere il Select dentro l'If,
invece dell'If dentro il Select:

If SettimanaLunga Then
Select Case
Case 0 To 5
GiorniFerie = 26
...
End Case
Else
Select Case
Case 0 To 5
GiorniFerie = 30
...
End Case
End If

O ancora puoi usare una variabile Incremento:

Dim Incremento As Integer
...
Select Case Anni
Case 0 To 5
GiorniFerie = 26
Incremento = 4
...
Case Is > 25
GiorniFerie = 39
Incremento = 6
End Case
If SettimanaLunga Then
GiorniFerie = GiorniFerie + Incremento
End If

Ma potresti anche scrivere due funzioni distinte:

...
If SettimanaLunga Then
GiorniFerie = GiorniFerieLunga(Anni)
Else
GiorniFerie = GiorniFerieCorta(Anni)
End If
...

Function GiorniFerieLunga(Anni As Integer) As Integer
Select Case Anni
Case 0 To 5
GiorniFerie = 30
Case ...
...
End Case
End Function

Function GiorniFerieCorta(Anni As Integer) As Integer
Select Case Anni
Case 0 To 5
GiorniFerie = 26
Case ...
...
End Case
End Function

E forse altro ancora.

Evidentemente, qualunque di questi modi tu scelga, nel caso dovessero
cambiare gli estremi degli intervalli o i giorni per ogni intervallo
sei costretto a modificare il codice. Non mi sembra francamente il
caso di mettermi a spiegare come sarebbe possibile generalizzare il
problema.

Quanto al mandarti o no a quel paese, dipende tutto dall'entità del
compenso. Finora, francamente, la paga è assai modesta: il problema è
troppo semplice perché possa gratificarmi risolverlo, e neppure riesco
ad avere la soddisfazione di averti insegnato qualcosa. Voglio un
aumento.

Ciao.
Asterix4you
2006-10-17 08:20:56 UTC
Permalink
Post by Giovanni Zezza
Evidentemente, qualunque di questi modi tu scelga, nel caso dovessero
cambiare gli estremi degli intervalli o i giorni per ogni intervallo
sei costretto a modificare il codice. Non mi sembra francamente il
caso di mettermi a spiegare come sarebbe possibile generalizzare il
problema.
Quanto al mandarti o no a quel paese, dipende tutto dall'entità del
compenso. Finora, francamente, la paga è assai modesta: il problema è
troppo semplice perché possa gratificarmi risolverlo, e neppure riesco
ad avere la soddisfazione di averti insegnato qualcosa. Voglio un
aumento.
Ciao.
Non voglio essere ripetitivo ma ti ricordo che sono solo 12 giorni che
ha iniziato a conoscere questo affascianate mondi di VB. (il mio lavoro
è lavorare con gli elicotteri)
Leggendo il manuale VB tutti i modi che tua hai elencato sembravano
possibili e mi hanno mandato nel pallone.
(gli esempi insegnano molto...moltissimo)
Grazie ai tuoi consigli e insegnamenti (applicati) ho raggiunto il mio
fine ...automatizzare un documento Word.
Grazie Giovanni
Asterix4you
2006-10-18 19:06:22 UTC
Permalink
Post by Giovanni Zezza
Dim Incremento As Integer
...
Select Case Anni
Case 0 To 5
GiorniFerie = 26
Incremento = 4
...
Case Is > 25
GiorniFerie = 39
Incremento = 6
End Case
If SettimanaLunga Then
GiorniFerie = GiorniFerie + Incremento
End If
al posto di end case ho dovuto inserire end select
altrimenti mi dava errore!
Giovanni Zezza
2006-10-19 08:50:47 UTC
Permalink
Asterix4you, nel messaggio
Post by Asterix4you
al posto di end case ho dovuto inserire end select
altrimenti mi dava errore!
Certo, ho sbagliato apposta, per vedere se te ne accorgevi. ;-)

La sintassi corretta della struttura di controllo è:

Select Case espressioneprova
[Case elencoespressioni-n
[istruzioni-n]]
[Case Else
[istruzionielse]]
End Select

Ho scritto in fretta (e ad ora tarda) e mi sono confuso (in alcuni dialetti
la struttura è: Case ... End Case).

Ciao.

Loading...