PDA

View Full Version : Problemi di calcolo con VBA


RunDLL
05-02-2004, 12:08
Ciao a trutti e grazie per leggere il mio problema: ho cercato di fare un piccolo programmino in VBA , semplice nulla di che, praticamente in una Form ho inserito 3 optionbutton che se cliccati mi cambiano la caption di un commandbutton. Poi ho inserito 6 textbox dove nella sesta mi dovrebbe dare il risultato di alcuni calcoli rendendo i dati inseriti nella altre textbox. In poche parole volevo creare un programmino che inserendo i valori nelle textbox mi calcolassero l'area del cerchio, del quadrato e del triangolo. Ho impostato che al click di ogni optionbutton mi cambiasse la caption del commandbutton perchè al verificarsi della diversa caption mi facesse i calcoli di una o dell'altra forma, poi ho scritto quanto seghe nell'evento click del commandbutton:

Private Sub Command1_Click()
If Command1.Caption = "Area triangolo" And Text1.Text = "" And Text2.Text = "" Then
MsgBox "Inserisci i dati nei campi", vbCritical, "Dati mancanti"
Else
Text6.Text = Text1.Text * Text2.Text / 2
End If
If Command1.Caption = "Area quadrato" And Text3.Text = "" And Text4.Text = "" Then
MsgBox "Inserisci i dati nei campi", vbCritical, "Dati mancanti"
Else
Text6.Text = Text3.Text * Text4.Text
End If
If Command1.Caption = "Area cerchio" And Text5.Text = "" Then
MsgBox "Inserisci i dati nei campi", vbCritical, "Dati mancanti"
Else
Text6.Text = (Text5.Text) ^ 2 * 3.14
End If
End Sub

Mi sembrerebbe tutto in regola se non che mi da errore "tipo non corrispondente" sia che lasci le textbox vuote che se ci metta dei valori.
Allora ho provato a dare queste istruzioni:
Private Sub Command1_Click()
If Command1.Caption = "Area triangolo" And Text1.Text <> "" And Text2.Text <> "" Then
Text6.Text = Text1.Text * Text2.Text / 2
Else
MsgBox "Inserisci i dati nei campi", vbCritical, "Dati mancanti"
End If
If Command1.Caption = "Area quadrato" And Text3.Text <> "" And Text4.Text <> "" Then
Text6.Text = Text3.Text * Text4.Text
End If
If Command1.Caption = "Area cerchio" And Text5.Text <> "" Then
Text6.Text = (Text5.Text) ^ 2 * 3.14
End If
End Sub

Così funziona già molto meglio nel primo caso se non metto valori mi compare giustamente la msgbox che non ho inserito i valori se metto i valori mi fà il calcolo, quindi funziona perfettamente, ma negli altri due casi mi da la mgbox sia che metta i valori che se non li metto, il calcolo lo fà però comunque solo che compare questa msgbox sempre.
Qualcuno mi può aiutare a capire dove sbaglio?
Se non è tutto chiaro e credete sia necessario vi mando il file di excel dove l'ho creato, è comunque scaricabile subito da quà:
http://bluelightning.altervista.org/aree.zip
Grazie e tanti saluti

cisky
05-02-2004, 13:19
Il problema riguardo al fatto che ti compare il messaggio "tipo non corrispondente" è causato dal fatto che tu esegui delle operazioni con dei tipi stringa (Il testo delle textbox).
Dovresti invece utilizzare la funzione VAL per recuperare il valore numerico.

Il problema del MsgBox che compare sempre, semplicemente è causato dal fatto che la prima condizione IF .. THEN ... ELSE non è verificata nel caso di calcolo dell'area del quadrato o del cerchio e quindi verrà sempre eseguito il comando MSGBOX nel case else.

Mi spiego meglio

If Command1.Caption = "Area triangolo" And Text1.Text <> "" And Text2.Text <> "" Then

Se stai calcolando l'area del quadrato, la caption del command1 è "Area quadrato" e quindi la condizione IF non è verificata perciò viene eseguito il codice nella parte ELSE è cioè:

MsgBox "Inserisci i dati nei campi", vbCritical, "Dati mancanti"


Il codice giusto è questo:


Private Sub Command1_Click()

If Command1.Caption = "Area triangolo" And Text1.Text <> "" And Text2.Text <> "" Then
Text6.Text = Text1.Text * Text2.Text / 2
ElseIf Command1.Caption = "Area quadrato" And Text3.Text <> "" And Text4.Text <> "" Then
Text6.Text = Text3.Text * Text4.Text
ElseIf Command1.Caption = "Area cerchio" And Text5.Text <> "" Then
Text6.Text = (Text5.Text) ^ 2 * 3.14
Else
MsgBox "Inserisci i dati nei campi", vbCritical, "Dati mancanti"
End If
End Sub



Basarsi sul testo di un controllo non è una buona pratica di programmazione, dovresti utilizzare una variabile a livello di modulo (Magari un enum) che viene impostato quando selezioni un option Button

Esempio:



' *** Da mettere nella parte di 'Dichiarazioni'
'
Private Enum ModalitaCalcoloEnum
mcTriangolo = 0
mcQuadrato
mcCerchio
End Enum

Private m_eModalita As ModalitaCalcoloEnum

' -------------------

Private Sub Command1_Click()

Dim bDatiSet As Boolean
Dim nValore1 As Double
Dim nValore2 As Double
Dim nArea As Double

Select Case m_eModalita ' *** Impostata a livello di 'dichiarazioni'

Case mcTriangolo
nValore1 = Val(Text1.Text) > 0
nValore2 = Val(Text2.Text) > 0

bDatiSet = (nValore1 > 0 And nValore2 > 0)
' *** è meglio fare così => bDatiSet = IsNumeric(Text1.Text) AND IsNumeric(Text2.Text) ***
nArea = nValore1 * nValore2 / 2

Case mcQuadrato
nValore1 = Val(Text3.Text) > 0
nValore2 = Val(Text4.Text) > 0
bDatiSet = (nValore1 > 0 And nValore2 > 0)
nArea = nValore1 * nValore2

Case mcCerchio
nValore1 = Val(Text5.Text) > 0
bDatiSet = (nValore1 > 0)
nArea = nValore1 ^ 2 * 3.14

End Select

If bDatiSet Then
Text6.Text = CStr(nArea)
Else
MsgBox "Inserisci i dati nei campi", vbCritical, "Dati mancanti"
End If

End Sub


Ciao :)

a2000
05-02-2004, 14:21
Originariamente inviato da RunDLL
Ciao a trutti e grazie per leggere il mio problema: ho cercato di fare un piccolo programmino in VBA , semplice nulla di che, praticamente
in una Form ho inserito
3 optionbutton che se cliccati mi cambiano la caption
di un commandbutton.
Poi ho inserito 6 textbox dove nella sesta mi dovrebbe dare il risultato di alcuni calcoli rendendo i dati inseriti
nella altre textbox.
In poche parole volevo creare un programmino che inserendo i valori nelle textbox
mi calcolassero l'area del cerchio,
del quadrato
e del triangolo.
Ho impostato che al click di ogni optionbutton
mi cambiasse la caption del commandbutton
perchè al verificarsi della diversa caption
mi facesse i calcoli di una o dell'altra forma,
poi ho scritto quanto seghe
nell'evento click del commandbutton:

....




a volte è tutto scritto: basta leggere. :p

a2000
05-02-2004, 14:31
comunque numero 51078 non ti preoccupare,
in effetti tutti prima di scopare fanno quanto seghe: è una giusta esercitazione. :D

e qualcuno anche dopo.