Déclarer une ligne d'une cellule en constante public
Bonjour à tous
Avant de poser ma question, je precise que je suis sur mon iphone donc petits risques de mauvaise mise en forme de mon message.
Voilà, j'ai un petit soucis, je voudrais déclarer une variable public de cette manière:
Public const Ma_variable as integer = range("ma_cellule").row
Seulement, ça ne marche pas, j'ai cette erreur:
Erreur de compilation : Constante requise
(Et il me surligne: .row)
Pouvez vous m'aider? Merci beaucoup à tous
Bonjour,
Seuls les modules standard (Module1) peuvent avoir des "Public const"
A+
Merci pour ta réponse galopin.
Pourtant j'ai bien déclaré cette constante dans un module standard...
(Ie: pas dans une procédure, j'ai seulement crée un nouveau module et y ai inséré cette déclaration)
À moins d'avoir mal compris ta réponse, comment faire pour que cela fonctionne? ;(
Bonjour,
Essaie en utilisant cette forme
Public MaVariable As Long
Sub test()
MaVariable = ThisWorkbook.Worksheets("Feuil1").Range("ma_cellule").Row
End SubA+
Merci frangy,
J'avais pensé à cette solution...mais j'étais pas convaincu que ça marcherai.
J'ai quand même testé ça marche +ou-. C'est à dire:
Il faut que je lance la procédure "test" avant.... ie je ne peux pas directement utiliser Mavariable dans une procédure si je n'ai pas appelé la procédure de "test" avant.... Du coup ça en revient à la déclarer classiquement (via la procédure "test") à chaque fois que j'en ai besoin en debut d'une procédure...
Bonjour,
En effet, on ne peut pas déclarer comme ceci une constante.
Tu peux utiliser des opérateurs arithmétiques et logiques pour combiner plusieurs constantes, mais pas utiliser d'autres Méthodes ou Propriétés...
Tu peux néanmoins procéder de la sorte :
1- Pour utiliser dans une seule procédure le numéro de la ligne
- Une constante contenant le nom du Range nommé
- Une fonction qui récupère le numéro de la ligne
Public Const NomRange As String = "toto"
Sub MaMacro()
Dim Lig As Long
For Lig = 1 To MaLigne(NomRange)
'Action
Next
End Sub
Function MaLigne(Texte As String) As Long
MaLigne = Range(Texte).Row
End Function2- Pour utiliser le numéro de la ligne dans tout le projet :
Public Const NomRange As String = "toto"
Public MaLigne As Long
Sub MaMacro()
Dim Lig As Long
MaLigne = Range(NomRange).Row
For Lig = 1 To MaLigne
'Action
Next
End SubPardon pour le retard.
Merci Franck pour ta réponse. J'ai réalisé ta proposition. Cependant j'aurai du être plus explicite dans ma question.
En effet,je souhaite récupérer la valeur "MaLigne" comme tu l'as appelé, mais comme ceci (une démo vaut mieux qu'une longue phrase):
Module 1:
'ça ne s'adapte à priori pas à ce que je veux faire via le module 2 ci dessous mais je reprends ton exemple pour mieux illustrer la problématique
Public Const NomRange As String = "ligne"
Public MaLigne As Long
Sub MaMacro()
Dim Lig As Long
MaLigne = Range(NomRange).Row
End SubModule 2:
Sub Grande_macro()
'Infime échantillon de la procédure
For Each cell In Range(Cells(MaLigne, 3), Cells(15, 6))
'blablaba
'blablaba
'blablaba
'blablaba
'blablaba
Next
End SubTon exemple permettait il de faire ça où bien c'est moi qui ai mal goupillé le code? Car après avoir donné un nom à une cellule ("Maligne" en l'occurance) j'ai essayé ça avec ton idée:
Module 2:
Sub test()
'J'ai modifié le nom d'une cellule au pif (A1 par ex, que j'ai nommé "ligne" pour bien correspondre à la constante que tu as déclarée publique) et du coup je veux accéder à la valeur de la ligne de cette cellule (contenue dans "Maligne" donc) :
MsgBox MaLigne
End SubEt cela ne fonctionne pas... je n'ai surement pas suffisamment extrapolé ta proposition...?
Bonjour,
Que se passe t'il avec ton exemple Module1 et Module2?
Si tu lances ta Grande_macro (Module2) sans avoir, au préalable lancé MaMacro (Module1), la variable MaLigne n'a pas encore de valeur. Il te faut d'abord exécuter MaMacro pour affecter une valeur à la variable MaLigne puis exécuter Grande_macro.
Pour cela, tu peux exécuter MaMacro depuis Grande_macro, comme ceci :
Public Const NomRange As String = "ligne"
Public MaLigne As Long
Sub MaMacro()
MaLigne = Range(NomRange).Row
End Sub
Sub Grande_macro()
'Infime échantillon de la procédure
Call MaMacro
For Each cell In Range(Cells(MaLigne, 3), Cells(15, 6))
'blablaba
'blablaba
Next
End SubSaches néanmoins faire la différence entre une procédure et une fonction. C'est une bonne base de départ.
Une procédure est une fonction (ensemble d'instructions) qui ne retourne pas de valeur. Une fonction est une fonction (ensemble d'instructions) qui retourne une valeur. Dans ton cas, MaMacro sert à calculer une valeur, celle de MaLigne. Je te recommande donc d'utiliser une fonction pour la calculer. Ainsi, tu n'as plus besoin de variable public. C'est l'exemple que je t'avais mis plus haut :
Public Const NOM_RANGE As String = "toto"
Sub Grande_macro()
Dim Cel As Range
For Each Cel In Range(Cells(MaLigne(NOM_RANGE), 3), Cells(15, 6))
'Action
Next
End Sub
Function MaLigne(Texte As String) As Long
MaLigne = Range(Texte).Row
End FunctionRemarque : Une fonction qui ne contient qu'une unique ligne de code (comme dans cet exemple), est inutile. En effet, il est aisé d'intégrer cette ligne de code dans le code appelant.
Ainsi l'exemple donné ci-dessus donnerait :
Public Const NOM_RANGE As String = "toto"
Sub Grande_macro()
Dim Cel As Range
For Each Cel In Range(Cells(Range(NOM_RANGE).Row, 3), Cells(15, 6))
'Action
Next
End SubRemarques complémentaires :
1- Ne pas utiliser le mot cell comme variable. Il s'agit d'un mot réservé par VBA (Cells). Privilégie, par exemple, un nom explicite, du genre rgCell (rg pour Range et Cell pour....cellule)
2- Si ta Grande_macro travaille sur les cellules d'une feuille excel, il te faut dès à présent te former sur les variables de type tableau. Cela te fera gagner du temps d'exécution et de "l'agilité"... Surtout en cas de macro avec beaucoup de lignes de code.
Bonjour,
Il faut que je lance la procédure "test" avant.... ie je ne peux pas directement utiliser Mavariable dans une procédure si je n'ai pas appelé la procédure de "test" avant.... Du coup ça en revient à la déclarer classiquement (via la procédure "test") à chaque fois que j'en ai besoin en debut d'une procédure...
Tu ne peux pas déclarer Ma_variable comme constante alors qu'elle est variable, puisque dépendante de la valeur de la cellule nommée "ma_cellule".
Si la variable est déclarée Public dans la zone de déclaration d'un module standard, elle aura pour portée le projet entier et pour durée de vie la durée du projet.
Voici un exemple dans lequel on affecte une valeur à Ma_variable à l’ouverture du classeur.
Les procédures des trois feuilles utilisent cette variable.
A+
Merci infiniment à vous pour votre réactivité et pour vous explications, qui sont toutes très claires. Je dois effectivement acquérir plus de rigueur dans mes lignes de codes mais aussi me simplifier la vie (je pense notamment aux tableaux....que j'évite d'utiliser car je trouve ça chiant à coder, mais c'est certain que cela fait pourtant gagner du temps d’exécution et du temps de codage).
Vous avez parfaitement répondu à ma question.
Encore désolé pour la réponse un peu tardive. Vous êtes bien meilleurs que moi, ça fait plaisir d'apprendre grâce à vous
Cédric