Variable a utiliser dans plusieurs modules et sub

Bonjour,

J'ai besoin pour une générer un pdf de connaitre la taille d'une parti de mon doc. Il se trouve que j'insére des lignes à certain moment.

Voila ce que j'ai essayé de faire

Dim nLigne As Byte
'déclaration du nombre de ligne au début des évèenements
nLigne = 10

Sub actionInsertion()

'Ici j'ai ma fonction pour insérer mes lignes que j'appelle quand j'en ai besoin une ou plusieurs fois

'A chaque fois que je l'appelle je veux ajouter 1 à mon nombre de ligne 

nLigne = nLigne + 1

End Sub

Sub generationPdf()

'Je sélection la zone
Range("A1:H" & nLigne).Select

'Après j'execute le tout ce qu'il faut pour créer le pdf et à la fin je voudrai que ma variable récupère sa valeur initiale
nLigne = 10

End Sub

Sauf que j'ai une erreur des le début quand j'affecte 10 a ma variable.

J'aimerai donc savoir comment déclarer une variable avec une valeur pour tout mon module et qu'elle puisse être modifier par mes fonctions.

J'ai testé de mettre Public Const nLigne As Byte = 10, sauf que après je ne peux plus la modifier vu que c'est une constante ça bloque.

Sollution trouvé !

Public nLigne As Byte

Sub lancementApp()

    'J'ai rajouté une fonction que j'execute au début, je déclare la valeur par défault ici
    'déclaration du nombre de ligne au début des évèenements
    nLigne = 10

End Sub

Sub actionInsertion()

           'Ici j'ai ma fonction pour insérer mes lignes que j'appelle quand j'en ai besoin une ou plusieurs fois

    'A chaque fois que je l'appelle je veux ajouter 1 à mon nombre de ligne 

    nLigne = nLigne + 1

End Sub

Sub generationPdf()

    'Je sélection la zone
    Range("A1:H" & nLigne).Select

    'Après j'execute le tout ce qu'il faut pour créer le pdf et à la fin je voudrai que ma variable récupère sa valeur initiale. Il n'est pas obligatoire de mettre celà ici si après la génération du pdf on relance la premiere focntion
    nLigne = 10

End Sub

Bonjour,

Si tu restes dans le même module, tu peux même la déclarer en private au lieu de public. Cela sera à priori moins consommateur de ressources.

Hello h2so4 ! Confirmes-tu le côté private/public ?

Bonjour,

je n'utiliserais pas le type byte pour typer nligne (tu vas être limité à 255 lignes), utilise Long plutôt, ce qui est de toute façon ce que vba utilise en interne.

Bonjour JoyeuxNoel,

tu peux même la déclarer en private au lieu de public. Cela sera à priori moins consommateur de ressources.

Hello h2so4 ! Confirmes-tu le côté private/public ?

Merci de me considérer comme détenteur de la connaissance VBA, mais tu vas être déçu, c'est loin d'être le cas !

je ne peux ni confirmer ni infirmer. Je peux tout au plus faire une supposition.

Private ou Dim en tête de module, limite la portée d'une variable au module.

Global ou Public en tête de module, définit la portée d'une variable sur tout le projet.

dans les 2 cas cela réserve une même quantité d'espace mémoire, et dans les 2 cas VBA devra vérifier si la variable est private ou public.

Donc selon moi, pas d'avantage en terme de ressource mémoire, ni en terme de ressource processeur.

Mais les prémisses de mon raisonnement peuvent être complètement à côté de la plaque.

Merci pour ta réponse !

Je ne sais pas si tu es détenteur de la connaissance VBA mais, en tout cas, tu m'as apporté énormément de choses dans le domaine depuis que je suis ici !

Pour ce qui est de notre sujet ici, il me semblait avoir retenu cela d'une intervention de PatrickToulon qui LUI, est reconnu comme détenteur de LA connaissance en tout cas. Du moins par lui-même. Du coup c'est pour ça que j'étais à peu près sûr de moi .

Mais je ne peux certifier qu'il l'ait vraiment dit. Il faudrait que je creuse plus.

Bonjour,

Mais du coup j'en profite pour poser une question con où je vais surement me faire taper sur les doigts mais ... Pourquoi déclarer le type de variable si VBA l’interprète en interne ?

Je suis un gros fainéant désolé !

Bonne journée !

bonjour,

Bonjour,

Mais du coup j'en profite pour poser une question con où je vais surement me faire taper sur les doigts mais ... Pourquoi déclarer le type de variable si VBA l’interprète en interne ?

Je suis un gros fainéant désolé !

Bonne journée !

Sorry je me suis mal exprimé,

sur un ordinateur 64 bits, le processeur travaille avec des données stockées sur 64 bits (= long). Comme c'est l'unité avec laquelle il travaille, il doit faire un travail supplémentaire pour d'abord réduire en 8bits (=byte) et faire le calcul et vérifier que la limite de ce que l'on peut stocker sur 8 bits n'est pas dépassée.

(ps Sur un ordinateur 32 bits, le processeur travaille avec des données stockées sur 32 bits (= integer).)

Pour moi, travailler en integer ou en byte sur un ordinateur 64 bits, n'est pas utile, Sauf si on veut délibérément provoquer une erreur en cas de dépassement de la limite de ce que l'on peut stocker dans un integer ou un byte, ou si on doit échanger des données avec un autre programme (via mémoire, fichier ou base de données).

A nouveau mes prémisses peuvent être incorrects.

Pour moi, travailler en integer ou en byte sur un ordinateur 64 bits, n'a pas de sens

Ouais bon après, si ce qu'on fait doit avoir un sens, on ne s'en sort plus

Bonsoir JoyeuxNoel,

Ouais bon après, si ce qu'on fait doit avoir un sens, on ne s'en sort plus

Bonsoir …

« La lanterne de la connaissance n’éclaire que ceux qui l’ont. »

Humble avis :

« Public » en tête de gondole d’un Module (de feuille ou pas) est le type de déclaration pour une variable utilisée dans plusieurs macros sachant qu’à chaque fois la valeur se garde*

Pour récupérer la valeur initiale , il suffit de ne pas la changer !

exemple

Option Explicit
Public nLigne As Long, k As Long
Sub lancementApp()
  'J'ai rajouté une fonction que j'execute au début, je déclare la valeur par défault ici
  'déclaration du nombre de lignes au début des évènements
  nLigne = 10
End Sub
Sub actionInsertion()
  'Ici j'ai ma fonction pour insérer mes lignes que j'appelle quand j'en ai besoin une ou plusieurs fois
  k = nLigne
  While k < 50 'A chaque fois que je l'appelle je veux ajouter 1 à mon nombre de ligne
    k = k + 1
  Wend
End Sub
Sub generationPdf()
  'Je sélection la zone
  Range("A1:H" & k).Select: k = 0 ‘pour retrouver la valeur initiale de cette variable
  'Après j'exécute le tout ce qu'il faut pour créer le pdf et à la fin je voudrai que ma variable récupère sa valeur    initiale. Il n'est pas obligatoire de mettre celà ici si après la génération du pdf on relance la premiere focntion
End Sub
Sub fait()
  lancementApp
  actionInsertion
  generationPdf
  MsgBox "début nligne = " & nLigne & " et début k = " & " " & k
End Sub

* Attention : la valeur de ce type de variable se garde aussi dans les macros d’une autre feuille , ce qui peut poser problème ! Dans ce cas la déclarer à nouveau pour la réinitialiser en Public ou pas.

Pour éviter cela la déclarer en Private dans le module du départ où elle ne sera qu’opérante.

Bonjour à tous,

Pour vous répondre j'utilise Byte car dans le cadre de mon exécution je ne dépasserai jamais 30/40. Donc il ne me semblait pas utile d'utiliser un long pour cette variable sauf si c'est mieux pour les performances.

Rechercher des sujets similaires à "variable utiliser modules sub"