XL 2010 Utiliser les Constantes

Nicodemius

XLDnaute Nouveau
Bonsoir à Tous

Au risque d'en faire sourire certain, j'ai découvert il y a peu un nouveau "Truc" dans VBA ; Les Constantes.

Je les utilises en début de mes procédures pour référencer une seule fois les divers éléments que j'utilise dans mes Sub.

Par exemple ;
VB:
Const NomFeuille As String = "Feuil1"

Que j'utilise avec ;
Code:
Set Ws = ThisWorkbook.Sheets(NomFeuille)

ou encore ;
Code:
Const Moncontrole As String = "Toto"

Que j'utilise avec ;
Code:
With Me.Controls(Moncontrole)


Ceci étant, j'utilise aussi beaucoup de variables Tableau ainsi que des variables compteur associées à ces variables Tableau.
Mais là, je suis un peu perdu !!

Je voudrais modifier mes déclaration de variables
Code:
Dim MonTableau()
Dim IntCount as string

utilisé avec ;
Code:
For i = 1 To int_Count
MonCritere = MonTableau(i, 1)

et utiliser des constantes mais je ne sais pas comment faire.

Si quelqu'un avait une idée ...
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonjour @Nicodemius , @sylvanu , le Forum

C'est très bien d'utilser des Constantes quand on le peut.
Ceci dit la valeur d'une constante ne peut pas être modifiée lors de l'exécution du programme. On utilise donc les constantes pour donner un nom à des valeurs qui ne changent pas... qui sont constantes !!! :cool:

Ton ''MonTableau'' était variable par définition, il ne pourra jamais être une constante.

Par contre il peut être déclaré en Top de Module (à l'extérieur des Subs) de cette manière :

Public MonTableau() As Variant (si on tape Dim MonTableau() ) ca revient au même mais c'est moins 'propre/lisible'

On peut aussi le Déclarer
Private MonTableau() As Variant

La différence entre les deux, le Public est à la portée de tout le Projet, le Private est réservé exclusivement aux Sub ou Private Sub ou Functions contenues dans le même module où il a été déclaré.

Pour les Constantes c'est idem au fait pour le Public ou Private.

Voilà pour les grandes lignes.

Et comme dit Sylvanu, il y a quelque chose de louche avec IntCount as String... Un compteur est par définintion une valeur numérique, pas du teste...

Bonne Journée
@+Thierry
 

Patrice33740

XLDnaute Impliqué
J’ai pas compris ce que tu voudrais faire.
Une constante est par définition constante, elle ne peut pas être déclarée à l’aide d’une variable.
Par contre, elle peut l’être à partir d’autres constantes par exemple :

VB:
Sub test()
    Const a = "Test"
    Const b = a & " de constante"
      MsgBox b
End Sub
 

Nicodemius

XLDnaute Nouveau
Bonjour à tous.

Avant tout, merci à sylvanu, _Thierry et Patrice33740 pour leur aide si précieuse.

Oui, effectivement c'est une erreur !!
Dim IntCount as integer et non string

Mea Culpa

Au sujet de mon petit soucis, je vais tâcher d'être plus précis.

Lorsque j'ai commencé à coder sur Excel, J'ai appris à utiliser les variables Tableau.
Cela me permettait entre autre de manipuler les données sans toucher à mes feuilles.
Mais aussi de manipuler l'ordre des colonnes, de filtrer les données pertinentes et de les utiliser pour alimenter ListBox, Combobox et ListView.
J'ai peut-être pris de mauvaises habitudes, mais qui dit Excel dit Tableau, et l'emploi de ce type de variable me semblait tout indiqué.

Partant de zéro, je me suis formé sur youtube avec les vidéos de Joseph Elogo qui, au passage, ont été pour moi une véritable source d'inspiration et d'apprentissage.

A ce sujet, j'utilise régulièrement son code pour alimenter mes tableaux :

VB:
dim MyTab()
dim int_Count as integer

sub AlimenterMyTab()
dim Ws as worksheet        'Réf à la feuille de calcul
dim Lng_LastRow    as long        'dernière Ligne
dim int_Compteur as integer
dim int_Ligne as integer
dim int_col as integer

set ws = thisworkbook.sheets("Feuil1")
Lng_LastRow=ws.range("A"&rows.count).end(xlup).row

'Si le tableau est vide on quitte la procédure.
'Attention, le tableau contient 2 lignes d'en-tête
if Lng_LastRow<=2 then
    set ws = nothing
    exit sub
endif

'On remplit la variable Tableau
int_Compteur=Lng_LastRow-2
int_Count=Lng_LastRow-2
redim MyTab(int_Count,7)

for int_ligne=1 to int_Count
    for int_col=1 to 7
    MyTab(int_ligne,int_col)=ws.cells(int_ligne+2,int_col).value
    next int_col
next int_ligne

set ws = nothing

end sub

Mon soucis, c'est que ce genre de procédure se multiplient comme des petits pains.
Lorsque j'utilise cette procédure pour alimenter ma douzaine de tableau (sic), je suis bien obligé de prendre en comptes toute une série de paramètres comme le nom de ma variable tableau, le nom de la feuille, voire le nombre de colonnes etc.

Je pensais donc déclarer ces paramètres en utilisant des constantes.
Placées en début de procédure, je n'avais plus qu'à les référencer une fois pour toute sans pour autant devoir remanipuler tout mon code et ainsi éviter des erreurs.
Pour les 2 derniers, j'ai trouvé. J'utilise ;
Const NomFeuille As String = "Feuil1"
Const NbCol as Integer = 7

Et je remplace
set ws = thisworkbook.sheets("Feuil1") par set ws = thisworkbook.sheets(NomFeuille)
redim MyTab(int_Count,7) par redim MyTab(int_Count,NbCol)
for int_col=1 to 7 par for int_col=1 to NbCol

De la même manière, je pensais appeler une variable tableau pas son nom comme on le ferait avec un objet ( Controls(Moncontrole) ) ...

Après réflexion, je pense faire fausse route. Je dois retravailler ma procédure en incluant des paramètres mais je ne sais pas très bien comment faire.

J'espère ne pas vous avoir donné trop de maux de tête. Dans le cas contraire, toutes mes excuses.

Encore merci pour votre soutien à tous.
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Bonsoir et de rien !

De la même manière, je pensais appeler une variable tableau pas son nom comme on le ferait avec un objet ( Controls(Moncontrole) )

Oui ça , je serai étonné que tu y arrives...

Ceci dit, si tu as des Tableaux qui sont efficaces pour differents cas de figures ils peuvent être intégré dans une sous-sub MonTabloCasX(ByRef MyRange As Range, My Col As Integer, MyLigne As Integer, MyTruc As String, MyEtc As Etc)... Et pouvoir l'appeller et le ré-utiliser depuis plusieurs endroits... On pourrait même le mettre dans une Function selon le résultat escompté... Si ça peut t'inspirer...

Bonne Soirée
@+Thierry
 

_Thierry

XLDnaute Barbatruc
Repose en paix
Re Bonsoir

Il faudrait que je trouve un exemple, mais là je n'en ai pas sous la main...
Mais dans cette page de Microsoft vers le milieu tu verras un example assez complet :
Range object (Excel)

Bien à toi et bonne découverte
@+Thierry

Disons bien que c'est propre et unique à Excel évidemment (En VB pure ca n'existe pas, c'est pour celà que tu n'en as jamais vu probablement)
 

Nicodemius

XLDnaute Nouveau
Super !!!
Grand merci.
Tu as anticipé sans le vouloir sur ma question suivante.
Je vais étudier ça de très près et je pense que ça va me sauver la vie.
Le plus aberrant, c'est que je trouve l'aide en Anglais beaucoup plus compréhensible que l'aide en Français. Va savoir pourquoi.
Pour mon problème de Sub, je vais tenter d'inclure des paramètres pour plus de souplesse.
La suite au prochain épisode.

Encore merci Thierry et j'espère à bientôt sur un autre fil.
 

jmfmarques

XLDnaute Accro
Bonjour
c'est que je trouve l'aide en Anglais beaucoup plus compréhensible que l'aide en Français. Va savoir pourquoi.
Peut-être pour la simple raison que ce sont les lecteurs, qui, dévoyant le sens fondamental de chaque mot, chaque verbe, etc ... ont à ce point tout "estropié", que le sens simple, original et premier finit par ne plus être à la portée de leur compréhension ... :cool:
 

Patrice33740

XLDnaute Impliqué
Bonjour,

Je ne comprends pas pourquoi tu utilises une variable Privée (niveau module) et une procédure pour remplir un tableau.
Je limite systématiquement la portée de mes variable au strict minimum indispensable, et dans ce cas je n'aurais utilisé que des variables locale (niveau procédure).
Par contre pour remplir un tableau je crée une fonction : les fonction c'est fait pour ça (renvoyer quelque chose, par exemple un tableau rempli) !
Si la fonction est suffisamment réfléchie, elle peut être utilisée pour tous les tableaux.
 

Discussions similaires

Réponses
2
Affichages
233
Réponses
23
Affichages
1 K

Statistiques des forums

Discussions
312 198
Messages
2 086 114
Membres
103 121
dernier inscrit
SophieS