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

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    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 é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

    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.
    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 à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    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 é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
    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
    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 émérite
    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
    Points : 2 443
    Points
    2 443
    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 à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    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 é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
    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
    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

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

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    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 é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
    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.
    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

  10. #10
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Oui j'avais fait l'erreur au début et je l'ai rectifié mais je me suis trompé dans ma demande , j'ai éditer mon post

    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


    Citation:
    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
    Il y aura donc un décallage dans le tableau comment être sur de ne pas intervertir "CHARGE" et "TRAIT"

  11. #11
    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
    je te remet le code modifié et avec plus de commentaire
    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
    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)
      'boucle dans classeur2 colonne E
      For Each C In plage
        If C.Value <> "" Then ' si la cellule n'est pas vide
          'Selection de CCA, SAD ou MAD suivant le chiffre
          Select Case C.Offset(0, 1)
            Case "01": Set pTra = pCca
            Case "02": Set pTra = pSad
            Case "03": Set pTra = pMad
          End Select
          'recherche du libelle dans la feuille 1
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          'definir si c'est un TRAIT ou CHARGE
          If InStr(1, codeT, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 7) = wsh2.Cells(C.Row, 5) 'Ecriture TRAIT colonne 7
          ElseIf InStr(1, codeC, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 6) = wsh2.Cells(C.Row, 5) 'Ecriture CHARGE colonne 6
          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
    et ta demande
    Ce n'est pas "MONTANT" mais "CHARGE" , desolé de la faute.

    pourrais tu m'indiqué quelle changement il faut effectué sur le code , stp
    était sur cette ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wsh1.Cells(F.Row, 7) = wsh2.Cells(C.Row, 5) 'Ecriture TRAIT colonne 7
    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

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Un grand merci a toi pour le temps que tu y a passé et pour les explications que tu m'a fourni , très bon boulot !!!

    Cordialement.

  13. #13
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Je remet a jour ce post en posant une derniére problématique qui m'embéte , en faite je me suis légerement trompé dans l'énoncé , je dois remplir la colonne "Montant" et en fonction du libellé (que l'on a deja comparé au fichier 3) ce sera la colonne TRAIT ou CHARGES qui sera remplie , ca ne change que très peu le code , mais en faite le tableau est configuré tel que lorsque je rentre une valeur dans montant , la même valeur soit reporté dans "TRAIT" ou "CHARGES"

    si Zyhack ou quelqu'un d'autre pourrait m'éclairer sur le sujet , je remet le code qui marché deja mais pas comme je le voulais en faites :

    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
    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)
      'boucle dans classeur2 colonne E
      For Each C In plage
        If C.Value <> "" Then ' si la cellule n'est pas vide
          'Selection de CCA, SAD ou MAD suivant le chiffre
          Select Case C.Offset(0, 1)
            Case "01": Set pTra = pCca
            Case "02": Set pTra = pSad
            Case "03": Set pTra = pMad
          End Select
          'recherche du libelle dans la feuille 1
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          'definir si c'est un TRAIT ou CHARGE
          If InStr(1, codeT, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 6) = wsh2.Cells(C.Row, 5) 'Ecriture TRAIT colonne 6
          ElseIf InStr(1, codeC, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 7) = wsh2.Cells(C.Row, 5) 'Ecriture CHARGE colonne 7
          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

  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 mairiemeudon

    Content que le code fonctionne

    si j'ai bien compris, dans cette partie du code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
          'recherche du libelle dans la feuille 1
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          'definir si c'est un TRAIT ou CHARGE
    il faut ajouter une ligne pour que ça donne ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
          'recherche du libelle dans la feuille 1
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          wsh1.Cells(F.Row, 5) = wsh2.Cells(C.Row, 5) 'Ecriture MONTANT colonne 5
          'definir si c'est un TRAIT ou CHARGE
    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

  15. #15
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    merci de ta réponse rapide , c'est exactement ca , sauf que la colonne montant doit être remplie que si c'est la colonne "TRAIT" qui est remplie.


    edit : non en faite c'est bon , c'est exactement ca qu'il me faut , merci encore

    Par contre j'ai modifié mon code , pour que les fichiers 2 et 3 s'ouvrent en caché ( mon code est sur le fichier1) car je suis obligé d'ouvrir les 3 fichier pour que mon code fonctionne .
    Mais cela ne m'ouvre que le fichier 3 et le 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
    48
    49
    50
    51
    52
    53
    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)
      'boucle dans classeur2 colonne E
      For Each C In plage
        If C.Value <> "" Then ' si la cellule n'est pas vide
          'Selection de CCA, SAD ou MAD suivant le chiffre
          Select Case C.Offset(0, 1)
            Case "01": Set pTra = pCca
            Case "02": Set pTra = pSad
            Case "03": Set pTra = pMad
          End Select
      'recherche du libelle dans la feuille 1
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          wsh1.Cells(F.Row, 5) = wsh2.Cells(C.Row, 5) 'Ecriture MONTANT colonne 5
          'definir si c'est un TRAIT ou CHARGE
          If InStr(1, codeT, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 6) = wsh2.Cells(C.Row, 5) 'Ecriture TRAIT colonne 6
          ElseIf InStr(1, codeC, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 7) = wsh2.Cells(C.Row, 5) 'Ecriture CHARGE colonne 7
          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
    ne s'execute pas :/



    Mon code essayé est le suivant :
    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
    Sub test()
     
    ChDir "C:\Documents and Settings\formation\Bureau\ESSAI"
    Workbooks.Open Filename:="C:\Documents and Settings\formation\Bureau\ESSAI\fichier2.xls"
    Windows("fichier2.xls").Visible = False
    End Sub
     
    Sub test2()
     
    ChDir "C:\Documents and Settings\formation\Bureau\ESSAI"
    Workbooks.Open Filename:="C:\Documents and Settings\formation\Bureau\ESSAI\fichier3.xls"
    Windows("fichier3.xls").Visible = False
     
    End Sub
     
     
     
    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)
      'boucle dans classeur2 colonne E
      For Each C In plage
        If C.Value <> "" Then ' si la cellule n'est pas vide
          'Selection de CCA, SAD ou MAD suivant le chiffre
          Select Case C.Offset(0, 1)
            Case "01": Set pTra = pCca
            Case "02": Set pTra = pSad
            Case "03": Set pTra = pMad
          End Select
      'recherche du libelle dans la feuille 1
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          wsh1.Cells(F.Row, 5) = wsh2.Cells(C.Row, 5) 'Ecriture MONTANT colonne 5
          'definir si c'est un TRAIT ou CHARGE
          If InStr(1, codeT, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 6) = wsh2.Cells(C.Row, 5) 'Ecriture TRAIT colonne 6
          ElseIf InStr(1, codeC, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 7) = wsh2.Cells(C.Row, 5) 'Ecriture CHARGE colonne 7
          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

    j'aimerais donc juste que les classeurs s'ouvrent en caché et que le code qui marché avant remarche

  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 ajouté l'ouverture des fichiers 2 et 3 dans la routine et leurs fermeture sans sauvegarde à la fin.
    Attention je n'ai pas mis de gestion d'erreur donc si un des fichier 2 ou 3 est déja ouvert il y aura un message donc ce sera raté pour la discrétion.

    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
     
    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
     
      'attention en cas d'erreur sur le nom du fichier un message de défaut apparait
      Workbooks.Open Filename:="C:\Documents and Settings\formation\Bureau\ESSAI\fichier2.xls"
      Windows("fichier2.xls").Visible = False
     
      Workbooks.Open Filename:="C:\Documents and Settings\formation\Bureau\ESSAI\fichier3.xls"
      Windows("fichier3.xls").Visible = False
     
      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)
      'boucle dans classeur2 colonne E
      For Each C In plage
        If C.Value <> "" Then ' si la cellule n'est pas vide
          'Selection de CCA, SAD ou MAD suivant le chiffre
          Select Case C.Offset(0, 1)
            Case "01": Set pTra = pCca
            Case "02": Set pTra = pSad
            Case "03": Set pTra = pMad
          End Select
          'recherche du libelle dans la feuille 1
          Set F = pTra.Find(C.Offset(0, -2), LookIn:=xlValues, lookat:=xlWhole)
          wsh1.Cells(F.Row, 5) = wsh2.Cells(C.Row, 5) 'Ecriture MONTANT colonne 6
          'definir si c'est un TRAIT ou CHARGE
          If InStr(1, codeT, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 6) = wsh2.Cells(C.Row, 5) 'Ecriture TRAIT colonne 6
          ElseIf InStr(1, codeC, wsh2.Cells(C.Row, 4)) > 0 Then
            wsh1.Cells(F.Row, 7) = wsh2.Cells(C.Row, 5) 'Ecriture CHARGE colonne 7
          End If
        End If
      Next
     
     Workbooks("Fichier2.xls").Close SaveChanges:=False
     Workbooks("Fichier2.xls").Close SaveChanges:=False
     
      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
    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 à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    Bonjour , merci de ta réponse mais il me met une erreur ici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      Workbooks.Open Filename:="C:\Documents and Settings\formation\Bureau\ESSAI\fichier2.xls"
      Windows("fichier2.xls").Visible = False
     
      Workbooks.Open Filename:="C:\Documents and Settings\formation\Bureau\ESSAI\fichier3.xls"
      Windows("fichier3.xls").Visible = False
    lorsque je debug et que j'arrive au niveau de

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Workbooks.Open Filename:="C:\Documents and Settings\formation\Bureau\ESSAI\fichier3.xls"
      Windows("fichier3.xls").Visible = False
    il me demande si je veux réouvrir le fichier 3 ...... donc il m'ouvre bien le fichier 3 mais pas le 2 et je ne vois pas d'ou provient l'erreur car les 3 fichier sont dans le même dossier.


    Quelques précision , je suis sur le fichier1 , je lance visual basic editor et je colle sur feuil1 (general) mon code.

    a la fin quand je ferme tous il me demande si je veux sauvegarder les modifications apporté au fichier 2 et 3 , alors que dans mes classeur a gauche , classeur 2 n'apparait pas , étrange :/.

    Sinon le reste du code s'exécute bien , le remplissage du tablea se fait niquel


    Si quelqu'un a une idée je l'en remercie d'avance.

    Le probléme viens du fichier2 , mais je ne vois pas comment car il a toujours marché correctement. Sinon le reste du code a l'air de marché :/ , quand j'ouvre les fichiers manuellement et lance mon code cela marche niquel , il n'a pas l'air d'aimer l'ouverture du fichier en caché , mais que pour le fichier2 , bizzare :/.

  18. #18
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    ok trouvé , l'erreur venais de la :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Workbooks("Fichier2.xls").Close SaveChanges:=False
     Workbooks("Fichier2.xls").Close SaveChanges:=False
    ca marche mieux avec

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Workbooks("Fichier2.xls").Close SaveChanges:=False
     Workbooks("Fichier3.xls").Close SaveChanges:=False
    merci du coup de main
    Fichiers attachés Fichiers attachés

  19. #19
    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

    avant toutes choses je vien de m'apercevoir qu'il y a un erreur dans mon code. à la fermeture des fichiers. il faut remplacer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Workbooks("Fichier2.xls").Close SaveChanges:=False
     Workbooks("Fichier2.xls").Close SaveChanges:=False
    par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     Workbooks("Fichier2.xls").Close SaveChanges:=False
     Workbooks("Fichier3.xls").Close SaveChanges:=False
    sinon j'ai refais l'essai et ça fonctionne, la seule différence est que la routine est dans un module.
    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

  20. #20
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    26
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 26
    Points : 12
    Points
    12
    Par défaut
    une derniére petite chose qui n'est qu'un détail , la somme des tableaux et la somme finale de tous les tableaux n'est pas effectué , comment amélioré cela ?

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

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