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 :

Mise au point d'une macro


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 100
    Par défaut Mise au point d'une macro
    Bonjour,

    Présentation du sujet :

    Le classeur "devis général" a la macro dans le module 1. Les cellules des lignes 1 à 61 colonnes A à BZ sont vérrouillées et non modifiables.

    Le classeur "mes devis". Les lignes 1 à 47 colonnes A à BZ sont verrouillées et non modifiables.

    Sur ces 2 classeurs les cellules A et BZ sont des cellules fusionnées A=A:E et BZ=BZ:CE.

    Sur chaque lignes il existe aussi d'autre cellules fusionnées entre les colonnes A et BZ.
    La zone de destination posséde des formats de cellules indentiques à la zone source .

    Ce que la macro doit éxécuter:
    Après la saisie du "prénom", du mois et de l'ouverture du classeur "mes devis" la macro doit sélectionner dans "devis général" à partir de la ligne 62 toutes les lignes (colonnes A à BZ) qui correspondent au "prénom", et copier cette sélection dans "mes devis" à partir de la ligne 48 (colonnes A à BZ).

    Exemple :
    Si le prénom est Emmanuel, sélection des lignes 62 et 64 (de A à BZ) dans classeur "devis général"
    Copie de ces 2 lignes dans le classeur "mes devis" à partir de la ligne 48 (colonnes A à BZ)

    Lorsque j'execute la macro ci-dessous aucune copie ne se fait et aucun message d'erreur n'est renvoyé...

    Je tourne en rond depuis 3 jours.....!
    Merci de votre aide
    Lenul78570

    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
    Sub copie()
    '
    ' copie Macro
    '
    '
    Dim prenom As String, mois As String
    Dim plage As Range, cel As Range
    Dim trouve As Byte
    Dim reponse As Variant, Fichier As Variant
    Dim Sh As Worksheet
    Dim wrbo As Workbook, wrbd As Workbook
    Dim wrso As Worksheet, wrsd As Worksheet
    Dim chemin As String, nomfichier As String
    Dim tablo() As String
    Dim dl1 As Long
     
    'expression.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type)
    Do
            reponse = Application.InputBox(Title:="Copie de mes devis", Prompt:="Indiquez votre prénom :", Type:=2, Default:="")
            Select Case reponse
                Case ""
                    MsgBox "vous n'avez pas  fait de saisies!" & Chr(13) & "recommencez!", vbCritical, "GRRrrrr!"
                Case False
                    Exit Sub
                Case Else
                    Exit Do
            End Select
     Loop
    prenom = reponse
    Do
            reponse = Application.InputBox(Title:="Copie de mes devis", Prompt:="Indiquez pour quel mois vous voulez copier vos devis :", Type:=2, Default:="")
            Select Case reponse
                Case ""
                    MsgBox "vous n'avez pas  fait de saisies!" & Chr(13) & "recommencez!", vbCritical, ""
                Case False
                    Exit Sub
                Case Else
     
                        For Each Sh In Worksheets
                            If Sh.Name = reponse Then trouve = 1
                        Next Sh
                    If trouve = 1 Then Exit Do
                    MsgBox ("Le mois demandé n'exste pas dans le classeur")
            End Select
     Loop
    mois = reponse
     
    Set wrbo = ThisWorkbook
    Set wrso = wrbo.Sheets(mois)
     
     
    Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
    If Fichier = False Then Exit Sub
    Workbooks.Open Filename:=Fichier
    tablo = Split(Fichier, "\")
    'Affiche le chemin et le nom du fichier sélectionné.
    Set wrbd = Workbooks(tablo(UBound(tablo)))
    Set wrsd = wrbd.Sheets(mois)
     
    Set plage = wrso.Range("BZ62:BZ" & wrso.Cells(wrso.Rows.Count, 25).End(xlUp).Row)
    For Each cel In plage
        If cel = prenom Then ' pour chaque cellule avec la valeur choisie
        ' on rechherche la première cellule libre en colonne A
            dl1 = wrsd.Cells(wrsd.Rows.Count, 1).End(xlUp).Row + 1
            'on recopie la ligne
            wrso.Range("a" & cel.Row & ":bz" & cel.Row).Copy _
                Destination:=wrsd.Range("a" & dl1 & ":bz" & dl1)
     
        End If
    Next cel
     
    wrbd.Save
    wrbd.Close
     
    End Sub
    Fichiers attachés Fichiers attachés

  2. #2
    Membre très actif

    Profil pro
    Inscrit en
    Mai 2003
    Messages
    343
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2003
    Messages : 343
    Billets dans le blog
    1
    Par défaut
    J'ai une version qui fonctionne avec comme changement :

    Ligne 63 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plage = wrso.Range("BZ62:BZ" & wrso.Range("BZ62").End(xlDown).Row)
    Ligne 67 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If cel.Value = prenom Then
    Et ligne 66 à 79 :

    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
    For Each cel In plage
     
        If cel.Value = prenom Then ' pour chaque cellule avec la valeur choisie
        ' on rechherche la première cellule libre en colonne A
     
            dl1 = wrsd.Range("A47").End(xlDown).Row + 1
     
            If dl1 = 65537 Then
            dl1 = 48
            End If
     
            'on recopie la ligne
            wrsd.Range("A" & dl1 & ":BZ" & dl1) = wrso.Range("A" & cel.Row & ":BZ" & cel.Row).Value
     
        End If
    Next cel

    Bye !

    Je ne sais pas si tu as eu le réflexe, mais lorsque tu as ce genre de problème,

    Vérifie à chaque endroit de ton programme qu'il fait bien ce qu'il est censé faire.

    Le mode "Pas à Pas" est idéal (raccourci F8) . Dans ce mode, passe ta souris sur les variables de ton code pour faire apparaître la valeur qu'elles prennent.

    Bye

  3. #3
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 102
    Par défaut
    Bonjour

    A tester avec le code

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set plage = wrso.Range("BZ62:BZ" & wrso.Cells(wrso.Rows.Count, 78).End(xlUp).Row)
    et
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    dl1 = wrsd.Cells(wrsd.Rows.Count, 78).End(xlUp).Row + 1
    La colonne BZ est la 78 ième et non 25.

    JP014

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 100
    Par défaut
    Bonjour Sympasteve,

    Merci de ton aide, ci-desous la macro modifiée selon tes conseils :

    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
    Sub copie()
    '
    ' copie Macro
    '
    '
    Dim prenom As String, mois As String
    Dim plage As Range, cel As Range
    Dim trouve As Byte
    Dim reponse As Variant, Fichier As Variant
    Dim Sh As Worksheet
    Dim wrbo As Workbook, wrbd As Workbook
    Dim wrso As Worksheet, wrsd As Worksheet
    Dim chemin As String, nomfichier As String
    Dim tablo() As String
    Dim dl1 As Long
     
    'expression.InputBox(Prompt, Title, Default, Left, Top, HelpFile, HelpContextId, Type)
    Do
            reponse = Application.InputBox(Title:="Copie de mes devis", Prompt:="Indiquez votre prénom :", Type:=2, Default:="")
            Select Case reponse
                Case ""
                    MsgBox "vous n'avez pas  fait de saisies!" & Chr(13) & "recommencez!", vbCritical, "GRRrrrr!"
                Case False
                    Exit Sub
                Case Else
                    Exit Do
            End Select
     Loop
    prenom = reponse
    Do
            reponse = Application.InputBox(Title:="Copie de mes devis", Prompt:="Indiquez pour quel mois vous voulez copier vos devis :", Type:=2, Default:="")
            Select Case reponse
                Case ""
                    MsgBox "vous n'avez pas  fait de saisies!" & Chr(13) & "recommencez!", vbCritical, ""
                Case False
                    Exit Sub
                Case Else
     
                        For Each Sh In Worksheets
                            If Sh.Name = reponse Then trouve = 1
                        Next Sh
                    If trouve = 1 Then Exit Do
                    MsgBox ("Le mois demandé n'exste pas dans le classeur")
            End Select
     Loop
    mois = reponse
     
    Set wrbo = ThisWorkbook
    Set wrso = wrbo.Sheets(mois)
     
     
    Fichier = Application.GetOpenFilename("Tous les fichiers (*.*),*.*")
    If Fichier = False Then Exit Sub
    Workbooks.Open Filename:=Fichier
    tablo = Split(Fichier, "\")
    'Affiche le chemin et le nom du fichier sélectionné.
    Set wrbd = Workbooks(tablo(UBound(tablo)))
    Set wrsd = wrbd.Sheets(mois)
     
    Set plage = wrso.Range("BZ62:BZ" & wrso.Range("bz62").End(xlDown).Row)
    For Each cel In plage
        If cel.Value = prenom Then ' pour chaque cellule avec la valeur choisie
        ' on rechherche la première cellule libre en colonne A
            dl1 = wrsd.Range("a47").End(exldown).Row + 1
            If dl1 = 65537 Then
            dl1 = 48
            End If
            'on recopie la ligne
            wrsd.Range("a" & dl1 & ":bz" & dl1) = wrso.range ("a" & cel.row & ":bz" & cel.row) .value
     
        End If
    Next cel
     
    wrbd.Save
    wrbd.Close
     
    End Sub
    Lors de son écriture j'ai un souci avec cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    wrsd.Range("a" & dl1 & ":bz" & dl1) = wrso.range ("a" & cel.row & ":bz" & cel.row) .value
    J'ai une information qui me dis : erreur de compilation - attendu fin d'instruction.
    je vois pas ou est l'erreur...
    Lenul78570

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2009
    Messages
    100
    Détails du profil
    Informations personnelles :
    Âge : 74
    Localisation : France, Yvelines (Île de France)

    Informations forums :
    Inscription : Janvier 2009
    Messages : 100
    Par défaut
    Bonjour Jp014,

    J'ai donc modifié la macro mais elle affiche :
    erreur d'éxécution "1004"
    la méthode de Copy de la classe range a échoué

    Tu vois pourquoi ?

    Lenul78570

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    102
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 102
    Par défaut
    Bonjour

    Ci dessous le code pour copier les données.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
               wrso.Rows(cel.Row & ":" & cel.Row).Copy
               wrsd.Range("a" & dl1 & ":e" & dl1).Select
                ActiveSheet.Paste
    A tester

    JP014

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

Discussions similaires

  1. Aide sur la mise en boucle d'une macro
    Par SPG except in VBA dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 11/07/2014, 22h11
  2. Probème sur la mise au point d'une requête
    Par Emmanuel Deloget dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/01/2008, 17h41
  3. [VBA] Menu qui pointe sur une macro contenue dans un fichier xla protégé
    Par EvaristeGaloisBis dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 07/08/2007, 14h34
  4. [Debutant] Mise au point d'une temporisation
    Par Slivo dans le forum Débuter
    Réponses: 5
    Dernier message: 25/04/2007, 00h18

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