IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Reordonner un tableau excel avec macro [XL-2003]


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut Reordonner un tableau excel avec macro
    Bonjour tout le monde,

    J’ai beaucoup de mal a faire une macro pour mieux reordonner des donnees brutes en ma possession.

    Je vous serai tres reconnaissant si vous pouviez me donner un coup de pouce.

    J’ai une feuille de donnees brutes’Rapport’ (nom de projet, montant, entreprise proprietaire) et une feuille 'Table qui me specifie les statuts des proprietaires de projets (public ou prive).

    Je souhaite a partir de ces deux feuilles generai une feuille ‘public’ un tableau ou je rescence les enterprises et projets publics auxquelles elles participant.
    (Je souhaite faire la meme chose avec un onglet reserve pour les projets prives)

    Voila les details pour la feuille ‘Rapport’:

    Colonne A: Nom des projets
    Colonne E: Montant
    Colonne L: Entreprise (par moment on a Bouygues*Vinci*Colas ce aui veut dire que plusieurs enterprises participant au projet bouygues, vinci et colas)
    Colonne N: nom du Proprietaire

    Voila pour les details pour la feuille ‘Table’:

    Colonne A: nom du Proprietaire
    Colonne B: Statut (public ou prive)

    Voila pour les details pour la feuille 'Resultat' que je souhaite generer:

    Cette feuille est un tableau

    Colonne A: liste des enterprises
    Ligne 1: Noms projets publics / Montants (Recuperes de la feuille ‘Rapport’)

    Et les cases de croisements enterprise et leurs projets devraient etre noircies

    Voila voila, merci beaucoup pour votre aide d’avance.

    Je reste a votre disposition pour vous addresser un exemple de fichier excel pour illustrer ce que je viens d’expliquer dans mon message.

    Merci beaucoup pour votre temps.

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    Code à mettre dans un module
    Il ne restera qu'un peu de mise en forme
    Testé avec ton fichier -> ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    Option Explicit
     
    Sub Deconcatanate()
    Dim wshTable As Worksheet, wshPublic As Worksheet 'les feuilles
    Dim rngFind As Range, rngFindEnt As Range 'pour la recherche
    Dim rngPlage As Range ' plage de cellules
    Dim strTxt As String 'texte divers
    Dim rngPub As Range, intB1 As Integer, rngB2 As Range 'les boucles
    Dim intCol As Integer, lngRow As Long 'ligne et colonne ou ecrire
     
    Set wshTable = Worksheets("Table")
    Set wshPublic = Worksheets("Public")
     
    'A décommenter pour vider la feuille avant le traitement
    'wshPublic.Cells.Delete Shift:=xlUp
     
    With Worksheets("Rapport")
      'boucle pour trouver les propriétaire au status plublic
      For Each rngPub In wshTable.Range("B2:B" & wshTable.Range("B2").End(xlDown).Row)
        's'il est public
        If UCase(rngPub.Value) = "PUBLIC" Then
          'on le recherche la ligne correspondante dans la feuille Rapport
          Set rngPlage = .Range("N2:N" & .Range("N2").End(xlDown).Row)
          Set rngFind = rngPlage.Find(rngPub.Offset(0, -1).Value, LookIn:=xlValues, lookat:=xlWhole)
          's'il y a une correspondance
          If Not rngFind Is Nothing Then
            'Ecriture du projet / Montant dans la feuille Public
            strTxt = .Cells(rngFind.Row, 1) & " / " & .Cells(rngFind.Row, 5)
            intCol = wshPublic.Cells(1, Columns.Count).End(xlToLeft).Column + 1
            wshPublic.Cells(1, intCol) = strTxt
     
            'Ecriture des entreprise
            'boucle dans les différents Entreprises de la cellule
            For intB1 = 0 To UBound(Split(.Cells(rngFind.Row, "L"), "*"))
              'Est-ce que l'entreprise à déja été écrite dans la Feuille Public
              Set rngPlage = wshPublic.Range("A2:A" & wshPublic.Cells(Rows.Count, 1).End(xlUp).Row)
              strTxt = Trim(Split(.Cells(rngFind.Row, "L"), "*")(intB1))
              Set rngFindEnt = rngPlage.Find(strTxt, LookIn:=xlValues, lookat:=xlWhole)
              'oui
              If Not rngFindEnt Is Nothing Then
                'oui -> noter la ligne
                lngRow = rngFindEnt.Row
              Else
                'non -> l'écrire et noter la ligne
                lngRow = wshPublic.Cells(Rows.Count, 1).End(xlUp).Row + 1
                wshPublic.Cells(lngRow, 1) = strTxt
              End If
              'passer la cellule de croisement entreprise / projet en jaune
              wshPublic.Cells(lngRow, intCol).Interior.ColorIndex = 6
            Next
          End If
        End If
      Next
    End With
     
    wshPublic.Cells.EntireColumn.AutoFit
     
    'pour terminer proprement
    Set wshTable = Nothing
    Set wshPublic = Nothing
    End Sub
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  3. #3
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Merci beaucoup Zyhack,

    Le code marche tres bien, ca m’aide beaucoup mais malheureusement dans mon vrai fichier excel ca me retourne un tres grand tableau, alors j’ai une question:est ce que c’est possible de restreindre la recherche sur les projets representants les plus grands montants (tel que la somme des montants soit superieure a 60 pour cent de la valeur totale des projets)?

    comme dans mon cas l'ordre des colonnes de ma feuille initiale de donnees 'Rapport' peut changer, est ce que c'est possible de defiger les recherches dans le code(exemple au lieu de faire une recherche sur la colonne N, faire la recherche sur la colonne ayant comme titre Proprietaire)?

    Merci beaucoup encore une fois pour l’aide Zyhack.

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonsoir

    le code est modifié pour utiliser des N° de colonnes Montant, Entreprise et Propriétaire qui peuvent être déplacés.

    je l'ai modifié aussi pour que les plus grands montants tel que la somme des montants soit superieure a 60 pour cent de la valeur totale des projets

    sommes des x plus gros montant > Total des montant * 0.6 soient utilisés

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
     
    Option Explicit
     
    Sub Deconcatanate()
    Dim wshTable As Worksheet, wshPublic As Worksheet 'les feuilles
    Dim rngFind As Range, rngFindEnt As Range 'pour la recherche
    Dim rngPlage As Range ' plage de cellules
    Dim strTxt As String 'texte divers
    Dim rngPub As Range, intB1 As Integer, rngB2 As Range 'les boucles
    Dim intCol As Integer, lngRow As Long 'ligne et colonne ou ecrire
    Dim intCol60 As Integer, lngRow60 As Long, intColProp As Integer
    Dim intColVal As Integer, intColEntr As Integer
    Dim tabCol60() As Double, dblTotal As Double, dblSomme As Double
    Dim strListe60 As String
     
    Set wshTable = Worksheets("Table")
    Set wshPublic = Worksheets("Public")
     
    'A décommenter pour vider la feuille avant le traitement
    wshPublic.Cells.Delete Shift:=xlUp
     
    With Worksheets("Rapport")
      'recherche des montants à utiliser
      Set rngFind = .Rows(1).Find("Montant", LookIn:=xlValues, lookat:=xlWhole)
      If rngFind Is Nothing Then MsgBox "Colonne Montant non trouvé": GoTo erreur
      intCol60 = rngFind.Column
      lngRow60 = .Cells(2, intCol60).End(xlDown).Row
      dblTotal = 0: dblSomme = 0
      For intB1 = 2 To lngRow60
        ReDim Preserve tabCol60(intB1 - 2)
        tabCol60(intB1 - 2) = .Cells(intB1, intCol60): dblTotal = dblTotal + tabCol60(intB1 - 2)
      Next
      tabCol60 = TriTabEnBulle(tabCol60): strListe60 = "*"
      For intB1 = UBound(tabCol60) To LBound(tabCol60) Step -1
        dblSomme = dblSomme + tabCol60(intB1): strListe60 = strListe60 & tabCol60(intB1) & "*"
        If dblSomme > dblTotal * 0.6 Then Exit For
      Next
     
      'Colonne Propiétaire
      Set rngFind = .Rows(1).Find("Proprietaire", LookIn:=xlValues, lookat:=xlWhole)
      If rngFind Is Nothing Then MsgBox "Colonne Proprietaire non trouvé": GoTo erreur
      intColProp = rngFind.Column
     
      'Colonne Entreprise
      Set rngFind = .Rows(1).Find("Entreprise", LookIn:=xlValues, lookat:=xlWhole)
      If rngFind Is Nothing Then MsgBox "Colonne Proprietaire non trouvé": GoTo erreur
      intColEntr = rngFind.Column
     
      'boucle pour trouver les propriétaire au status plublic
      For Each rngPub In wshTable.Range("B2:B" & wshTable.Range("B2").End(xlDown).Row)
        's'il est public
        If UCase(rngPub.Value) = "PUBLIC" Then
          'on le recherche la ligne correspondante dans la feuille Rapport
          Set rngPlage = .Range(.Cells(2, intColProp), .Cells(.Cells(2, intColProp).End(xlDown).Row, intColProp))
          Set rngFind = rngPlage.Find(rngPub.Offset(0, -1).Value, LookIn:=xlValues, lookat:=xlWhole)
          's'il y a une correspondance
          If Not rngFind Is Nothing And InStr(1, strListe60, "*" & .Cells(rngFind.Row, intCol60).Value & "*") > 0 Then
            'Ecriture du projet / Montant dans la feuille Public
            strTxt = .Cells(rngFind.Row, 1) & " / " & .Cells(rngFind.Row, 5)
            intCol = wshPublic.Cells(1, Columns.Count).End(xlToLeft).Column + 1
            wshPublic.Cells(1, intCol) = strTxt
     
            'Ecriture des entreprise
            'boucle dans les différents Entreprises de la cellule
            For intB1 = 0 To UBound(Split(.Cells(rngFind.Row, intColEntr), "*"))
              'Est-ce que l'entreprise à déja été écrite dans la Feuille Public
              Set rngPlage = wshPublic.Range("A2:A" & wshPublic.Cells(Rows.Count, 1).End(xlUp).Row)
              strTxt = Trim(Split(.Cells(rngFind.Row, intColEntr), "*")(intB1))
              Set rngFindEnt = rngPlage.Find(strTxt, LookIn:=xlValues, lookat:=xlWhole)
              'oui
              If Not rngFindEnt Is Nothing Then
                'oui -> noter la ligne
                lngRow = rngFindEnt.Row
              Else
                'non -> l'écrire et noter la ligne
                lngRow = wshPublic.Cells(Rows.Count, 1).End(xlUp).Row + 1
                wshPublic.Cells(lngRow, 1) = strTxt
              End If
              'passer la cellule de croisement entreprise / projet en jaune
              wshPublic.Cells(lngRow, intCol).Interior.ColorIndex = 6
            Next
          End If
        End If
      Next
    End With
     
    wshPublic.Cells.EntireColumn.AutoFit
     
    'pour terminer proprement
    erreur:
    Set wshTable = Nothing: Set wshPublic = Nothing
    Set rngFind = Nothing: Set rngPlage = Nothing
    Set rngFindEnt = Nothing
    End Sub
     
    Function TriTabEnBulle(tabTri As Variant) As Variant
    Dim intI As Integer, intJ As Integer, intK As Integer, varTmp As Variant
     
        For intI = LBound(tabTri) To UBound(tabTri)
            intJ = intI
            For intK = intJ + 1 To UBound(tabTri)
                If tabTri(intK) <= tabTri(intJ) Then intJ = intK
            Next intK
            If intI <> intJ Then
                varTmp = tabTri(intJ): tabTri(intJ) = tabTri(intI): tabTri(intI) = varTmp
            End If
        Next intI
        TriTabEnBulle = tabTri
    End Function
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  5. #5
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Bonjour zyhack,

    En changeant un tout petit peu ma Feuille ‘Rapport’ (cf piece jointe)le code bug au niveau de:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    's'il y a une correspondance
    If Not rngFind Is Nothing And InStr(1, strListe60, "*" & .Cells(rngFind.Row, intCol60).Value & "*") > 0 Then
    Sinon je ne sais pas comment je pourrai specifier que la somme des montants des projets publics doit etre superieur a 0.6*total des montants des projets publics (et non pas le total des montants des projets, desole pour mon manque de precision dans mon message precedant)

    Merci beaucoup pour ton aide

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    En changeant un tout petit peu ma Feuille ‘Rapport’
    Tu trouve que c'est un tout petit peu ? il n'y a plus que les titres des colonnes qui sont identiques

    Sinon je ne sais pas comment je pourrai specifier que la somme des montants des projets publics doit etre superieur a 0.6*total des montants des projets publics (et non pas le total des montants des projets, desole pour mon manque de precision dans mon message precedant)
    !!


    Avant de modifier le code qui à mon avis est complètement à reprendre.

    Comptes-tu encore modifier la présentation des données dans la feuille rapport car sinon il faudrait éclater le programme en section pour qu'il soit plus facilement modifiable par la suite.

    dans la feuille rapport chaque projet apparait plusieurs fois (apparemment 1 fois par entreprise)

    Dans la colonne entreprise il n'y a plus qu'une société par cellule, ce sera toujours le cas ou faut-il garder le traitement séparant les entreprise séparés par un * ?

    le montant pour un même projet est il lié au projet ou à la société
    ex : H - Batiment K = 50004 ?
    ou alors
    entreprise 1 = 50004 + entreprise 2 = 50004 ce qui donne pour le projet H - Batiment K = 100008 ?

    Faut-il mieux chercher le propriétaire par la colonne N ou par le premier caractère du nom de projet ?

    A par ces quelques précisions et en étant le plus précis possible sur ce que tu attend il n'y aura pas de soucis pour t'aider.
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  7. #7
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Bonjour Zyhack, merci pour votre réponse, J’ai bien réfléchi avant de vous répondre comme ça je serai précis cette fois. Je vous mets ci-joint un exemple concret de mon fichier comme ça ça sera plus clair.
    Je vous remercie d’avance pour le temps que vous allez prendre pour lire ce message

    De manière plus précise sur ce que je souhaite faire:

    J’ai une feuille ‘’Projects’’ et une feuille Table où j’ai l’ensemble de mes données (ci-joint une partie de ma feuille qui est en vrai énorme) je souhaite à partir de cette feuille générer les feuilles : Public, Private, Complete, Cancelled, Execution, On Hold, UAE, Qatar.
    Dans la feuille Table, j’ai le statut des propriétaires des projets suivants qu’ils soient Public ou Private, à partir de cette feuille avec la feuille Projects, je souhaite générer la feuille Public qui recense l’ensemble des projets publiques (ayant un propriétaire publique) suivant les entreprises de BTP (EPC Contractors). Je souhaite me restreindre aux plus gros projets dont la somme des valeurs est supérieure 60% de la valeur totale des projets publiques.

    Feuille Public (pareil pour la feuille Private)


    Première ligne : Nom des projets (récupérés dans la feuille Projects, colonne intitulée Project Name) ayant comme propriétaire une entité publique (exemple dans la colonne Project Name: Dubai Properties - Executive Towers , le propriétaire dans ce cas est Dubai Properties, dans la Feuille Table il est spécifié que ce propriétaire est publique)
    Ligne 2 : la valeur du projet à savoir le Contract Value ou Budget Value de chaque projet (idem récupéré dans la feuille Projects, colonnes D et E ), si le projet a comme statut Complete (cf feuille Projects colonne F) alors insérer Contract Value (colonne D) sinon Budget Value (colonne E).
    Colonne 1 : le nom des entreprises de BTP (EPC Contractors présents dans la colonne K) qui ont participées aux projets (lorsqu’il y a plusieurs entreprises de BTP sur le projet alors elles sont séparées par * dans la colonne K feuille Projects)
    Dans la feuille Public je souhaite me focaliser sur les projets ayant un propriétaire publique. La somme des valeurs de ces projets (Contract value ou Budget value selon si le statut du projet est Complete ou non) représentent plus de 60% de la valeur totale des projets ayant un propriétaire publique. Tout cela aura la forme d’un tableau ou les cases de correspondances seront cochées ou coloriés, comme ce que vous m’aviez montré précédemment.

    Feuille Complete (pareil pour feuilles Cancelled, Execution...)

    De manière générale créer des nouvelles feuilles avec les noms des statuts (car je peux avoir de nouveaux statuts à part cela)
    Dans le cas de la Feuille Complete, Recenser les projets ayant comme project Status = Complete (cf feuille Projects, colonne F)
    Sans prendre en compte le fait que le propriétaire soit publique ou privée.
    Prendre en compte le fait que les projets recensés doivent être les plus gros en valeur (Contract value si Complete sinon Budget Value) et représenter plus de 60% de la valeur totale des projets ayant comme project status Complete.

    Feuille UAE par exemple:

    De manière générale, créer des feuilles ayant comme nom le nom Country (Colonne B feuille Projects). Dans le cas de la feuille UAE Recenser l’ensemble des projets pour le pays (cf Colonne B feuille Projects). Importer les plus gros projets dans la valeur totale est plus de 60% de la valeur totale des projets du pays.

    Remarques

    Le contenu de la feuille Projects est susceptible de changer énormément l’intitulé des colonnes de la feuille projects est le seul qui restera intact (des changements comme par ex de nouveaux pays dans la liste, de nouveaux statuts au lieu de Complete, Cancelled), il se peut aussi qu’il y ait dans la feuille de nouveaux propriétaires non recensés dans la feuille Table, je ne sais pas si c’est possible dans ce cas la de recevoir un message pour nous demander de préciser leur statut publique ou privée…Tout cela à l'air difficile et fastidieux à mettre en place donc tous vos conseils et pistes de recherches sont les bienvenues.

    Je vous remercie beaucoup zyhack pour votre aide précieuse et j'espère avoir été cette fois plus précis.



    Merci
    Fichiers attachés Fichiers attachés

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    bonjour mouncefdi

    Pas facile ton histoire car il ne s'agit plus d'une modification de code mais de développer un projet (ce qui demande plus de temps).

    Tous les codes fournis par la suite ont été testé avec le dernier fichier que tu as fournis.

    il se peut aussi qu’il y ait dans la feuille de nouveaux propriétaires non recensés dans la feuille Table
    La routine "VerifPropiétaires" s'occupe de le vérifier et de les ajouter au besoin, si dans Project Name il y a deux tirets il sera demandé de rentrer le nom du propriétaire, et ensuite son statut. Pour l'instant cette routine est a lancer par toi. A voir par la suite.

    Au cas ou les colonnes devraient changer d'emplacement dans la feuille "Projects" la fonction "listeColEnTete" utilise un objet public collection et des constantes contenant le nom des colonnes attendus pour vérifier leurs présences et mémoriser le N° de colonne par rapport à son nom.

    Le remplissage des feuilles Public et Private est réalisé en lançant la routine "traitementPubPriv" qui appel deux fois (une par feuille) la fonction "FillPubPriSheet" qui s'occupe du remplissage.

    Afin d'architecturer le tout et éviter d'avoir tous les codes les uns à la suite des autres j'ai créé deux modules (et il y en aura d'autres)

    Le premier que j'ai appelé "General" avec les codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
     
    Option Explicit
     
    'Correspondance nom entete et n° de colonne
    Public colEntete As New Collection
    'Nom des en tetes Feuille Project
    'Si tu change le nom d'un entete dans la feuille
    'il faut aussi le changer ici
    Public Const ProProjectName As String = "Project Name"
    Public Const ProContracValu As String = "Contract Value ($m)"
    Public Const ProBudjectValu As String = "Budget Value ($m)"
    Public Const ProProjectStat As String = "Project Status"
    Public Const ProProfileStat As String = "Profile Status"
    Public Const ProEpcContract As String = "EPC Contractors"
     
    Function listeColEnTete() As Boolean
    Dim C As Range, Plage As Range, erreur As Boolean
     
    erreur = False
    With Worksheets("Projects")
      Set Plage = .Range(.Cells(1, 1), .Cells(1, .Cells(Columns.Count).End(xlToLeft).Column))
     
      If .Range(Plage.Address).Find(ProProjectName, LookIn:=xlValues) Is Nothing Then erreur = True
      If .Range(Plage.Address).Find(ProContracValu, LookIn:=xlValues) Is Nothing Then erreur = True
      If .Range(Plage.Address).Find(ProBudjectValu, LookIn:=xlValues) Is Nothing Then erreur = True
      If .Range(Plage.Address).Find(ProProjectStat, LookIn:=xlValues) Is Nothing Then erreur = True
      If .Range(Plage.Address).Find(ProProfileStat, LookIn:=xlValues) Is Nothing Then erreur = True
      If .Range(Plage.Address).Find(ProEpcContract, LookIn:=xlValues) Is Nothing Then erreur = True
     
      If Not erreur Then
        'Creer la correspondance nom entete et n° de colonne
        For Each C In Plage
          If Not C Is Nothing Then colEntete.Add Item:=C.Column, key:=C.Value
        Next
      End If
    End With
    Set Plage = Nothing: Set C = Nothing
    listeColEnTete = Not erreur
    End Function
     
    Sub VerifPropiétaires()
    Dim C As Range, Plage As Range, Trouve As Boolean
    Dim Propr() As Variant, B1 As Long, LastLig As Long
    Dim texte As String, Reponse As Integer
     
    If listeColEnTete = False Then
      MsgBox "Erreur dans le nom des colonnes, Arrêt de la routine"
      Exit Sub
    End If
     
    'Remplir le tableau avec la liste des propriétaires
    Propr = Application.Transpose(Worksheets("Table").Range("A2:A" & Worksheets("Table").Cells(Rows.Count, 1).End(xlUp).Row).Value)
     
    'boucle dans les projets
    With Worksheets("Projects")
      Set Plage = .Range(.Cells(2, colEntete(ProProjectName)), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, colEntete(ProProjectName)))
      For Each C In Plage
        Trouve = False
        'Cherche si le propriétaire du projet est dans la liste des propriétaires
        For B1 = LBound(Propr, 1) To UBound(Propr, 1)
          If InStr(1, UCase(C.Value), UCase(Trim(Propr(B1)))) > 0 Then
            Trouve = True
            Exit For
          End If
        Next
        's'il n'est pas dans la liste
        If Trouve = False Then
          'si il n'y a qu'un tiret le nom du propriétaire est définit automatiquement
          If InStr(1, C.Value, "-") = InStrRev(C.Value, "-") Then
            texte = Left(C.Value, InStr(1, C.Value, "-") - 1)
          Else
            'sinon demande à l'utilsateur
            texte = InputBox("Impossible de définir le nom du propiétaire d'après ce projet" & vbCrLf & _
                              "Veuillez entrer son nom puis OK" & vbCrLf & vbCrLf & _
                              "Annuler ou une chaine vide gardera la chaine complète", _
                              "Nom de Propriétaire", C.Value)
            If texte = "" Then texte = C.Value
          End If
          'Demande du status
          Reponse = MsgBox("Le propiétaire " & texte & " à t'il le status Public" & vbCrLf & vbCrLf & _
                          "OUI : Status = Public" & vbCrLf & "NON : Status = Private", vbYesNo, "Status proriétaire")
          'Ajout dans la feuille Table et dans le tableau
          LastLig = Worksheets("Table").Cells(Rows.Count, 1).End(xlUp).Row + 1
          ReDim Preserve Propr(UBound(Propr) + 1)
          Worksheets("Table").Cells(LastLig, 1) = texte
          Propr(UBound(Propr)) = texte
          If Reponse = vbYes Then
            Worksheets("Table").Cells(LastLig, 2) = "Public"
          Else
            Worksheets("Table").Cells(LastLig, 2) = "Private"
          End If
        End If
      Next
    End With
    Set colEntete = Nothing: Set Plage = Nothing: Set C = Nothing
    End Sub
     
    Function CreateSheet(SheetName As String) As String
    Dim intB1 As Integer, NewSheet As Worksheet
     
      'si le nom est vide -> sortir
      If SheetName = "" Then CreateSheet = "": Exit Function
     
      'si le nom comprend des caractères interdits -> sortir
      For intB1 = 1 To Len(SheetName)
        If InStr(intB1, ":/\?*[]", Mid(SheetName, intB1, 1)) > 0 Then CreateSheet = "": Exit Function
      Next
     
      'si le nom est trop long -> sortir
      If Len(SheetName) > 31 Then CreateSheet = "": Exit Function
     
      'si la feuille existe déjà -> renvoi du nom de la feuille existante
      On Error Resume Next
      CreateSheet = ThisWorkbook.Worksheets(SheetName).Name
      If Err.Number = 0 Then Exit Function
      Err.Clear
      On Error GoTo 0
     
      'création de la feuille
      Set NewSheet = Worksheets.Add(After:=Worksheets(Worksheets.Count))
      NewSheet.Name = SheetName
      CreateSheet = NewSheet.Name
      Set NewSheet = Nothing
    End Function
    Le second appelé "Public_Private" avec les codes
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
     
    Option Explicit
     
    Sub traitementPubPriv()
    'liste les colonnes
    If listeColEnTete = False Then
      MsgBox "Erreur dans le nom des intCols, Arrêt de la routine"
      Exit Sub
    End If
     
    If CreateSheet("Public") <> "Public" Then MsgBox "Proplème création feuille " & "Public": GoTo erreur
    If CreateSheet("Private") <> "Private" Then MsgBox "Proplème création feuille " & "Private": GoTo erreur
     
    FillPubPriSheet ("Public")    'traite la feuille Public
    FillPubPriSheet ("Private")   'traite la feuille Private
     
    erreur:
    Set colEntete = Nothing
    End Sub
     
     
    Function FillPubPriSheet(Pub_Pri As String)
     
    Dim wshTable As Worksheet, wshPubPri As Worksheet 'les feuilles
    Dim PrStat() As Variant, Complet() As Variant, Societes As Variant 'les tableaux
    Dim lngB1 As Long, intb2 As Integer, rngb3 As Range 'Les boucles
    Dim strTxt As String
    Dim lngUbound As Long 'taille tableau
    Dim dblTotal As Double, dblSomme As Double 'Calcul
    Dim intCol As Integer, lngRow As Long, rngPlage As Range 'reference aux cellules
    Dim rngFind As Range 'pour la recherche
     
    Set wshTable = Worksheets("Table")
    Set wshPubPri = Worksheets(Pub_Pri)
     
    'A décommenter pour vider la feuille avant le traitement
    wshPubPri.Cells.Delete Shift:=xlUp
     
    'Liste les propiétaires public ou private
    lngUbound = 0
    For Each rngb3 In wshTable.Range("A2:A" & wshTable.Cells(Rows.Count, 1).End(xlUp).Row)
      If UCase(rngb3.Offset(0, 1)) = UCase(Pub_Pri) Then
        ReDim Preserve PrStat(lngUbound)
        PrStat(lngUbound) = Trim(rngb3.Value)
        lngUbound = lngUbound + 1
      End If
    Next
     
    With Worksheets("Projects")
     
      'recherche des montants à utiliser
      dblTotal = 0: lngUbound = 0 ':dblSomme = 0
      ReDim Complet(2, lngUbound)
      'boucle dans la feuille Projects
      For Each rngb3 In .Range("A2:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
        'Boucle dans le tableau pour connaitre le status de la ligne
        For lngB1 = LBound(PrStat) To UBound(PrStat)
          'si c'est le status cherché
          If InStr(1, UCase(rngb3), UCase(PrStat(lngB1))) Then
            ReDim Preserve Complet(2, lngUbound)
     
            '0 = Nom du projet
            Complet(0, lngUbound) = rngb3.Value
     
            '1 = Valeur du projet
            If UCase(Trim(.Cells(rngb3.Row, colEntete(ProProjectStat)))) = "COMPLETE" Then
              Complet(1, lngUbound) = .Cells(rngb3.Row, colEntete(ProContracValu)).Value
            Else
              Complet(1, lngUbound) = .Cells(rngb3.Row, colEntete(ProBudjectValu)).Value
            End If
            dblTotal = dblTotal + CDbl(Complet(1, lngUbound))
     
            '2 = Liste des entreprises
            Complet(2, lngUbound) = .Cells(rngb3.Row, colEntete(ProEpcContract)).Value
     
            '3 = N° de la ligne
            'Complet(3, lngUbound) = rngb3.Row
     
            lngUbound = lngUbound + 1
            Exit For
          End If
        Next
      Next
    End With
     
    Complet = TriTabEnBulle(Complet)
    dblSomme = 0
    With wshPubPri
      'boucle dans le tableau précédemment créé
      For lngB1 = UBound(Complet, 2) To LBound(Complet, 2) Step -1
        'somme pour vérifier les 60%
        dblSomme = dblSomme + Complet(1, lngB1)
        'cherche dans quel colonne écrire
        intCol = .Cells(1, Columns.Count).End(xlToLeft).Column + 1
        'écriture du projet
        .Cells(1, intCol) = Complet(0, lngB1)
        'écriture du montant
        .Cells(2, intCol) = Complet(1, lngB1)
     
        'Ecriture des entreprise
        'boucle dans les différents Entreprises de la cellule
        For intb2 = 0 To UBound(Split(Complet(2, lngB1), "*"))
          'Est-ce que l'entreprise à déja été écrite dans la Feuille Public
          Set rngPlage = .Range("A3:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
          strTxt = Trim(Split(Complet(2, lngB1), "*")(intb2))
          Set rngFind = rngPlage.Find(strTxt, LookIn:=xlValues, lookat:=xlWhole)
          'oui
          If Not rngFind Is Nothing Then
            'oui -> noter la ligne
            lngRow = rngFind.Row
          Else
            'non -> l'écrire et noter la ligne
            lngRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            lngRow = IIf(lngRow < 3, 3, lngRow)
            .Cells(lngRow, 1) = strTxt
          End If
          'passer la cellule de croisement entreprise / projet en jaune
          .Cells(lngRow, intCol).Interior.ColorIndex = 6
        Next
        If dblSomme > dblTotal * 0.6 Then Exit For
      Next
      .Cells.EntireColumn.AutoFit
    End With
     
    'pour terminer proprement
    Set rngFind = Nothing: Set rngPlage = Nothing
    Set wshTable = Nothing: Set wshPubPri = Nothing
    End Function
     
    'Tri spécifique d'un tableau(0 to 2, 0 to NbLigne)
    Function TriTabEnBulle(tabTri As Variant) As Variant
    Dim intI As Integer, intJ As Integer, intK As Integer, varTmp(2) As Variant
     
        For intI = LBound(tabTri, 2) To UBound(tabTri, 2)
            intJ = intI
            For intK = intJ + 1 To UBound(tabTri, 2)
                If tabTri(1, intK) <= tabTri(1, intJ) Then intJ = intK
            Next intK
            If intI <> intJ Then
                varTmp(0) = tabTri(0, intJ): varTmp(1) = tabTri(1, intJ): varTmp(2) = tabTri(2, intJ)
                tabTri(0, intJ) = tabTri(0, intI): tabTri(1, intJ) = tabTri(1, intI): tabTri(2, intJ) = tabTri(2, intI)
                tabTri(0, intI) = varTmp(0): tabTri(1, intI) = varTmp(1): tabTri(2, intI) = varTmp(2)
            End If
        Next intI
        TriTabEnBulle = tabTri
    End Function
    Edit
    Prochaines étapes
    - vérification de la présence des feuilles et création de celles manquantes
    -remplissage des autres feuilles
    Bon en fait j'édite le post pour modifier les codes ci-dessus et ajouter la suite

    Dans un troisième module nommé "ProjectStatusSheets"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
     
    Option Explicit
     
    Sub traitementStatus()
    Dim tabValeurs As Variant, intB1 As Integer, strValeurs As String
     
    'liste les colonnes
    If listeColEnTete = False Then
      MsgBox "Erreur dans le nom des intCols, Arrêt de la routine"
      Exit Sub
    End If
     
    'Lister les status et créer les feuilles
    strValeurs = ListeValeurs(colEntete(ProProjectStat))
    If strValeurs = "" Then GoTo erreur
    'Appel de la fonction pour traiter les feuilles Status
    tabValeurs = Split(strValeurs, "*")
    For intB1 = LBound(tabValeurs) To UBound(tabValeurs)
      Call FillOtherSheet(tabValeurs(intB1), colEntete(ProProjectStat))
    Next
     
    'Lister les country et créer les feuilles
    strValeurs = ListeValeurs(colEntete(ProCountry))
    If strValeurs = "" Then GoTo erreur
    'Appel de la fonction pour traiter les feuilles Status
    tabValeurs = Split(strValeurs, "*")
    For intB1 = LBound(tabValeurs) To UBound(tabValeurs)
      Call FillOtherSheet(tabValeurs(intB1), colEntete(ProCountry))
    Next
     
    erreur:
    Set colEntete = Nothing
    End Sub
     
    Function ListeValeurs(ColValeur As Integer) As String
    Dim rngCell As Range, strValeurs As String
    With Worksheets("Projects")
      For Each rngCell In .Range(.Cells(2, ColValeur), .Cells(.Cells(Rows.Count, ColValeur).End(xlUp).Row, ColValeur))
        If Not InStr(1, UCase(strValeurs), UCase(Trim(rngCell.Value))) > 0 Then _
            strValeurs = strValeurs & Trim(rngCell.Value) & "*"
        If CreateSheet(Trim(rngCell.Value)) <> Trim(rngCell.Value) Then _
            MsgBox "Proplème création feuille " & Trim(rngCell.Value): ListeValeurs = "": GoTo erreur
      Next
    End With
    ListeValeurs = Left(strValeurs, Len(strValeurs) - 1)
    erreur:
    Set rngCell = Nothing
    End Function
     
    Function FillOtherSheet(ByVal Valeur As String, ByVal ColValeur As Integer)
     
    Dim wshOther As Worksheet 'les feuilles
    Dim PrStat() As Variant, Complet() As Variant, Societes As Variant 'les tableaux
    Dim lngB1 As Long, intb2 As Integer, rngb3 As Range 'Les boucles
    Dim strTxt As String
    Dim lngUbound As Long 'taille tableau
    Dim dblTotal As Double, dblSomme As Double 'Calcul
    Dim intcol As Integer, lngRow As Long, rngPlage As Range 'reference aux cellules
    Dim rngFind As Range 'pour la recherche
     
    Set wshOther = Worksheets(Valeur)
     
    'A décommenter pour vider la feuille avant le traitement
    wshOther.Cells.Delete Shift:=xlUp
     
    With Worksheets("Projects")
     
      'recherche des montants à utiliser
      dblTotal = 0: lngUbound = 0 ':dblSomme = 0
      ReDim Complet(2, lngUbound)
      'boucle dans la feuille Projects
      For Each rngb3 In .Range(.Cells(2, ColValeur), .Cells(.Cells(Rows.Count, 1).End(xlUp).Row, ColValeur))
        'si c'est la valeur cherché
        If Trim(UCase(rngb3.Value)) = Trim(UCase(Valeur)) Then
          ReDim Preserve Complet(2, lngUbound)
     
          '0 = Nom du projet
          Complet(0, lngUbound) = .Cells(rngb3.Row, colEntete(ProProjectName))
     
          '1 = Valeur du projet
          If UCase(Trim(.Cells(rngb3.Row, colEntete(ProProjectStat)))) = "COMPLETE" Then
            Complet(1, lngUbound) = .Cells(rngb3.Row, colEntete(ProContracValu)).Value
          Else
            Complet(1, lngUbound) = .Cells(rngb3.Row, colEntete(ProBudjectValu)).Value
          End If
          dblTotal = dblTotal + CDbl(Complet(1, lngUbound))
     
          '2 = Liste des entreprises
          Complet(2, lngUbound) = .Cells(rngb3.Row, colEntete(ProEpcContract)).Value
     
          lngUbound = lngUbound + 1
        End If
      Next
    End With
     
    Complet = TriTabEnBulle(Complet)
    dblSomme = 0
    With wshOther
      'boucle dans le tableau précédemment créé
      For lngB1 = UBound(Complet, 2) To LBound(Complet, 2) Step -1
        'somme pour vérifier les 60%
        dblSomme = dblSomme + Complet(1, lngB1)
        'cherche dans quel colonne écrire
        intcol = .Cells(1, Columns.Count).End(xlToLeft).Column + 1
        'écriture du projet
        .Cells(1, intcol) = Complet(0, lngB1)
        'écriture du montant
        .Cells(2, intcol) = Complet(1, lngB1)
     
        'Ecriture des entreprise
        'boucle dans les différents Entreprises de la cellule
        For intb2 = 0 To UBound(Split(Complet(2, lngB1), "*"))
          'Est-ce que l'entreprise à déja été écrite dans la Feuille Public
          Set rngPlage = .Range("A3:A" & .Cells(Rows.Count, 1).End(xlUp).Row)
          strTxt = Trim(Split(Complet(2, lngB1), "*")(intb2))
          Set rngFind = rngPlage.Find(strTxt, LookIn:=xlValues, lookat:=xlWhole)
          'oui
          If Not rngFind Is Nothing Then
            'oui -> noter la ligne
            lngRow = rngFind.Row
          Else
            'non -> l'écrire et noter la ligne
            lngRow = .Cells(Rows.Count, 1).End(xlUp).Row + 1
            lngRow = IIf(lngRow < 3, 3, lngRow)
            .Cells(lngRow, 1) = strTxt
          End If
          'passer la cellule de croisement entreprise / projet en jaune
          .Cells(lngRow, intcol).Interior.ColorIndex = 6
        Next
        If dblSomme > dblTotal * 0.6 Then Exit For
      Next
      .Cells.EntireColumn.AutoFit
    End With
     
    'pour terminer proprement
    Set rngFind = Nothing: Set rngPlage = Nothing
    Set wshOther = Nothing
    End Function
    Ce dernier module liste les status et country crée les feuilles et les remplis.

    j'espère que ce sera le résultat que tu attends.
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  9. #9
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Bonjour zyhack,

    Merci beaucoup pour ton temps, merci, merci!!!

    les deux modules "Public_Private" et "ProjectStatusSheets" marche très bien, par contre le premier module de vérification des propriétaires me demande lorsqu'il y a un propriétaire non listé de préciser si il est public ou privé (ce qui est parfait) et une fois que je réponds au msg il y a un bug au niveau de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'Ajout dans la feuille Table et dans le tableau
    LastLig = Worksheets("Table").Cells(Rows.Count, 1).End(xlUp).Row + 1
    ReDim Preserve Propr(UBound(Propr) + 1) ' à ce niveau la ça bug
    avec le message suivant:

    Erreur d'execution '9': L'indice n'appartient pas à la sélection
    Voila Merci beaucoup encore!!

  10. #10
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonsoir

    je ne comprend pas pourquoi mais apparemment il y a une incompatibilité entre l'assignation dans le tableau avec transpose et le redim preserve, j'ai donc été obligé de modifier l'assignation du tableau.

    en début de code il faut remplacer la ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Propr = Application.Transpose(Worksheets("Table").Range("A2:A" & Worksheets("Table").Cells(Rows.Count, 1).End(xlUp).Row).Value)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    For b1 = 2 To Worksheets("Table").Cells(Rows.Count, 1).End(xlUp).Row
      ReDim Preserve Propr(b1 - 2)
      Propr(b1 - 2) = Worksheets("Table").Cells(b1, 1).Value
    Next
    et la ça marche il faut maintenant que je comprenne pourquoi
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  11. #11
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Bonjour zyhack,

    oui ca marche

    je voulais savoir si je pouvais mettre au lieu de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dblSomme > dblTotal * 0.6 Then Exit For
    ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dblSomme > dblTotal * "Percentage.Value" Then Exit For
    ou percentage est le nom d'une cellule d'une feuille excel de mon fichier ou je pourrais specifier le pourcentage a partir duquel je veux faire mon etude...

    Merci encore

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour mouncefdi

    Tu peux effectivement le ramplacer par une variable nommé mais avec cette formulation.

    si tu as nommé ta cellule "Percentage.Value"
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dblSomme > dblTotal * [Percentage.Value] Then Exit For
    si tu l'as nommé "Percentage" ce sera
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dblSomme > dblTotal * [Percentage] Then Exit For
    bon courage
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  13. #13
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 696
    Points
    6 696
    Par défaut
    Citation Envoyé par zyhack Voir le message
    je ne comprend pas pourquoi mais apparemment il y a une incompatibilité entre l'assignation dans le tableau avec transpose et le redim preserve, j'ai donc été obligé de modifier l'assignation du tableau.
    Bonjour,

    rajoute Option Base 1 en haut de module et ça sera OK

    attention à la répercussion possible dans les reste du code !

    La méthode employée (très bonne) ne déclare pas explicitement le tableau dynamique en base 1 alors que c'est la cas... En faisant une déclaration par défaut, tu supprimes les ambiguïtés.

    cordialement,

    Didier
    Didier Gonard

    Dernier tutoriel :
    Le VBA qu'est ce que c'est ?
    Tutoriels : Voir la liste de mes tutoriels Excel & VBA et mon site pro sur ma Page DVP
    Cours et tutoriels pour apprendre Excel
    N'oubliez pas de mettre : ..quand c'est le cas !

  14. #14
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour Ormonth

    Je me suis empressé de faire un test car j'ai essayé pas mal de méthode mais je n'arrivai pas à trouver la bonne et effectivement ça marche beaucoup mieux.

    Et comme tu l'as dit il vas falloir faire attention à la répercussion possible dans les reste du code.

    Un grand merci , ce sera utile pour les prochains code à venir.
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  15. #15
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Bonjour zyhack,

    Merci beaucoup, le code marche bien sur l’exemple fourni.

    Mais seul pbm: lorsque je lance les macros dans mon vrai fichier il cree les feuilles mais il ne trie pas les projets comme convenu selon la valeur:

    J’obtient des classements de projets par valeur du type: 98 puis 2,800 puis 98 puis 96 puis 955 puis 95

    Est ce que c’est normal?

    + j’obtient par moment de faux resultats (des cases en jaune qui ne devraient pas l’etre) bizarrement les 3 erreurs se trouvent au niveau du deuxieme proprietaire dans les feuilles de tri par statut.

    Est ce que tu souhaite que je t’envoie mon fichier par MP?

    Merci beaucoup zyhack pour ton aide precieuse

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    J'ai retesté le code sur la base de l'ancien fichier en essayant quelques mode dégradés.

    Si les noms de propriétaires ont la même racine
    exemple : 1) "société x" et 2) "société x & Co"

    en recherchant le 1 on le trouvera dans le 2
    Pour ce cas il faudra ajouter " -" pour rendre la recherche unique, mais pour ce faire il faut que dans la feuille avec tous les projets le couple "Propriétaire - Nom du projet" soit obligatoirement séparé par un tiret ce qui n'est pas le cas actuellement, pour l'instant on trouve dans ton fichier.

    - des séparations par " : "
    - pas de séparation
    - uniquement le projet sans propriétaire et inversement

    pour l'instant je reste persuadé que les résultats érronés que tu as sont liés au format des données dans tes deux premières feuilles.

    Afin de l'analyser peux tu joindres ton fichier juste avec ces deux premières feuilles (car les autres sont créés automatiquement)
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  17. #17
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Bonjour zyhack,

    (Meme avec les deux feuilles je n’arrive pas a joindre le fichier malheureusement).

    Desole oui effectivement il y a des problemes au niveau du fichier, le code marche tres bien sinon. Je ferai en sorte de resoudre ce probleme de facon manuelle avant de lancer la macro.

    Pour le seuil de 60% que j’avais defini, qu’est ce qui se passe lorsque j’ai un projet dans la valeur depasse 60% de la valeur total?

    J’ai bien reflechi avant de faire ce post. je pense que la seule issue pour moi serai plutot de restreindre mon etude sur les 10 plus gros projets (Je pense que ca sera plus simple dans mon cas en vue des du nombre immense de donnees comme tu as du certainement le remarquer), est ce que ca n'implique pas beaucoup de changements sur le code deja fait avec le seuil de 60%?

    Merci beaucoup zyhack pour ton temps et ton aide.

    Cordialement,

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Points : 877
    Points
    877
    Par défaut
    Bonjour

    Pour le seuil de 60% que j’avais defini, qu’est ce qui se passe lorsque j’ai un projet dans la valeur depasse 60% de la valeur total?
    Dans ce cas il n'y aura qu'un seul chantier affiché (même s'il à pour valeur 70% ou 90 % du total)

    J’ai bien reflechi avant de faire ce post.
    Ca j'approuve

    je pense que la seule issue pour moi serai plutot de restreindre mon etude sur les 10 plus gros projets (Je pense que ca sera plus simple dans mon cas en vue des du nombre immense de donnees comme tu as du certainement le remarquer), est ce que ca n'implique pas beaucoup de changements sur le code deja fait avec le seuil de 60%?
    Non ça ne fais pas trop de changement si on utilise les variables existantes.

    Dans les deux fonctions FillPubPriSheet et FillOtherSheet il faut remplacer


    Pour remplacer l'addition des sommes de valeur chantier par l'addititon du nombre de chantier affiché
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    'somme pour vérifier les 60%
    dblSomme = dblSomme + Complet(1, lngB1)
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    'Compte le nombre de Chantier à afficher
    dblSomme = dblSomme + 1
    Et pour arrêter l'affichage au bout de 10 chantiers
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dblSomme > dblTotal * 0.6 Then Exit For
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If dblSomme >= 10 Then Exit For '10 = le nombre de chantier à afficher
    Cordialement.

    N'oubliez pas de cliquer sur Résolu quand vous avez obtenu la réponse à votre question.
    Citation
    Il y a 10 sortes de gens au monde : ceux qui connaissent le binaire et les autres » - Anonyme
    Compter en octal, c’est comme compter en décimal, si on n’utilise pas ses pouces » - Tom Lehrer

  19. #19
    Membre du Club
    Inscrit en
    Mars 2009
    Messages
    105
    Détails du profil
    Informations forums :
    Inscription : Mars 2009
    Messages : 105
    Points : 41
    Points
    41
    Par défaut
    Bonjour zyhack,

    Merci zyhack j'essaie ca de suite.

    sinon pour la verification des proprietaires, j'ai un bug dans le cas ou je n'ai pas de separation.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    'si il n'y a qu'un tiret le nom du propriétaire est définit automatiquement
          If InStr(1, C.Value, "-") = InStrRev(C.Value, "-") Then
            texte = Left(C.Value, InStr(1, C.Value, "-") - 1) 'bug a ce niveau la
    comment on peut faire pour ignorer ce cas la et continuer la procedure?
    (si ca n'engage pas trop de chgmts au niveau du code)

    Je ne prendrai pas les cas ou j'ai de erreurs dans mon fichier c'est plus simple, en esperant que ca ne fausse pas trop mes resultats.

    Merci beaucoup

    Cordialement,

  20. #20
    Membre chevronné Avatar de aalex_38
    Inscrit en
    Septembre 2007
    Messages
    1 631
    Détails du profil
    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 631
    Points : 1 999
    Points
    1 999
    Par défaut
    Bonjour à tous,



    Tu pourrai faire quelque chose comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    If pos <> 0 Then
        If pos = InStrRev(c.Value, "-") Then
                texte = Left(c.Value, pos - 1) 'bug a ce niveau la
        End If
    End If

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. [XL-2010] Tableau de HTML vers excel avec Macro
    Par arthurc02 dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 04/07/2014, 13h58
  2. [XL-2007] Filtrage multiple d'un tableau excel avec macro
    Par robby98800 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 29/05/2012, 09h39
  3. Réponses: 4
    Dernier message: 05/12/2006, 11h43
  4. Ouverture de fichier Excel avec macros
    Par Mathusalem dans le forum MATLAB
    Réponses: 2
    Dernier message: 15/06/2006, 11h39
  5. probleme de selection aleatoire sur excel avec macro vba
    Par guillaume sors dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 21/10/2005, 10h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo