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!

17confpartage-v14.xlsm (145.13 Ko)
11confpartage-pres.xlsm (134.30 Ko)

Bonjour Barns

Voici ce qui devrait vous convenir

Cours VBA : les variables (excel-pratique.com)

@+

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.

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").Value

nommer la plage : Sheets("User").Range("F7").Value en "Type_travée", votre instruction devient :

Public TypTrv$: TypTrv = Range("Type_travée").Value

Le 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" Then

Utilisation 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" Then

Je 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

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 Sub

Bonjour 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").Value

j'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 nbrsection

J'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

11confpartage-v16.xlsm (146.66 Ko)

Bonjour,

– dans le M03 si je supprime

Dim TypTrv$: TypTrv = Range("Type_travée").Value

j'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 nbrsection

Les 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 Sub

Mais 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

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 Sub

Bonjour 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é.

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 Sub

2) 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 Sub

Si 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

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 Sub

Bonjour,

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?

Rechercher des sujets similaires à "declaration variables structure code"