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 Sub

A+

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 Function

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

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

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

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

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

Saches 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 Function

Remarque : 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 Sub

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

68test.zip (14.50 Ko)

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

Rechercher des sujets similaires à "declarer ligne constante public"