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.
Bonjour Nicodemius,
Plutôt vague comme requête. Vous pouvez préciser ?
Déjà, si int_Count est un nombre, sa déclaration doit être
Dim IntCount as integer ( ou byte ou long suivant votre besoin )
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 !!!
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...
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
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.
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...
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)
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.
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 ...
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.
@Patrice33740
Alors là, tu m'interresse au plus haut point.
Si tu pouvais me donner un exemple de fonction et me dire où envoyer la boite de chocolats....