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 :

Macro pour copier une cellule d'un classeur à un autre sous condition [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut Macro pour copier une cellule d'un classeur à un autre sous condition
    Bonjour , une nouvelle fois je vous écris

    Pour commencer j'ai un fichier avec 2 colonnes que je dois remplir , a l'aide d'un autre fichier.Mais pour savoir laquelle des 2 remplir je dois me réferencer a un 3éme fichier

    Pour cela j'ai essayé ceci

    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
    Sub essai()
     
      Dim Lig     As Long
      Dim Col     As String
      Dim NbrLig  As Long
      Dim NumLig  As Long
     
      Sheets("Feuil2").Activate ' feuille de destination
     
      Col = "C"                 ' colonne de la donnée non vide à tester
      NumLig = 0
      With Sheets("Feuil1")     ' feuille source
      NbrLig = .Cells(65536, Col).End(xlUp).Row
      For Lig = 1 To NbrLig
        If .Cells(Lig, Col).Value <> "" Then
          .Cells(Lig, Col).EntireRow.Copy
          NumLig = NumLig + 1
          Cells(NumLig, 1).Select
          ActiveSheet.Paste
        End If
      Next
      End With
     
    End Sub
    mais cela me met une erreur 1004 et je ne sais pas comment il faut que je fasse pour qu'il sache quelle cellule remplir.

    En vous remerciant de l'aide que vous pourrez m'apporter.

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

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

    Pourrais-tu donner un peu plus d'explication sur ton besoin car en te lisant

    Pour commencer j'ai un fichier avec 2 colonnes que je dois remplir , a l'aide d'un autre fichier.Mais pour savoir laquelle des 2 remplir je dois me réferencer a un 3éme fichier
    Tu parle de trois fichier ->trois classeurs ou trois feuilles?

    car en regardant ton code il n'y a pas de référence à ce 3eme fichier, quand tu trouve une cellule non vide dans la feuille 1 tu copie cette ligne dans la feuille 2.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut
    en faite j'ai 3 classeur différents , et je dois remplir dans le premier 2 colonne a l'aide du deuxiéme classeurs (c'est soit l'une soit l'autre , les 2 colonnes ne peuvent être toutes les 2 remplis sur la même lignes),mais pour savoir laquelle des 2 remplir je dois me réferencé a un 3éme classeurs , c'est la ou le probléme se pause car je dois remplir un classeur a l'aide de 2 mais je ne sais pas si c'est possible.

    Il faudrait que je sache quelle colonne remplir en premier lieu et ensuite la remplir mais je ne trouve pas de réponse a ce type de question sur le forum et sur d'autres

    Si j'ai bien compris ce que tu m'a dit mon code ne sert a copier que d'une feuille a une autre mais dans un meme classeur ?

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

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    donc en schématisant tu voudrais quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    sub remplissage()
     
    'Boucle dans la colonne C du classeur2
     
      'si la cellule n'est pas vide
     
        'vérifier dans le classeur3 dans quelle colonne il faut aller écrire
     
        'copier dans feuille1
     
        'coller dans feuille 2 suivant le résultat de classeur3
     
    end sub
    Il restera à définir quelle sera la nature du test à réaliser, qu'est ce qui sera copié et ou il faudra le coller

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    2 130
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 2 130
    Par défaut
    Salut mairiemeudon et le forum
    Ce qui est évident ne l'est que pour ceux qui travaillent avec le fichier, pas pour ceux qui dépannent occasionnellement !!!

    Tu parles de 3 fichiers, et tu as une macro qui ne travaille que sur 2 feuilles ???
    Tu utilises des select/activate => ton erreur vient vraissemblablement de là parce que ton module est celui lié à la feuille 2
    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
    Sub essai()
    Dim Lig     As Long
    Dim Col     As String
    Dim NbrLig  As Long
    Dim NumLig  As Long
    Dim F_S As Worksheet, F_D As Worksheet
    Set F_S = Sheets("Feuil1")  ' feuille source
    Set F_D = Sheets("Feuil2")  ' feuille de destination
    Col = "C"                 ' colonne de la donnée non vide à tester
    'NumLig = 0 => inutile, une variable nombre est initialisée à 0 par défaut
    NbrLig = F_S.Cells(Rows.Count, Col).End(xlUp).Row '=> prévoir une valeur max ligne pour nouvelle version
    For Lig = 1 To NbrLig
        If F_S.Cells(Lig, Col) <> "" Then
            NumLig = NumLig + 1
            F_S.Rows(Lig).Copy F_D.Cells(Rows.Count, "A").End(xlUp)(2)
            'F_S.Rows(Lig).Copy F_D.Cells(NumLig, "A")
        End If
    Next
    End Sub
    Fondamentalement, c'est la même macro.
    Mais comme tu compte travailler sur plusieurs feuilles, plusieurs fichiers, je préfère utiliser des nom court à la place de Workbook("X").sheets("Y") : F_S rend le code plus lisible.
    Comme tous ceux qui ont une certaine habitude, j'ai supprimé les activate/select, sources d'erreurs et de ralentissement.
    J'ai supprimé le RowEntire qui donne une instruction trop longue et peu lisible

    Je t'ai mis 2 copies possibles :
    - à partir de NumLig => on recommence de la ligne 1, mais dans ce cas, il faudrait prévoir d'effacer l'existant : Si la première fois que la macro passe, elle copie de 1 à 10 et la seconde de 1 à 3, les lignes 4 à 10 pourront prêter à confusion.
    - à partir de la première ligne vide en A (faudrait faire un test pour savoir si la ligne 1 est vide et dans ce cas commencer en 1, mais il y a souvent un titre, alors...)

    Mais dans tous les cas, le code que tu as proposé est clair et les variables sont définis, ce qui donne des dépannages du code rapides
    A+

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut
    à peu de chose prés c'est ca Zyhack sauf que dans mon premier fichier mes 2 colonnes a remplir sont vide par défaut.

    et la copie s'effectue de la feuille 2 vers la feuille 1.

    Ce qui est évident ne l'est que pour ceux qui travaillent avec le fichier, pas pour ceux qui dépannent occasionnellement !!!
    Je me permet de vous proposer les fichiers en piéce jointes , si ca peut vous aidez a mieux comprendre.

    Donc avec le fichier "fichier2" ( la colonne "Montant") je dois remplir soit la colonne "TRAIT" , soit la colonne "MONTANT" de mon fichier "fichier1".
    Pour savoir laquelles des deux colonnes je dois remplir , je me référencie au "fichier3".

    Mais j'ai oublier de vous précisez quelque chose de trés complexe car dans le fichier 1 le tableau "MAD" correspond a la colonne "code budget" ayant pour chiffre 3 du fichier "fichier2".

    le tableau "SAD" correspond a la colonne "code budget" ayant pour chiffre 2 du fichier "fichier2"

    le tableau "CCAS" correspond a la colonne "code budget" ayant pour chiffre 1 du fichier "fichier2"

    Pour résumer en un peu plus compréhensible , J'ai mon fichier 1 dans lequelles je veux remplir des tableaux ; aux nombres de 3 (MAD , SAD et CCAS) pour cela je dois reporter la colonne "MONTANT" du fichier "fichier2" dans le bon tableau et cela selon la colonne "code budget"

    si la colonne "code budget" est a 1 ce sera le tableau CCAS a remplir si elle est a 2 ce sera le tableau SAD a remplir et si elle est a 3 ce sera le tableau MAD a remplir.



    Mais pour le remplir il reste une derniére condition , il faut savoir si c'est la colonne "TRAIT" ou "MONTANT" a remplir , pour cela il faut se réferencé au dernier fichier ("fichier3")


    Bon je vous l'accorde ce que je vous demande parait trés complexe (pour un débutant comme moi) , mais je ne pense pas que ce le soit pour vous , la seule difficulté comporte dans la compréhension de mon probléme , car il est possible que mes éxplications soit un peu flou.


    Merci de ta réponse gorfael mais je pense avoir mal exprimé mon probléme.

  7. #7
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    Avant toute chose dans ton classeur Fichier1 dans la cellule C21 il faut que tu enlève l'espace entre FR. et Mission (FR. MISSION par FR.MISSION)

    puis essaye ce code

    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
    Sub essai()
      Dim wsh1 As Worksheet, wsh2 As Worksheet, wsh3 As Worksheet
      Dim plage As Range 'plage de cellules
      Dim C As Range, F As Range 'cellule de boucle / cellule de recherche
      Dim pMad As Range, pSad As Range, pCca As Range, pTra As Range 'plage d'écriture sur wsh1
     
      Dim codeT As String, codeC As String
      Set wsh1 = Workbooks("Fichier1.xls").Worksheets("Feuil1")
      Set wsh2 = Workbooks("Fichier2.xls").Worksheets("Répartition par nature")
      Set wsh3 = Workbooks("Fichier3.xls").Worksheets("Feuil1")
      Set pMad = wsh1.Range("C3:C15") 'plage Libellé MAD
      Set pSad = wsh1.Range("C19:C32") 'plage Libellé SAD
      Set pCca = wsh1.Range("C35:C47") 'plage Libellé CCAS
     
      'mémorisation des codes traitement (codeT) et charges (codeC)
      With wsh3
      Set plage = .Range("B2:B" & .Cells(Rows.Count, 2).End(xlUp).Row)
        For Each C In plage
          If C.Offset(0, 1) <> "" Then
            codeT = codeT & C.Value
          ElseIf C.Offset(0, 2) <> "" Then
            codeC = codeC & C.Value
          End If
        Next
      End With
     
      Set plage = wsh2.Range("E3:E" & wsh2.Cells(Rows.Count, 5).End(xlUp).Row)
      For Each C In plage
        If C.Value <> "" Then
          Select Case C.Offset(0, 1)
            Case "01": Set pTra = pCca
            Case "02": Set pTra = pSad
            Case "03": Set pTra = pMad
          End Select
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          If InStr(1, codeT, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 5) = wsh2.Cells(C.Row, 5)
          ElseIf InStr(1, codeC, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 6) = wsh2.Cells(C.Row, 5)
          End If
        End If
      Next
     
      Set wsh1 = Nothing: Set wsh2 = Nothing: Set wsh3 = Nothing
      Set plage = Nothing: Set C = Nothing: Set F = Nothing
      Set pTra = Nothing: Set pCca = Nothing: Set pSad = Nothing: Set pMad = Nothing
    End Sub
    je l'ai essayé en le mettant dans le classeur1 puis dans le classeur2 ça marche donc tu peux le mettre indépendament dans l'un ou l'autre

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Par défaut
    Merci beaucoup de cette réponse rapide et compléte , mais il y a un léger probléme

    C'est bon tout marche sauf que je me suis trompé dans ma problématique en disant

    Mais pour le remplir il reste une derniére condition , il faut savoir si c'est la colonne "TRAIT" ou "MONTANT" a remplir , pour cela il faut se réferencé au dernier fichier ("fichier3")
    Ce n'est pas "MONTANT" mais "CHARGE" , desolé de la faute.

    pourrais tu m'indiqué quelle changement il faut effectué sur le code , stp

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Avril 2008
    Messages
    633
    Détails du profil
    Informations personnelles :
    Âge : 57
    Localisation : France

    Informations forums :
    Inscription : Avril 2008
    Messages : 633
    Par défaut
    A mon avis tu n'as pas fait ça

    Avant toute chose dans ton classeur Fichier1 dans la cellule C21 il faut que tu enlève l'espace entre FR. et Mission (FR. MISSION par FR.MISSION)
    j'avais la même erreur.

    il faut que les libéllés soient écrit exactement pareil sur toute tes feuilles.

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

Discussions similaires

  1. macro pour copier une feuille d'un classeur à un autre
    Par rihab92 dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 03/05/2015, 21h05
  2. [XL-2002] Macro pour copier une feuille dans un autre classeur
    Par JBeaunez dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 09/02/2012, 21h46
  3. [XL-2003] macro pour remplir une cellule en fonction d'une autre
    Par kamilane dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 27/07/2010, 15h40
  4. [XL-2003] macro pour copier une en-tête de fichier dans +sieurs fichiers
    Par Frayer dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 12/08/2009, 21h40
  5. Code VBA pour Copier une cellule dans un filtre?
    Par Redisdead dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 12/02/2009, 05h48

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