Comment prendre la valeur d'une cellule pour l'affecter comme variable

Bonjour
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 VRAI

Par 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.

valeurs maximale gps 001

ce qui devrait ressembler un peu à ça :

If Val(varLatCor) > (Code_VBA, C4)  Then    ' si la variable est supérieure à 48.908 alors VRAI

Est 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

image

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")
capture d ecran 2024 09 08 111020

Ç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 VRAI

Merci 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 Sub

Je 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 ) comme un "grand" en VBA, on s'aperçois qu'il y a rarement de typage de variables. Ceci dit cela fait perdre "du temps" à VBA car pour travailler sur une variable il a besoin d'en connaître.

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" A chacun son style !

@ 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
capture d ecran 2024 09 09 171805

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_Vba

ensuite, 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

Rechercher des sujets similaires à "comment prendre valeur affecter comme variable"