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 :

Redistribution d'un tableau sur d'autres classeurs [XL-MAC 2011]


Sujet :

Macros et VBA Excel

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Redistribution d'un tableau sur d'autres classeurs
    Bonjour à tous,

    Je suis en stage dans une entreprise et j'ai été chargé de simplifier la vie à l'un des employés qui recense des pannes de machines dans le monde (et il en a beaucoup).

    Voila en gros le problème :

    Je dispose d'un classeur "New Failed Boards" avec un tableau recensant toutes les machines tombées en panne l'année passée avec leur modèle (colonne A), le lieu et la date de panne entre autres.
    Je dispose d'un autre classeur "Cartes en panne" avec une feuille par modèle de machine (la feuille porte le nom du modèle), chaque feuille recensant les machines tombées en panne par le passé.

    Et je souhaite que les données de mon classeur "New Failed Boards" aillent automatiquement à la suite du tableau correspondant (si une machine est de tel modèle, elle va dans la feuille correspondante, à la suite de celles qui y figurent déjà).
    Ensuite il faudra tracer des graphes pour chaque modèle, mais c'est une autre affaire.

    Pour faire ça, je me suis lancé dans la création d'une macro mais je n'ai que quelques connaissances en C et Maple, alors le VBA a du mal à rentrer dans ma tête (malgré tous les tutos que j'ai trouvé) ! En particulier j'ai du mal à accepter le fait qu'on ne déclare presque jamais les variables d'une macro...


    J'espère que mon explication était plus ou moins clair. Merci d'avance à vous !

    Voilà ce que j'ai fais, soyez indulgent avec moi svp


    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
    Sub Repartir2()
     
    For Each F In Workbooks("Cartes en panne")
     
    Dim p As Object
    Dim i As Integer
     
    p = FirstEmpty(F)
    i = 2
     
    While Not IsEmpty(Workbooks("New Failed Boards").Worksheets("Feuil1").Cells(i, A))
     
        If Workbooks("New Failed Boards").Worksheets("Feuil1").Cells(i, A).Value = F.Name Then
            p.Value = Workbooks("New Failed Boards").Worksheets("Feuil1").Cells(i, A).Value
     
    'Il faudra rajouter les cases en B,C,D,E,F pour copier toute la ligne
     
            Selection.Offset(1, 0).Activate
     
        End If
     
    Wend
     
    Next
     
     
    End Sub
     
     
     
     
    Private Function FirstEmpty(ByVal feuille As Object) As Object
     
    Worksheets("feuille").Range("A1").Select
     
        Do While Not (IsEmpty(ActiveCell))
     
            Selection.Offset(1, 0).Select
     
        Loop
     
    End Function

  2. #2
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Bonjour Adrien_ax,

    Tout d'abord, concernant ce point :
    Citation Envoyé par Adrien_ax Voir le message
    En particulier j'ai du mal à accepter le fait qu'on ne déclare presque jamais les variables d'une macro...
    Il est vrai qu'une macro peut compiler sans déclaration de l'ensemble des variables.
    Cependant, si les déclarations sont des éléments que tu souhaites absolument, tu peux définir avant ta "Sub" l'option suivante : Option Explicit.
    Celle-ci t'obliges à définir l'ensemble des variables que tu utilises et ainsi te permet d'éviter les erreurs.
    De plus, déclarer des variables réduits le nombre d'octets sur lesquelles tes variables sont enregistrées et permet, ainsi, de réduire le temps d'exécution et l'espace mémoire utilisé.
    Maintenant, au vu de la macro que tu souhaites, ceci sera transparent et ne changera rien lors de l'exécution.

    Par manque de temps, je n'ai pas la possibilité de t'envoyer quelque chose qui répondent à ton besoin de suite.
    Je reviens vers toi demain.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Bonjour Kimy,

    Merci bien pour l'Option Explicit. Enfin si tu me dis que ce n'est pas important pour cette macro je te fais confiance, mais c'est bon à savoir.

  4. #4
    Membre expert
    Avatar de Igloobel
    Homme Profil pro
    Développeur ERP - VBA et Formateur bureautique
    Inscrit en
    Septembre 2005
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Développeur ERP - VBA et Formateur bureautique
    Secteur : Industrie

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 869
    Points : 3 442
    Points
    3 442
    Billets dans le blog
    1
    Par défaut
    Bonjour à tous,

    Je suis tout à fait d'accord avec Kimy_Ire pour l'option Explicit mais j'ajouterais qu'il n'est valable que dans le module où tu l'as déclarer !
    En gros si tu veux tout déclarer et que tu as 3 modules il faut le faire 3 fois (au debut de chaque module)

    sinon tu dis
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Workbooks("New Failed Boards").Worksheets("Feuil1").Cells(i, A)
    A c'est permi ?

    parce que pour moi Cells(N°ligne, N°colonne) c'est d'ailleurs pour cela que l'objet est bien pratique pour passer faciliement d'une colonne a une autre

    A+
    Ils ne savaient pas que c'était impossible ... du coup ils l'ont fait (Mark Twain)

    n'oubliez pas de si les messages vous aide ou sont pertinents et de mettre quand cela est !

  5. #5
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Citation Envoyé par Adrien_ax Voir le message
    Merci bien pour l'Option Explicit. Enfin si tu me dis que ce n'est pas important pour cette macro je te fais confiance, mais c'est bon à savoir.
    Bonjour Adrien_ax,

    Ce que je dis, ce n'est pas que c'est inutile pour ta macro. L'option Explicit est TOUJOURS, d'après moi, à utiliser.
    Elle te permet d'éviter les fautes de frappe, principalement.

    Combien de fois j'ai eu quelque chose du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub demo()
    Dim Var_1 As Integer
     
    Var_ = 5
    MsgBox Var_1 'La MsgBox retourne "0" alors que je veux "5".
     
    End Sub
    L'Option Explicit dit instantanément que la variable "Var_" n'est pas définie.

    Bref, pour ton besoin, peux-tu me dire si j'ai bien compris :
    1. Tu souhaites parcourir la colonne A de ton classeur "New Failed Boards".
    2. Sur cette colonne on trouve les modèles de machines.
    3. On les exporte dans l'onglet correspondant de "Cartes en panne" (Col A = Onglet).

    Q1) Le classeur "New Failed Boards" recense l'ensemble des pannes ou seulement des nouvelles ?
    Q2) Est-ce que tes onglets de "Cartes en panne" ont EXACTEMENT le même nom que ceux de la colonne A de "New Failed Boards" ?
    Q3) Quel est le nom de la/des feuille(s) de "New Failed Boards" ?
    Q4) Tes deux classeurs doivent être tous les deux ouverts, c'est ce que tu souhaites comme fonctionnement ?
    Q5) Quelles sont la valeurs à déplacer ? Col A à F ?

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  6. #6
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Igloobel, tu as raison, on ne peut pas mettre A. C'est moi qui ai mal utilisé la fonction Cells().

    Kimy, tu as parfaitement compris ce que je veux faire.

    1) Le classeur "New Failed Boards" recense seulement les nouvelles pannes, en revanche "Cartes en panne" recense aussi les ancienne.

    2) Oui, j'ai mis excatement le même nom en me disant que ce serait plus simple comme ça. Mais si c'est possible avec un nom de l'onglet légèrement différent ce serait sympa (par exemple "Pannes XB28 depuis 2005" si on parle du modèle XB28).

    3) Dans "New Failed Boards", l'unique feuille s'appelle Feuil1

    4) Deux classeurs ouverts ça ne pose pas de soucis.

    5) En effet, colonnes A à F à déplacer.


    Merci d'avance,
    Adrien.

  7. #7
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Adrien,

    Voici pour toi :
    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
    Option Explicit
     
    Sub Adrien_ax()
    Dim oRange_ori As Range
    Dim oRange_fin As Range
    Dim i As Integer, j As Integer
    Dim Classeur_source As String
    Dim Classeur_cible As String
     
     
    Classeur_source = "New Failed Boards.xlsm"
    Classeur_cible = "Cartes en panne.xlsx"
     
    With Workbooks(Classeur_source)
        With .Worksheets("Feuil1")
            Set oRange_ori = .Range("A1")
            For i = 0 To .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Row - 1
                If FeuilleExiste(Classeur_cible, CStr(oRange_ori.Offset(i, 0))) Then
                    With Workbooks(Classeur_cible).Worksheets(CStr(oRange_ori.Offset(i, 0)))
                        Set oRange_fin = .Columns(1).Find("*", , , , xlByColumns, xlPrevious).Offset(1, 0)
                        For j = 0 To 5
                            oRange_fin.Offset(0, j) = oRange_ori.Offset(i, j)
                        Next j
                    End With
                Else
                    MsgBox "Attention ! Le modèle " & CStr(oRange_ori.Offset(i, 0)) & " ne possède pas de feuille dans le classeur " & Classeur_cible & "."
                End If
            Next i
        End With
    End With
     
    End Sub
     
    Public Function FeuilleExiste(strNomClasseur As String, strNomFeuille As String) As Boolean
     
    FeuilleExiste = Not (IsError(Evaluate("='[" & strNomClasseur & "]" & strNomFeuille & "'!A1")))
     
    End Function
    Il me semble que tu peux utiliser cette macro dans n'importe lequel des deux classeurs. Pour ma part, je l'ai fait à partir du classeur "New Failed Boards".
    Petit élément : si tu lances deux fois ta macro, les lignes vont donc s'insérer deux fois à la fin du classeur "Cartes en panne".
    (EDIT : ) Pour éviter ça, on peut placer un valeur à un endroit "sûr" dans le classeur dès que la macro est lancée. Ainsi, si on relance, l'utilisateur peut avoir le choix de relancer, ou non, la macro.

    N'hésite pas à revenir vers moi si tu rencontres des difficultés.

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  8. #8
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Rebonjour, Kimy !

    Merci beaucoup pour ton aide, je pense avoir bien compris ton code.
    Il y a juste un petit soucis, mes dates au format JJ/MM/AAAA deviennent des nombres du genre 42650 dans le classeur cible.
    EDIT : Je crois avoir compris, la fonction CStr n'est pas adaptée au format date, n'est-ce pas ? Si non, quelle fonction utiliser ? La colonne qui contient les dates est la E si ça peut te servir.

    Si cela ne t'embête pas, je reviendrai peut-être vers toi lundi pour la suite du programme qui est de tracer des courbes dans chaque feuille cible (mais je vais d'abord essayer moi-même).

    En te remerciant encore une fois,
    Adrien.

  9. #9
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Adrien,

    Deux solutions :
    1. Tout simplement tu sélectionnes les colonnes en question et tu les passes en format date.
      J'en conviens, au vu du nombre d'onglets, ça ne va pas être facile...
    2. Sinon, voici :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
                          For j = 0 To 5
                              oRange_fin.Offset(0, j) = oRange_ori.Offset(i, j)
                              If j = 4 Then
                                  oRange_fin.Offset(0, j).NumberFormat = "dd/mm/yyyy"
                              End If
                          Next j

    Pour CStr, cette méthode permet de caster en String. En l’occurrence, le VBA n'aime pas beaucoup des Worksheets(xxx) avec "xxx" qui ne sont pas des String. Ainsi, par soucis de précaution, je lui force à prendre un compte une String, "au cas où"...
    EDIT : Dernier point, Google est ton ami également ! "format date vba" => premier lien !

    Cordialement,
    Kimy
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

  10. #10
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Janvier 2015
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Janvier 2015
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Super, ça marche du tonnerre !
    Encore merci, et bonne soirée.

    Adrien.

  11. #11
    Membre émérite
    Homme Profil pro
    Chef de projet en SSII
    Inscrit en
    Novembre 2011
    Messages
    1 503
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Irlande

    Informations professionnelles :
    Activité : Chef de projet en SSII

    Informations forums :
    Inscription : Novembre 2011
    Messages : 1 503
    Points : 2 657
    Points
    2 657
    Par défaut
    Tu as du le lire sur tout mes posts :
    si c'est ok pour toi et pour les réponses pertinentes !
    La logique :
    • Plus ya de gruyère, moins ya de gruyère.
    • Plus tu pédales moins vite, moins tu avances plus vite.
    Plusoyer les réponses pertinentes et n'oublier pas de résolver en fin de post !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Gérer une variable ou un object sur un autre classeur
    Par TomRay dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 07/10/2008, 12h54
  2. Un refEdit pointant sur un autre classeur
    Par Skieur38 dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 09/07/2008, 11h32
  3. Enregistrer une feuille Excel sur un autre classeur
    Par Manou34 dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 23/01/2008, 17h41
  4. [debutant]passage d'un tableau sur une autre page
    Par sissi25 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 05/02/2007, 10h43
  5. [Tableaux] récupérer un tableau sur une autre page
    Par samsso2005 dans le forum Langage
    Réponses: 3
    Dernier message: 27/01/2006, 23h58

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