Déclaration variables structure code
Bonjour tout le monde,
Je souhaite mettre un peu d'ordre dans un code que j'ai bien commencé pour qu'il soit facilement compréhensible pour quelqu'un qui code un peu. Et j'aimerais que le code accepte facilement les modifications dans les bases de données.
Mais je rencontre quelques problèmes dans la déclaration et l'utilisation de mes variables.
1) Je souhaite déclarer certaine variables qui seront utilisées tout le long du code, ces variables sont définies par les choix de l'utilisateur page user.
2) Je souhaite pouvoir utiliser un array dans les différents modules. La création de cet array est défini par les choix utilisateur et un calcul.
3) Je cherche une formule pour additionner les doublons pour le M05 et le M04
Comment dois-je structurer mon code et a quel moment je déclare mes variables? Certaine variable que je je déclare en public ne garde pas leur valeur je ne comprend pas.
Il y a pour l'instant 8 modules. Celui qui concerne la déclaration des variables public est le MOO_Variables
Aussi si vous avez des remarques sur comment je pourrais améliorer le code je suis preneur.
Puisque honnêtement je viens de me mettre au VBA, j'ai donc péché des bouts de codes à gauche a droite mais disons que c'est possible de rajouter de la cohérence global. Aussi j'ai trié l'info de manière à ce que ca soit le plus exploitale possible (mais ceci selon moi). Je vous glisse deux versions :
– CONFPARTAGE v14 : avec code à jour
– CONFPRATAGE_pres : avec résultat souhaité sur page user pour vous donner une idée de l'objectif du fichier .
Le fichier à pour objectif de dresser une liste de matériel en fonction d'une configuration machine.
Etape 1 : l'utilisateur fait le choix de son matériel
--> la structure machine s'affiche
Etape 2: l'utilisateur fait le choix des piquages ouvert et fermés
--> le matériel s'affiche
Merci de votre précieuse aide!
Bonjour Bruno,
J'avais vu cette page mais cela ne m'aide aucunement dans mon problème. A savoir déclaration des variables (dont array) pour leur utilisation dans les différents modules.
Avant de poster un message sur un forum je cherche toujours la solution sur internet.
Merci pour ton aide.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Je souhaite mettre un peu d'ordre dans un code que j'ai bien commencé pour qu'il soit facilement compréhensible pour quelqu'un qui code un peu. Et j'aimerais que le code accepte facilement les modifications dans les bases de données.
Quelques remarques.
Pour qu'un code soit compréhensible, il faut des commentaires et des noms de variable parlants.
1- déclaration des variables
N'utilisez pas de références explicites mais nommez vos pages. Ex :
Public TypTrv$: TypTrv = Sheets("User").Range("F7").Valuenommer la plage : Sheets("User").Range("F7").Value en "Type_travée", votre instruction devient :
Public TypTrv$: TypTrv = Range("Type_travée").ValueLe fait de nommer cette plage garantit son invariance dans le code en cas de modification apportée dans la feuille au niveau des lignes ou colonnes.
2- emploi des noms de colonne
Vous avez mis en place des tableaux structurés, parfait mais utilisez donc les noms de colonne, cela rend le code plus clair et invariant en cas d'ajout ou de déplacement ce colonnes. Ex:
With Worksheets("Cannes")
With .ListObjects("T_Cannes")
If .DataBodyRange Is Nothing Then Exit Sub
n2 = .ListRows.Count + 1: Application.ScreenUpdating = 0
End With
Nbrsection = [F9]
If [F11] = "oui" Then Nbrsection = [F9] + 1
For i = 0 To Nbrsection
L = Val(Cells(lig, 2))
If L > 0 Then
mx = 0
For j = 2 To n2
vx = .Cells(j, 1)
If vx = TypTrv Or vx = "PAF" ThenUtilisation du nom de colonne :
With Range("T_Cannes").ListObject
If .DataBodyRange Is Nothing Then Exit Sub
Application.ScreenUpdating = 0
Nbrsection = [F9]
If [F11] = "oui" Then Nbrsection = [F9] + 1
For i = 0 To Nbrsection
L = Val(Cells(lig, 2))
If L > 0 Then
mx = 0
For j = 1 To .ListRows.Count
vx = .ListColumns("TYPE_TRAVEES").DataBodyRange.Rows(j)
If vx = TypTrv Or vx = "PAF" ThenJe prends note de ces remarques pertinentes et je vais réaliser les modifications du code aussitôt.
Merci beaucoup pour votre aide.
Bonjour @thev,
J'ai appliqué toutes les modifications que vous m'avez conseillé de faire.
Pourquoi suis-je obligé de redéclarer mes variables Piq**** (piqst par exemple) dans M02 en sachant que je les ai déclaré en public dans M01?
Pourquoi les valeurs attribués a ces variables dans le M02 ne sont pas conservés pour le M03?
Je joins le nouveau fichier avec le code à jour
Merci pour toute votre aide.
PB
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Vos variables publiques doivent être déclarées au niveau module et non au niveau d'une procédure. Comme ceci :
'Déclaration des variables qui seront utilisées dans les différents modules
'I) Choix utilisateur
Public TypTrv$
Public Machine$
Public Nbrsection$
Public HtrArr$
Public Typcanne$
Public PAF$
Public Reg$
Public Arr$
Public Canon$
Public choixmont$
Public Choixposreg$
'II) Variables types de piquages
Public PiqOuv
Public PiqSt
Public PiqTour
Public PiqRéh
Public PiqRampe
Public PiqKitroue
Public lastC
Public piq
'III) Tableau dynamique
Public tabTrv() 'nombre de piquage par travée
Sub Variables()
TypTrv = Range("Type_travée").Value
Machine = Range("Machine").Value
Nbrsection = Range("Nombre_travée").Value: If Range("PAF_oui_non").Value = "oui" Then Nbrsection = Range("Nombre_travée").Value + 1
HtrArr = Range("Hauteur_arroseurs").Value
Typcanne = Range("Type_de_canne").Value
PAF = Range("PAF_oui_non").Value
Reg = Range("Regulateur")
Arr = Range("Arroseurs")
Canon = Range("Canon")
choixmont = Range("Choix_montage") 'ex: Souple_3_Simple_Sans_tirants // réf disponible tab Cannes!
Choixposreg = Range("Choix_pos_regulateurs") 'ex: Souple_Régulateur_en_bas // réf disponible tab Montage!
End SubBonjour Thev,
J'ai suivi la procédure que tu m'as partagée.
Mais
– dans le M03 si je supprime
Dim TypTrv$: TypTrv = Range("Type_travée").Valuej'ai un message d'erreur alors que je l'ai déjà définis dans le M00
– dans le M03 si j'ajoute
MsgBox Join(tabTrv, vbCrLf)en considérant que tabTrv est un array que je déclare dans le M00 auquel je donne des valeurs dans le M02, j'ai un message d'erreur.
_ dans le M03 si j'ajoute
MsgBox nbrsectionJ'ai aussi un message d'erreur, si je déclare une seconde fois dans ce module j'ai effectivement un message mais j'ai pas le nombre de sections qui a été calculé dans le M02.
Je suis peut être obligé de tout écrire dans le même module mais ce n'est pas pratique tout de même.
Voilà si tu peux m'éclairer sur ces points ça serait merveilleux.
Bonne journée
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
– dans le M03 si je supprime
Dim TypTrv$: TypTrv = Range("Type_travée").Valuej'ai un message d'erreur alors que je l'ai déjà définis dans le M00
Il te manque dans le module Main, l'initialisation de tes variables. Y ajouter une étape 0
Sub étape0()
Call Variables
End Sub– dans le M03 si j'ajoute
MsgBox Join(tabTrv, vbCrLf)en considérant que tabTrv est un array que je déclare dans le M00 auquel je donne des valeurs dans le M02, j'ai un message d'erreur.
_ dans le M03 si j'ajoute
MsgBox nbrsectionLes variables "tabTRV" et "nbrsection" sont définies plusieurs fois :
_ Tabtrv est défini dans M00 et M02
_ nbrsection est défini dans M02 et M03
Ok merci thev ! j'ai l'impression que ça marche en déclarant qu'une seul fois et en appelant le module variables.
Du coup pour clôturer le sujet j'ai un ultime problème qui est lié à ma création de tableau sans doublons des longueur cannes générées.
j'ai écris ce code :
Sub Tubes()
'CREATION D'UN TABLEAU SANS DOUBLON DES LONGUEUR CANNES
Dim tabtube()
'Dim nbrsection As Byte
Dim i As Byte
Dim j As Byte
Dim z As Byte
Dim lig As Byte
Dim derniereL
nbrsection = 3
tabtube() = Array(0, 1)
lig = 20
For i = 0 To nbrsection - 1 'autant de fois que de sections
For j = 1 To tabTrv(i) 'autant de fois que de piquages
For z = 0 To tabtube(z, 0) 'autant de fois que de cellule dans le tableau créé
'avec tabtube(z,1)= taille du tube et tabtube(z,0) nombre de doublons
'si le doublon existe
If Cells(lig, 3 + j).Value = tabtube(z, 1).Value Then tabtube(z, 0) = tabtube(z, 0) + 1
'si le doublon n'existe pas
ReDim Preserve tabtube(z, 1)
tabtube(z, 0) = 1
tabtube(z, 1) = Cells(lig, 3 + j).Value
Next z
Next j
lig = lig + 5
Next i
derniereL = Sheets("User").Cells(Rows.Count, 1).End(xlUp).Row + 10
Sheets("User").Cells(derniereL - 2, 3) = "Matériel pour canne de dessente"
Worksheets("User").Cells(derniereL, 3).Resize(UBound(tabtube, 1), UBound(tabtube, 2)).Value = tabtube
'MsgBox Join(tabTrv, vbCrLf)
End SubMais j'ai l'impression qu'il manque quelque chose à la boucle for qui permet de comparer avec les valeurs du tableau tabtube et les valeurs de la liste. Comme au début mon tableau est vide la boucle ne dois pas pouvoir se lancer.
Je joints le fichier si tu veux essayer.
Merci beaucoup de ton aide
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Le Redim Preserve n'agit pas sur la première dimension du tableau mais sur la dernière. Essayer plutôt ce code
Sub Tubes()
'CREATION D'UN TABLEAU SANS DOUBLON DES LONGUEUR CANNES
Dim tabtube()
'Dim nbrsection As Byte
Dim i As Byte
Dim j As Byte
Dim k As Byte
Dim z As Byte
Dim lig As Byte
Dim derniereL
nbrsection = 3
lig = 20
For i = 0 To nbrsection - 1 'autant de fois que de sections
k = 0
For j = 1 To tabTrv(i) 'autant de fois que de piquages
ReDim Preserve tabtube(k)
tabtube(k) = Array(Cells(lig, 3 + j).Value, 1)
k = k + 1
For z = 0 To UBound(tabtube) 'autant de fois que de cellule dans le tableau créé
'avec tabtube(z,1)= taille du tube et tabtube(z,0) nombre de doublons
'si le doublon existe
If Cells(lig, 3 + j).Value = tabtube(z)(0) Then tabtube(z)(1) = tabtube(z)(1) + 1
Next z
Next j
lig = lig + 5
Next i
derniereL = Sheets("User").Cells(Rows.Count, 1).End(xlUp).Row + 10
Sheets("User").Cells(derniereL - 2, 3) = "Matériel pour canne de dessente"
Worksheets("User").Cells(derniereL, 3).Resize(UBound(tabtube) + 1, 2).Value = Application.Transpose(Application.Transpose(tabtube))
'MsgBox Join(tabTrv, vbCrLf)
End SubBonjour Thev,
Il rajoute donc des lignes mais je pensais que les lignes était la première dimension?
Bon ca fait un petit moment que je tourne le code dans tout les sens et il n'y a rien à faire.. J'ai toujours des doublons et le compte n'est pas bon mais il y a effectivement un array à deux dimension qui se crée, je pense que le souci doit venir de la condition à l’incrémentation en ligne dans le tableau ou en nombre dans la deuxième colonne.
Pour bien comprendre, ici :
tabtube(0) = array(820, 1)Nous disons : pour le tableau tabtube à la ligne 0, 1ère colonne équivaut à 820, deuxième colonne équivaut à 1 ?
Je me demande si il ne faudrait pas comparer d'abord au tableau puis si il n'y a pas de doublons ensuite incrémenter une ligne ce que j'ai essayé mais je n'arrive pas à m'en sortir. Je suis bloqué.
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Je ne suis pas rentré dans le détail de votre code et ai juste corrigé l'incrémentation de votre tableau
Pour bien comprendre, ici :
tabtube(0) = array(820, 1)
tabtube(1) = array(930, 2)820 représente la colonne 1 de la ligne 1 et 1 (nombre de doublons) la colonne 2 de la ligne 1
930 représente la colonne 1 de la ligne 2 et 2 (nombre de doublons) la colonne 2 de la ligne 2
Bonjour Thev,
Merci pour tes précisions, en gros j'ai deux possibilités qui ne marchent pas mais peut être que tu verras quelque chose
1) J'ai essayé avec un if not mais comme il est en dehors de la boucle je crois que le z n'est peut être plus en mémoire
Sub Tubes()
'CREATION D'UN TABLEAU SANS DOUBLON DES LONGUEUR CANNES
Dim tabtube()
lig = 20
For i = 0 To nbrsection - 1 'autant de fois que de sections
k = 0
For j = 1 To tabTrv(i) 'autant de fois que de piquages
If j > 1 Then
For z = 0 To UBound(tabtube) 'autant de fois que de cellule dans le tableau créé
'avec tabtube(z,1)= taille du tube et tabtube(z,0) nombre de doublons
'si le doublon existe
If Cells(lig, 3 + j).Value = tabtube(z)(0) Then
tabtube(z)(1) = tabtube(z)(1) + 1
Exit For
End If
Next z
If Not Cells(lig, 3 + j).Value = tabtube(z)(0) Then
End If
ReDim Preserve tabtube(k)
tabtube(k) = Array(Cells(lig, 3 + j).Value, 1)
k = k + 1
End If
Next j
lig = lig + 5
Next i
End Sub2) Je sais que je ne peux pas écrire deux fois next i mais c'est la logique que je souhaite appliqué
Sub Tubes()
'CREATION D'UN TABLEAU SANS DOUBLON DES LONGUEUR CANNES
Dim tabtube()
lig = 20
For i = 0 To nbrsection - 1 'autant de fois que de sections
k = 0
For j = 1 To tabTrv(i) 'autant de fois que de piquages
If j > 1 Then
For z = 0 To UBound(tabtube) 'autant de fois que de cellule dans le tableau créé
'avec tabtube(z,1)= taille du tube et tabtube(z,0) nombre de doublons
'si le doublon existe
If Cells(lig, 3 + j).Value = tabtube(z)(0) Then
tabtube(z)(1) = tabtube(z)(1) + 1
Exit For
Next i
End If
Next z
ReDim Preserve tabtube(k)
tabtube(k) = Array(Cells(lig, 3 + j).Value, 1)
k = k + 1
End If
Next j
lig = lig + 5
Next i
End SubSi tu as une idée ou une fonction qui pourrait marcher je suis preneur, dans tout les cas merci pour ton aide!
Bonne soirée
- Messages
- 4'199
- Excel
- 2021 FR 64 bits
- Inscrit
- 13/06/2016
- Emploi
- bénévole associations Goutte d'Or
Bonjour,
Essayer ce code
Sub Tubes()
'CREATION D'UN TABLEAU SANS DOUBLON DES LONGUEUR CANNES
Dim tabtube(): tabtube = Array()
lig = 20
For i = 0 To nbrsection - 1 'autant de fois que de sections
k = 0
For j = 1 To tabTrv(i) 'autant de fois que de piquages
If j > 1 Then
For Z = 0 To UBound(tabtube) 'autant de fois que de cellule dans le tableau créé
'avec tabtube(z,1)= taille du tube et tabtube(z,0) nombre de doublons
'si le doublon existe
If Cells(lig, 3 + j).Value = tabtube(Z)(0) Then tabtube(Z)(1) = tabtube(Z)(1) + 1: Exit For
Next Z
If Z > UBound(tabtube) Then ReDim Preserve tabtube(k): tabtube(k) = Array(Cells(lig, 3 + j).Value, 1): k = k + 1
End If
Next j
lig = lig + 5
Next i
End SubBonjour,
Merci pour votre aide mais ça ne marche pas : j'obtiens un seul élément.
Peut être connaissez vous une fonction qui supprime les doublons en les additionnant?