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.
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)
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
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.
Bonjour[quote=« Nicodemius, post:4, topic:6749, full:true »]
Bonjour à tous.
Avant tout, merci FFO, (Re)Merci Patrice33740.
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
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
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
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