Utiliser les Constantes

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 ;
Const NomFeuille As String = "Feuil1"

Que j’utilise avec ;
Set Ws = ThisWorkbook.Sheets(NomFeuille)

ou encore ;
Const Moncontrole As String = "Toto"

Que j’utilise avec ;
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
Dim MonTableau()
Dim IntCount as string

utilisé avec ;
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 …

Bonjour
Un exemple de tableau dans lequel chaque élément est complété par une constante qui évolue dans une boucle

Dim Tbl As Range
Dim c As Range
Dim paramètre As Integer
Set Tbl = Range(« A1 », « B10 »)
paramètre = 1
For Each c In Tbl
Range(c.Address) = paramètre
paramètre = paramètre + 1
Next

ou à l’inverse de récupérer dans une constante l’ensemble des éléments du tableau

Dim Tbl As Range
Dim c As Range
Dim paramètre As String
Set Tbl = Range(« A1 », « B10 »)
paramètre = «  »
For Each c In Tbl
paramètre = paramètre & c & « / »
Next
MsgBox (paramètre)

Peut être cela peut-il t’éclairer

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 :

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

Bonjour à tous.

Avant tout, merci FFO, (Re)Merci Patrice33740. :grin:

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 :

option base 1

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 reflexion, 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.

Bonjour[quote=« Nicodemius, post:4, topic:6749, full:true »]
Bonjour à tous.

Avant tout, merci FFO, (Re)Merci Patrice33740. :grin:

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 :

option base 1

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 reflexion, 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.*

texte en gras

Bonjour
Petite suggestion
Pourquoi ne pas utiliser un onglet dans lequel par ligne tous les paramètres correspondant à un cas soit 12 lignes pour 12 cas en veillant à mettre dans les même colonnes les paramètres de même categorie
Juste donc à bien alimenter l onglet des lignes correspondantes une ligne par cas et autant de lignes qu il y a de cas
Puis une boucle venant récupérer ligne par ligne ces paramètres pour alimenter les variables en debut nécessaire à la procédure qui viendrait s exécuter en suivant
Ainsi une seule et même procédure avec des variables établies en début de boucle correspondant à une ligne traitée qui évolue à chaque nouvelle boucle
Juste donc à bien alimenter l onglet des lignes correspondantes une ligne par cas et autant de lignes qu il y a de cas

Peut être à essayer

Bonjour
Petite suggestion
Pourquoi ne pas utiliser un onglet dans lequel par ligne tous les paramètres correspondant à un cas soit 12 lignes pour 12 cas en veillant à mettre dans les même colonnes les paramètres de même categorie
Juste donc à bien alimenter l onglet des lignes correspondantes une ligne par cas et autant de lignes qu il y a de cas
Puis une boucle venant récupérer ligne par ligne ces paramètres pour alimenter les variables en debut nécessaire à la procédure qui viendrait s exécuter en suivant
Ainsi une seule et même procédure avec des variables établies en début de boucle correspondant à une ligne traitée qui évolue à chaque nouvelle boucle
Juste donc à bien alimenter l onglet des lignes correspondantes une ligne par cas et autant de lignes qu il y a de cas

Peut être à essayer

Merci FFO
Je vois assez bien où tu veux en venir.
Je n’ai encore jamais utilisé les onglets mais je pense m’y attarder sous peu.
Coder en VBA, c’est une grande aventure.
Mais le mieux dans tout ça c’est que, sur certains forums, on trouveras toujours quelqu’un qui vous sortira des ennuis.
Encore Merci.

Pour coder en VBA cette solution je peux te venir en aide j utilise souvent cette méthode
Il faut simplement préparer le terrain remplir un onglet des paramètres et fournir la procédure avec toutes ses variables à alimenter juste à l insérer dans une boucle

Quand tu veux

Merci Bien.
Je suis ouvert à tout (ou presque :grin: )
Tu aurais un petit exemple (Fichier Excel, Image) à me monter pour que je puisse me faire une idée…

Bonjour,

Je limites toujours la portée de mes variables au strict minimum nécessaire, donc dans ce cas pas de variables de niveau module.
Dans ton cas si tu doit acquérir différents tableaux, le plus simple est d’utiliser une fonction générique à laquelle tu transmet les paramètres nécessaires et qui te retourne le tableau renseigné.
Par exemple :

Option Explicit
Sub Test()
Dim tbl As Variant
Dim cel As Range

  ' Définir la première cellule de la plage de données à lire
  Set cel = ThisWorkbook.Worksheets(1).Range("A1")
  'ou bien n'importe quelle première cellule d'un autre classeur par exemple :
'  Set cel = Workbooks("MonClasseur.xlsx").Worksheets("MaFeuille").Range("B3")

  ' Lire le tableau VBA
  tbl = LireTableauVBA(cel, , 7)  ' à partir de A1 jusqu'à la dernière ligne sur 7 colonnes

  ' Et ensuite on fait ce qu'on veut de ce tableau VBA, par exemple :
  Dim wbk As Workbook
  Set wbk = Workbooks.Add(xlWBATWorksheet)
  Set cel = wbk.Worksheets(1).Range("B12")
  cel.Resize(UBound(tbl), UBound(tbl, 2)).Value = tbl

End Sub
Public Function LireTableauVBA(celDebut As Range, Optional nbLignes, Optional nbColonnes) As Variant
Dim rng As Range, tbl(1 To 1, 1 To 1) As Variant, drL As Long, drC As Long
  With celDebut.Parent
    ' dernière ligne
    If IsMissing(nbLignes) Then
      Set rng = .Cells.Find("*", , , , xlByRows, xlPrevious)
      If rng Is Nothing Then
        drL = celDebut.Row
      Else
        drL = IIf(rng.Row < celDebut.Row, celDebut.Row, rng.Row)
      End If
    Else
      If Val(nbLignes) = 0 Then Err.Raise 380
      drL = celDebut.Row + Val(nbLignes) - 1
    End If
    ' dernière colonne
    If IsMissing(nbColonnes) Then
      Set rng = .Cells.Find("*", , , , xlByColumns, xlPrevious)
      If rng Is Nothing Then
        drC = celDebut.Column
      Else
        drC = IIf(rng.Column < celDebut.Column, celDebut.Column, rng.Column)
      End If
    Else
      If Val(nbColonnes) = 0 Then Err.Raise 380
      drC = celDebut.Column + Val(nbColonnes) - 1
    End If
    Set rng = .Range(celDebut, .Cells(drL, drC))
    If rng.Count = 1 Then
      tbl(1, 1) = celDebut.Value
      LireTableauVBA = tbl
    Else
      LireTableauVBA = rng.Value
    End If
  End With
End Function