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 :

Générer une feuille excel regroupant des données d'autres feuilles ou classeurs


Sujet :

Macros et VBA Excel

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut Générer une feuille excel regroupant des données d'autres feuilles ou classeurs
    Bonjour,

    Je connais bien l'aide que peut apporter ce forum étant donné que je l'ai utilisé à maintes reprises pour Matlab...
    Or cette fois ci, ayant changé de domaines, je m'attaque à Excel et même au VBA...
    Je possède donc quelques connaissances de programmation mais là je bloque complètement car je ne connais pas grand chose à cet outil...

    Je vais tenter de formuler ma requête le plus simplement et le plus précisément du monde :

    1. J'utilise dans mon travail 4 classeurs excel contenant chacun au moins 10 feuilles (nous sommes quasiment au limite d'excel d'ailleurs).

    2. Je cherche à créer/générer via un bouton ou une feuille ou par n'importe quel moyen une feuille capable de regrouper les informations qui sont importantes.

    3. Le souci est que bien évidemment ces données varient selon le projet. La feuille générée aura donc la même "ossature" pour tous les projets mais son contenu (=ses valeurs) sera complètement différent.

    4. Je pense avoir posé les bases clairement. Je vais maintenant rentrer un peu plus dans le détail :

    5. Par exemple, je dispose d'une machine comportant "X" éléments (X varie de 1 à 40 en moyenne). Choisissons X = 7. Je souhaiterais que sur ma feuille générée il apparaisse les chiffres 1, 2, 3...7 sur la même colonne à 2 ou 3 lignes d'espacement.
    Le plus important est de bien comprendre que "X" varie et je voudrais qu'à chaque fois, la fonction utilisée décide du nombre de lignes à considérer en les remplissant des bonnes valeurs (==> Nombre de lignes = "X").

    6. Ensuite, j'aimerais faire de même avec les autres valeurs importantes qui interagireraient selon "X".

    7. Voici un ptit dessin vous montrant un ptit peu le style de feuille que j aimerais obtenir : voir Pièce jointe.


    Voilà, j'espère avoir été clair et je pense être obligé de passer en VBA et non pas par les fonctions classiques d'excel.

    Je vous remercie tous d'avance pour votre aide et soutien

    A bientôt

    Doc doc doc
    Images attachées Images attachées  

  2. #2
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Tu vas rire: je n'ai rien compris!!!
    Quels sont les données à mettre à aller chercher? D'où vient les "X" (dans chaque feuille?)? Comment sont disposées les données dans les feuilles Excel? Comment se nomment ces feuilles Excel? Qu'es-ce qui fait que l'on va mettre les données sous machine 1 ou machine 2, ou machine 3?
    Que de questions malgré toutes ces explications...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Ah zut alors !!
    C'était la réponse que je craignais...Bon reprenons et de façon plus claire.
    Mon dessin n'a point aidé apparemment!!
    Merci en tout cas de t'être arrêté sur mon sujet.

    Je réponds à tes questions étape par étape :

    - Quels sont les données à mettre à aller chercher?
    Les données à mettre sont des nombres.
    Elles sont à aller chercher dans une autre feuille excel (dans un autre onglet).

    - D'où vient les "X" (dans chaque feuille?)?
    Les "X" représentent en fait un nombre de couches (donc un chiffre) qui peut varier (de 1 à 40).
    Ce nombre de couches dépend de la configuration de la machine.
    C'est à dire que sur un projet :
    la machine 1 peut avoir 7 couches.
    la machine 2 peut avoir 32 couches
    la machine 3 peut avoir 1 couche...etc

    Sur un autre projet :
    la machine 1 peut avoir 30 couches.
    la machine 2 peut avoir 18 couches.

    On peut avoir de 2 à 6 machines...

    -Comment sont disposées les données dans les feuilles Excel?
    Les données sont à 90% dans une feuille (un onglet) excel et 10% restant se situent dans d'autres feuilles excel.
    Elles sont disposées dans des cellules. C'est à dire 1 donnée = 1 cellule.
    Ce sont ces données que bien évidemment j'aimerais "rapatrier" sur cette fameuse feuille que je voudrais générer.

    -Comment se nomment ces feuilles Excel?
    Ces feuilles excel se nomment "ImprCalc", "FE1", "FE2"...

    -Qu'es-ce qui fait que l'on va mettre les données sous machine 1 ou machine 2, ou machine 3?
    La machine 1 a ses propres données répertoriées dans un tableau excel.
    La machine 2 et 3 idem.
    Voici comment ca se présente sous excel en simplifié :

    VOIR Image JPEG FOURNIE

    Chaque chiffre ou écrit est dans une cellule.

    Voili voilou, j'espère que c'est un peu plus clair désormais...

    Donc ce que je désirerais c'est pouvoir reprendre ces données selon le projet et les mettre directement dans une feuille selon l'arrangement de l'image jpeg que j'ai envoyée dans le mail précédent...

    Merci beaucoup pour les réponses qui vont suivre.

    ++

    Doc doc doc
    Images attachées Images attachées  

  4. #4
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Désolé, mais c'est incompréhensible. Du moins pour apporter une aide concrète. Pourtant c'est très simple à expliquer ton problème. Il faut que tu nous dise:

    "Voici comment sont disposées les données, et voici comment je veux qu'elles soient au final". En effet, on sait ce que tu veux faire au final, mais on a aucune idée du contenue des feuilles à l'origine!!! En gros, il faudrait avoir la tronche des feuilles Excel, avant de pouvoir récupérer les données et arriver au résultat désiré, résultat exposé dans le premier post. Comment veux-tu que l'on puisse t'indiquer comment faire si on ne sait pas si les données sont en colonnes, ou en lignes, ou avec des espaces, ou collé, ou sur les dernières colonnes des feuilles Excel, ou si il y a une particularité selon le nom des feuilles, etc...

    Tu parles en terme technique sur ton problème, mais ces termes ne me parlent pas. Moi ce qui m'intéresse c'est ce que tu as au départ, et comment tu veux que cela devienne. Les machines ou dire que les données peuvent changer selon ces dernières ne font pas avancer le débat.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Hello Psycho !!

    Merci encore de t'attarder sur mon cas

    Comme on dit qu'un beau dessin vaut mieux qu'un beau discours, je te joins cette fois un dessin bien complet qui, je l'espère, aidera à mieux me faire comprendre et à me faire avancer

    Bien évidemment je ne tiens pas à avoir un code deja fait mais au moins qqch pour me lancer qui me permettrait d'écrire au moins 1 ligne de code

    Petite précision : ceci est un exemple et comme je décrivais plus haut dans un autre message toutes ces données sont variables et dépendent complètement du projet...

    Merci encore

    Doc doc doc
    Images attachées Images attachées  

  6. #6
    Membre confirmé
    Homme Profil pro
    Inscrit en
    Octobre 2007
    Messages
    324
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2007
    Messages : 324
    Points : 470
    Points
    470
    Par défaut
    Bon Ok. On va faire simple pour commencer. La feuille des données s'appelle "FeuilMachine". Celle qui va recevoir les résultats s'appelle "FeuilRapat". Pour "FeuilMachine", on va faire un exemple plus simple (désolé mais pas tout compris). Donc on a sur la première ligne, "Machine 1" en colonne 1, "Machine 2" en colonne 2, rien troisième colonne, "int.' en colonne 4 (pas arriver à faire le signe devant, mais on s'en moque c'est pour délimiter le fait que l'on va avoir les diamètres), "Machine 1" en colonne 5, 255 en colonne 6. Pour l'instant ça ressemble au schéma de gauche de ta dernière image.

    La différence est que l'on ne va faire le test que sur les valeurs concernées par le rapatriement. Ainsi, à partir de la ligne 2, dans les deux premières colonnes, les trois premières valeurs seront considérées comme les bonnes, et il faut garder le même ordre que dans ton image. On a alors pour la colonne 1, 8 en ligne 2, 90 en ligne 3, et 2.25 en ligne 5 (les espaces ne posent pas de problèmes puisque le programme ne prendra que les trois premières valeurs). Aussi, il ne faut pour l'instant mettre que du numérique pour que cela fonctionne.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    Machine 1	Machine 2		int.	Machine1	225
    8	             22          	2x		0
    90	           2420     	  	2x		0
    	                       	       	int	Machine2	512
    2,25	           2,43       	  	2x		0
    	                       	  	2x		0
    	                       	  	int      		613
                             	 	        		0
    		  	                       	        	0

    Après avoir fait tout cela, ben tu créé un Module dans Excel et tu fais un beau copié collé...

    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
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
     
     
    'On créé un type machine ce qui est plus pratique que de passer par des variables multiples
    '(la flemme de passer par des modules de classes...)
    Public Type typeMachine
        Cches As Integer
        Spi As Double
        Dist As Double
    End Type
     
     
    'Cette fonction va affecter les bons nombres avec les bons éléments, en supoposant que Cches,Spi et Dist se suivent dans cet ordre
    '(du coup un module de classe aurait été plus "propre"...)
    Public Sub affecterElementMachine(ByRef machine As typeMachine, ByVal feuille As Worksheet, ByVal nbElementsParMachine As Byte, ByVal ligne As Integer, ByVal colonne As Integer)
     
    Select Case nbElementsParMachine
        Case 0
            machine.Cches = Worksheets("FeuilMachine").Cells(ligne, colonne)
        Case 1
            machine.Spi = Worksheets("FeuilMachine").Cells(ligne, colonne)
        Case 2
            machine.Dist = Worksheets("FeuilMachine").Cells(ligne, colonne)
    End Select
     
    End Sub
     
     
    'Pour une variable de type typeMachine on va renseigner les différents champs
    Public Sub renseignerMachine(ByRef machine As typeMachine, ByVal feuille As Worksheet, ByVal colonne As Integer)
     
    Dim nbElementsParMachine As Byte, i As Integer
    nbElementsParMachine = 0
    i = 2
    'Dès que l'on a récupéré les valeurs cches,Spi, et Dist on arrête de parcourir les lignes de la colonne
    While nbElementsParMachine < 3
        'En parcourant chaque ligne de la colonne concernée, si on trouve une valeur, alors on l'a récupère
        If (feuille.Cells(i, colonne) <> "") Then
            affecterElementMachine machine, feuille, nbElementsParMachine, i, colonne
            nbElementsParMachine = nbElementsParMachine + 1
        End If
        i = i + 1
    Wend
     
     
    End Sub
     
    Public Sub remplirFeuilleResultats(ByRef feuilleResultat As Worksheet, ByRef machine As typeMachine, ByRef position As Integer, ByVal numeroMachine As Byte, ByRef tableDimension() As Double)
     
    Dim i As Integer, dimensionDebut As Double, dimensionFin As Double, dimensionInterm As Double
     
    dimensionDebut = tableDimension(numeroMachine - 1)
    dimensionFin = tableDimension(numeroMachine)
     
    'Dans l'exemple pour la machine 1, tous les diamètres sont différentiés par une valeur de 41
    'soit (512-225)/(8-1)
    dimensionInterm = Abs(dimensionFin - dimensionDebut) / (machine.Cches - 1)
     
    'Les premiers libellés pour la machine concernée
    feuilleResultat.Range("A" & position) = "Machine " & numeroMachine
     
    With feuilleResultat.Range("A" & position & ":G" & position)
        .Merge
        .HorizontalAlignment = xlCenter
    End With
     
    feuilleResultat.Range("A" & position + 1) = "Cches:"
    feuilleResultat.Range("C" & position + 1) = "Spi:"
     
    position = position + 2
    For i = 1 To machine.Cches
        feuilleResultat.Range("B" & position) = i
        feuilleResultat.Range("D" & position) = machine.Spi * i / machine.Cches
        feuilleResultat.Range("E" & position + 1) = "Dist:"
        feuilleResultat.Range("F" & position + 1) = machine.Dist
        feuilleResultat.Range("G" & position) = "Diam:"
        feuilleResultat.Range("H" & position) = dimensionDebut + (dimensionInterm * (i - 1))
        position = position + 2
    Next
     
     
    End Sub
     
    Private Function colonneDimensions(ByVal feuille As Worksheet, ByVal champ As String) As Integer
     
    Dim j As Integer
    j = 1
    'Attention champ doit être correctement écrit sinon la boucle parcours chaque colonne et le programme va planter
    While (feuille.Cells(1, j) <> champ)
        j = j + 1
    Wend
     
    colonneDimensions = j + 2
     
     
    End Function
     
    Public Sub recupererDimensions(ByRef tableDimension() As Double, ByVal feuille As Worksheet, ByVal colonne As Integer)
     
    Dim i As Integer, taille As Integer
    i = 1: taille = -1
     
    While feuille.Cells(i, colonne) <> ""
        If (feuille.Cells(i, colonne) <> 0) Then
            'On considère que la dimension est différente de zéro (selon l'exemple)
            taille = taille + 1
            ReDim Preserve tableDimension(taille)
            tableDimension(taille) = feuille.Cells(i, colonne)
        End If
        i = i + 1
    Wend
     
    End Sub
     
    Public Sub remplirTableMachines(ByRef feuilleOrigine As Worksheet, ByRef tableMachines() As typeMachine)
     
    Dim nbMachine As Integer, j As Integer
    nbMachine = -1: j = 1
     
    'On considère que le la première machine est dans la colonne 1 et que tant qu'il y a quelque chose chaque première case de
    'chaque colonne, on a une machine
    While (feuilleOrigine.Cells(1, j) <> "")
        nbMachine = nbMachine + 1
        ReDim Preserve tableMachines(nbMachine)
        renseignerMachine tableMachines(nbMachine), feuilleOrigine, j
        j = j + 1
    Wend
     
     
    End Sub
     
     
     
    'Procédure principale à exécuter
    Public Sub finalisation()
     
    Dim tableDimension() As Double, tableMachines() As typeMachine, feuilleOrigine As Worksheet, feuilleResultats As Worksheet
    Dim j As Integer, position As Integer
     
    ' La feuille d'origine avec les données s'appelle FeuilMachine
    Set feuilleOrigine = Worksheets("FeuilMachine")
    'La feuille avec les résultats voulus s'appelle FeuilRapat
    Set feuilleResultats = Worksheets("FeuilRapat")
     
    'On supprime toutes les données de la feuille de résultats
    feuilleResultats.Cells.Delete
     
    position = 1
     
    'On suppose que les dimensions se trouvent deux colonnes après la colonne avec "int."
    recupererDimensions tableDimension, feuilleOrigine, colonneDimensions(feuilleOrigine, "int.")
     
    'On récupère les données de chaque machine dans la table des machines....
    remplirTableMachines feuilleOrigine, tableMachines
     
    'Pour chaque machine, on met les données en forme dans la feuille des résultats
    For j = 0 To UBound(tableMachines)
        remplirFeuilleResultats feuilleResultats, tableMachines(j), position, j + 1, tableDimension
    Next
     
     
    Set feuilleOrigine = Nothing
    Set feuilleResultats = Nothing
     
    End Sub

    La procédure à exécuter est la procédure finalisation. Pas parfait le programme mais c'est un début, surtout que tes données sont très bizarre, et que je n'ai pas tout compris. En effet, si le programme fonctionne, tu remarquera que les données de diamètres pour la machine 2 diffèrent pour la première valeur. N'ayant pas compris le mode de calcul...

  7. #7
    Membre du Club
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2006
    Messages : 101
    Points : 61
    Points
    61
    Par défaut
    Merci énormément Psycho !!

    C'est vraiment un gros travail que tu m'as fourni et je t'en suis très reconnaissant

    Je vais regarder en détail tout ça et je pense que j'aurai sûrement d'autres questions...

    Et oui en effet, je comprends que ces données paraissent un brin bizarres mais dans l'électrotechnique c'est souvent le cas !!

    Merci encore et à très bientôt pour de nouvelles questions

Discussions similaires

  1. copier des données sur autre feuille excel
    Par mirage37 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 17/07/2012, 11h33
  2. Recupérer des données de plusieurs feuilles excel
    Par philoux34 dans le forum Macros et VBA Excel
    Réponses: 12
    Dernier message: 31/03/2009, 16h34
  3. Réponses: 1
    Dernier message: 19/11/2008, 18h51
  4. Ecrire des données dans deux feuilles excel
    Par gantec dans le forum Macros et VBA Excel
    Réponses: 24
    Dernier message: 28/02/2007, 08h28
  5. [excel] croiser des données sur 2 feuilles
    Par redwire dans le forum Excel
    Réponses: 2
    Dernier message: 06/01/2007, 10h38

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