Comment prendre la valeur d'une cellule pour l'affecter comme variable
Je ne sais pas trop comment expliquer ce que je veux. Je vais essayer de vous dire ça.
Dans le vba de mon formulaire, je voudrais qu'on puisse définir la valeur d'une variable depuis une cellule précise, dans un onglet dédié, du fichier Excel.
En fait, actuellement, la valeur est inscrite en dur dans le vba, sous cette forme :
If Val(varLatCor) > 48.908 Then ' si la variable est supérieure à 48.908 alors VRAIPar exemple, dans le cas présent, je voudrais que la valeur 48.908 soit "puisée" depuis la cellule C4 qui est dans un onglet nommé Code_VBA dédié à cela.
J'ai 5 valeurs à pouvoir définir ainsi. Le nom de la commune, et les 4 valeurs maximales GPS.
ce qui devrait ressembler un peu à ça :
If Val(varLatCor) > (Code_VBA, C4) Then ' si la variable est supérieure à 48.908 alors VRAIEst il possible de faire de même dans un msgBox ?
MsgBox "La valeur de longitude saisie est trop à l'Est de Courbevoie." & vbCrLf & vbCrLf & _
"La longitude de Courbevoie est comprise entre 2.2301566 et 2.2836507."Dites moi si je n'ai pas été assez clair.
merci d'avance
Bonsoir Papicx,
Pour le IF :
If Sheets("Code_vba").Cells(4, 3) = 48.908 Then
Pour le message :
MsgBox "La longitude de Courbevoie est comprise entre " & Sheets("Code_vba").Cells(6, 3) & " et " & Sheets("Code_vba").Cells(7, 3)
Bonne continuation
Chris
Bonjour,
Vous pouvez aussi nommer la cellule où se trouve la donnée, puis dans votre code :
If Val(varLatCor) > [MonDeMaCellule] then
L'avantage est : si vous renommez la feuille, ou bien si vous déplacez la cellule de place par ajout de ligne ou de colonne sur la feuille Code_VBA alors le code VBA pointera toujours sur la cellule nommée, car ce nom ne prend pas en compte son adresse "physique".
L'idéal est de récupérer cette donnée dans une variable si vous vous en server souvent afin d'éviter les multiplications d'accès à la feuille ce qui ralenti le déroulement des codes VBA :
Dim LatNord
LatNord = [NomDeMaCellule]
If Val(varLatCor) > LatNord Then@ bientôt
LouReeD
Bonjour Chris1945
merci de ton aide, j'ai réussi à modifier la boite de message. ça donne ça :
varLatCor = MsgBox("La valeur de latitude saisie est trop au Nord de " & Sheets("Code_vba").Cells(3, 3) & "." & vbCrLf & vbCrLf & _
"Les latitudes de " & Sheets("Code_vba").Cells(3, 3) & " sont comprises entre :" & vbCrLf & _
"• " & Sheets("Code_vba").Cells(4, 3) & " pour la valeur la plus au Nord et " & vbCrLf & _
"• " & Sheets("Code_vba").Cells(5, 3) & " pour la valeur la plus au Sud.", vbExclamation, "VALEUR DE LATITUDE HORS DE LA COMMUNE")
Ça peut paraître banal pour vous, mais c'est top pour moi. :) Un grand merci à toi.
Pour le If , j'ai du mal m'exprimer, c'est le nombre 48.908 que je voudrais remplacer par l'adresse de la cellule
Sheets("Code_vba").Cells(4, 3)J'ai essayé ça (la ligne est en commentaire) mais, évidemment, ça ne fonctionne pas. J'ai essayé plein de caractères, avant et après, mais je sèche.
If Val(varLatCor) > 48.908 Then ' si la variable est supérieure à 48.908 pour Courbevoie alors VRAI
'If Val(varLatCor) > Sheets("Code_vba").Cells(4, 3) Then ' si la variable est supérieure à la valeur définie dans la cellule "latitude maximale" dans l'onglet "Code_vba" alors VRAIMerci d'avance.
Pour être plus précis, si ça peut vous aider à comprendre ce que j'ai fait, je vous donne le code complet de cette TextBox
Private Sub TextBoxLatCor_BeforeUpdate(ByVal Cancel As MSForms.ReturnBoolean)
Dim ValeurLatCor As Byte
Dim varLatCor As Variant
varLatCor = TextBoxLatCor.Value
If Val(varLatCor) > 48.908 Then ' si la variable est supérieure à 48.908 pour Courbevoie alors VRAI
'If Val(varLatCor) > Sheets("Code_vba").Cells(4, 3) Then ' si la variable est supérieure à la valeur définie dans la cellule "latitude maximale" dans l'onglet "Code_vba" alors VRAI
TextBoxLatCor.ForeColor = vbRed
TextBoxLatCor.BackColor = vbWhite
varLatCor = MsgBox("La valeur de latitude saisie est trop au Nord de " & Sheets("Code_vba").Cells(3, 3) & "." & vbCrLf & vbCrLf & _
"Les latitudes de " & Sheets("Code_vba").Cells(3, 3) & " sont comprises entre :" & vbCrLf & _
"• " & Sheets("Code_vba").Cells(4, 3) & " pour la valeur la plus au Nord et " & vbCrLf & _
"• " & Sheets("Code_vba").Cells(5, 3) & " pour la valeur la plus au Sud.", vbExclamation, "VALEUR DE LATITUDE HORS DE LA COMMUNE")
ElseIf TextBoxLatCor = "" Then ' si la variable est vide alors affichage des couleurs par défaut
TextBoxLatCor.ForeColor = vbBlack
TextBoxLatCor.BackColor = &H80C0FF ' couleur par défaut
MsgBox "La valeur de latitude saisie est vide."
ElseIf Val(varLatCor) < 48.887 Then ' si la variable est inférieure à 48.887 alors VRAI
TextBoxLatCor.ForeColor = vbRed
TextBoxLatCor.BackColor = vbWhite
varLatCor = MsgBox("La valeur de latitude saisie est trop au Nord de " & Sheets("Code_vba").Cells(3, 3) & "." & vbCrLf & vbCrLf & _
"Les latitudes de " & Sheets("Code_vba").Cells(3, 3) & " sont comprises entre :" & vbCrLf & _
"• " & Sheets("Code_vba").Cells(4, 3) & " pour la valeur la plus au Nord et " & vbCrLf & _
"• " & Sheets("Code_vba").Cells(5, 3) & " pour la valeur la plus au Sud.", vbExclamation, "VALEUR DE LATITUDE HORS DE LA COMMUNE")
Else ' si c'est dans la plage, affichage des couleurs par défaut
TextBoxLatCor.ForeColor = vbBlack
TextBoxLatCor.BackColor = &H80C0FF ' couleur par défaut
End If
End SubJe crois avoir trouvé :
If Val(varLatCor) > Val(Sheets("Code_vba").Cells(4, 3)) Thença fonctionne, mais est-ce que c'est correct ?
Bonjour Papicx et LouReed,
Oui c'est bien cela qu'il faut faire.
Tiens également compte des suggestions de LouReed qui améliore encore la proposition en nommant les cellules paramètres.
Bonne continuation
Chris
ok, merci à vous deux.
Je me doutais bien qu'il devait y avoir une "nomination" de cellule comme ça.
Je vais faire cela. En fait nous écrivions en même temps, du coup je ne voyais pas son message (j'ai fait plusieurs éditions en mode "Aperçu" de mon message pour qu'il soit propre et non confu.
un grand merci à vous tous.
Bonsoir,
une question me taraude :
quand je défini une variable tel que le propose LouReeD dans un "Sub" ,
Dim LatNord
LatNord = [NomDeMaCellule]Question 1 :
à première vue, il n'y a pas besoin de définir un type à la variable Dim LatNord ?
Question 2 :
Est-ce que cette variable "LatNord" peut être utilisée sans la redéfinir dans un autre "Sub" / "End Sub" ? (je suis désolé, je ne sais pas comment appelé ça), dans un même formulaire, bien entendu.
C'est pour comprendre et ne pas faire du codage de brun.
Merci bien
Bonsoir,
si vous ne définissez pas le type de la variable, VBA s'en charge, les puristes vous diront que ce n'est pas bien...
Lorsque l'on regarde les code de M Boisgontier (ici par exemple) alors qu'il est considéré (était
Donc oui, il vaut mieux typer les variables, dans mon cas exemple je ne l'ai pas fait car je ne connaissais pas vraiment le type (double ?) et plutôt que d'envoyer une erreur j'ai laissé le soin à VBA de le déterminer.
Ensuite pour le deuxième point il vous faut regarder le sujet "portée des variables".
Le contexte : vous avez sous VBA des modules (standard, classe, feuille, workbook, USF), dans ces modules vous avez des procédures Sub ou Function, partant de là un petit résumé :
Un Dim dans une procédure va créer une variable propre à cette procédure. par exemple plusieurs procédures avec des boucles For i=1 to, si le i est typé dans la procédure cela n'aura pas d'impacte sur les autres.
Un Dim en dehors d'une procédure dans un module aura une "portée" sur l'ensemble du module (existe aussi Private), cette variable pourra être utilisée sur l'ensemble des procédure du module et sa valeur sera conservée
Un Public aura quant à elle une portée sur l'ensemble des procédures et module du classeur.
Mais rendez-vous ici c'est bien expliqué, et ce cours et très bien fait, vous pouvez le reprendre à 0...
Dans mes applications, notamment ArkaLouReeD Light ! j'utilise pas mal de variable public, ceci me permet par exemple de ne pas me soucier de comment envoyer une variable à une fonction ou procédure, elle est unique dans le code et toutes modifications doit se propager à tout le code.
Certains se félicitent de faire des applications avec aucune variable public ! Cela ralentirait le fonctionnement de VBA... Cela je ne l'ai pas vérifié.
Après cela dépend de sa "vision des choses"
@ bientôt
LouReeD
Bonjour LouReed,
Un grand merci pour ces explications. j'ai bien entendu regardé la leçon mise en lien.
J'ai donc nommé mes cellules EST, OUEST, NORD, SUD et même Commune.
Ces variables sont bien reconnues dans les boites de dialogues. Elles s'affichent bien en texte.
En mettant les variables comme suggéré, ça ne reconnaît pas les valeurs des cellules.
NB : Les nombres sont des coordonnées GPS et la décimale est un point.
Peut-être est-ce là la raison de ce dysfonctionnement ?
J'ai essayé en typant à Double, Currency, ça ne change rien. Alors qu'en mettant
If Val(varLat) > Val(Sheets("Code_vba").Cells(4, 3)) Thença fonctionne.
et là, ça ne fonctionne pas.
j'ai essayé avec Val(LatNord) et Val(LatSud), pas mieux
Private Sub TextBoxLatIni_Change()
Dim varLat As Variant
varLat = TextBoxLatIni.Value
Dim LatNord
LatNord = NORD ' NORD est le nom de la cellule de la valeur latitude maximale Nord dans l'onglet Code_Vba
Dim LatSud
LatSud = SUD ' SUD est le nom de la cellule de la valeur latitude maximale Sud dans l'onglet Code_Vba
Dim Comm
Comm = COMMUNE ' COMMUNE est le nom de la cellule de la valeur "nom de la commune" dans l'onglet Code_Vba
' If Val(varLat) > 48.908 Then ' si la variable est supérieure à 48.908 pour Courbevoie alors VRAI
' If Val(varLat) > Val(LatNord) Then ' si la variable est supérieure à la valeur définie dans la cellule "latitude NORD maximale" dans l'onglet "Code_vba" alors VRAI
If Val(varLat) > LatNord Then ' si la variable est supérieure à la valeur définie dans la cellule "latitude NORD maximale" dans l'onglet "Code_vba" alors VRAI
' If Val(varLat) > Val(Sheets("Code_vba").Cells(4, 3)) Then ' si la variable est supérieure à la valeur définie dans la cellule "latitude maximale" dans l'onglet "Code_vba" alors VRAI
TextBoxLatIni.ForeColor = vbRed
TextBoxLatIni.BackColor = vbWhite
TextBoxLatIni.ControlTipText = " Latitude initiale enregistrée au DAE (non modifiable), valeur de latitude trop au Nord de Courbevoie, veuillez saisir la valeur corrigée dans la cellule à droite"""
ElseIf TextBoxLatIni = "" Then ' si la variable est vide alors affichage des couleurs par défaut
TextBoxLatIni.ForeColor = vbBlack
TextBoxLatIni.BackColor = &H80C0FF ' couleur par défaut
MsgBox "La valeur de latitude saisie est vide."
ElseIf Val(varLat) < LatSud Then ' si la variable est inférieure à 48.887 alors VRAI
' ElseIf Val(varLat) < Val(LatSud) Then ' si la variable est inférieure à 48.887 alors VRAI
' ElseIf Val(varLat) < Val(Sheets("Code_vba").Cells(5, 3)) Then
TextBoxLatIni.ForeColor = vbRed
TextBoxLatIni.BackColor = vbWhite
TextBoxLatIni.ControlTipText = " Latitude initiale enregistrée au DAE (non modifiable), valeur de latitude trop au Sud de Courbevoie, veuillez saisir la valeur corrigée dans la cellule à droite"
Else ' si non...
TextBoxLatIni.ForeColor = vbBlack
TextBoxLatIni.BackColor = &HFFC0FF ' couleur orange, par défaut
End If
End Sub
On ne doit pas être loin de la solution...
Bonsoir,
oui regardez bien mon code...
Lorsque vous nommez une cellule sur une feuille c'est pour remplacer une coordonnée de type A1 par exemple.
Sous VBA pour sélectionner A1 il faut utiliser un RANGE : Range("A1"), pour vous il en est de même sauf que A1 vous l'avez renommé NORD, donc Range("NORD").
Une écriture "plus rapide" consiste à entourer le nom de crochet : [A1] en lieu et place du Range, donc dans notre exemple : [NORD] mais il parait que ce type de référence est moins rapide pour VBA. En effet il décrypte d'abord le crochet ce qui lui dit que l'on a affaire à un Range, ensuite il cherche le Range, avec Range direct, il comprend qu'il doit chercher un Range... Bref cela se joue à pas grand chose.
NORD dans le code VBA est en fin de compte le nom d'une variable sous VBA et non une référence possible sur une feuille.
@ bientôt
LouReeD
Bonsoir,
J'ai donc mis ainsi :
Private Sub TextBoxLatIni_Change()
Dim varLat As Variant
varLat = TextBoxLatIni.Value
Dim LatNord
LatNord = Range("NORD") ' NORD est le nom de la cellule de la valeur latitude maximale Nord dans l'onglet Code_Vba
Dim LatSud
LatSud = Range("SUD") ' SUD est le nom de la cellule de la valeur latitude maximale Sud dans l'onglet Code_Vbaensuite, j'avais donc ça qui ne fonctionne pas :
If Val(varLat) > LatNord Then J'ai essayé de changer les propriétés des cellules du tableau. C'est sans effet.
J'ai donc encadré (je ne sais pas si on dit ça ainsi), la variable LatNord ainsi, et là, ça fonctionne.
If Val(varLat) > Val(LatNord) Then Je ne sais pas pourquoi la ligne que vous m'indiquiez ne fonctionne pas. Ça fonctionne peut être pour du texte ?
Votre valeur comme vous le dites est avec un point pour les décimales, hors chez moi si c'est le cas, ce n'est pas un chiffre mais du texte.
Pour tester, retirez l'alignement horizontal de la cellule, si la valeur se cale à gauche = texte, se calle à droite = chiffre.
Ce qui me conforte à dire que c'est du texte, c'est que cela fonctionne avec avec l'instruction VAL(), qui converti en chiffre une valeur texte.
@ bientôt
LouReeD
Merci de cette précision. Je note ça dans un coin de ma tête.
En tout cas, mon formulaire fonctionne au top, et c'est bien grâce à votre aide !
Du coup, non seulement les lignes de code sont plus compréhensibles, mais surtout le formulaire est applicables à la moitié du territoire de France métropolitaine, à l'Est du méridien de Greenwich, et, avec une petite correction, à l'autre moitié !
Un GRAND MERCI à VOUS TOUS !
Bonsoir,
merci à vous pour votre retour et remerciement !
@ bientôt
LouReeD