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 :

Copie capricieuse des valeurs d'un range vers une autre feuille


Sujet :

Macros et VBA Excel

  1. #1
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 8
    Points
    8
    Par défaut Copie capricieuse des valeurs d'un range vers une autre feuille
    Bonjour à tous.
    J'ai un petit soucis que je n'arrive pas à résoudre.
    J'ai un fichier excel dont la première feuille ( Feuil1) sert de base, avec une combo intégrée par colonne qui permet à l'utilisateur de faire une recherche pour n'afficher que les lignes voulues.

    Je souhaite copier les valeurs des lignes non masquées (celles qui correspondent donc à la recherche) vers une autre feuille du même classeur qui est vierge (en l'occurrence Feuil3).
    Les cellules de Feuil1 peuvent aussi bien contenir des dates, des string ou des formats monétaires.

    Je précise (au cas où) que je n'ai pas accès au code des combos de Feuil1. Ca a été fait par une boite de services informatiques et c'est protégé par mot de passe.

    Feuil1 ne contient des données qu'à partir de la ligne 10, d'où :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Private Const lignDeb As Long = 10
    que j'ai déclaré dans le code de Feuil3.

    Voici la sub appelée lorsque l'utilisateur sélectionne l'onglet Feuil3 :

    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
    Private Sub copDonnees()
     
    Dim i As Long
    Dim DerniereLigne As Long
    Dim lignVis As Range
    DerniereLigne = Feuil1.Cells(65536, 1).End(xlUp).Row
     
    Worksheets("BASE").Activate
     
     
        For i = lignDeb To DerniereLigne
     
            If Not Feuil1.Rows(i).Hidden Then
            'si la ligne n'est pas masquée
                If Not lignVis Is Nothing Then
                    Set lignVis = Application.Union(lignVis, Feuil1.Cells(i, 1).EntireRow)
                Else
                    Set lignVis = Feuil1.Cells(i, 1).EntireRow
                End If
            End If
        Next
     
    lignVis.Copy Feuil3.Cells(10, 2)
    End Sub
    Je me casse les dents sur une erreur d'exécution 1004 :
    'Impossible de coller les informations car les zones Copier et de collage sont de forme et de taille différentes'

    J'ai bien entendu essayé toutes les solutions proposées par l'aide, mais rien n'y fait.

  2. #2
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Bonjour,
    A priori, tu sélectionne de la colonne A à IV (EntireRow) pour copier sur l'autre feuille dans la colonne B, donc ça dépasse forcément.
    Tu as donc 2 options, tu réduis la plage à copier de B à IV (ou dernière colonne remplie),
    Ou tu colle dans la colonne A de ta feuille de destination, ce que j'imagine plus pertinent, adapte donc la ligne avant ton End Sub avec:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignVis.Copy Feuil3.Cells(10, 1)
    Je pense que ça ira.

    Bonne continuation,

  3. #3
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Bonjour, et merci de passer du temps sur mon problème.

    A ben oui bien sûr. J'y avais pas du tout pensé mais forcément maintenant que tu me le dis, ça parait évident. Je ne sais pas pourquoi, mais dans mon raisonnement je tenais pour principe que la sélection ne portait effectivement que sur les cellules non vides, donc jusqu'à la colonne AM dans mon cas.

    J'ai testé et ça venait bien de là.

    Je me sens un peu débile sur ce coup ...

    Merci beaucoup de ton aide , et désolé du dérangement.

  4. #4
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Re,
    Si ça peut te rassurer, si j'y ai pensé c'est que l'apprentissage se fait, entre autre, par l'expérience...j'ai moi même planté (un bon moment) sur un cas similaire

  5. #5
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Bon, j'ai crié victoire trop tôt.

    Il se trouve que la copie a marché une fois et pas plus ....
    J'efface bien le contenu de Feuil3 via
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    ThisWorkbook.Worksheets("feuil3").Select
    Selection.ClearContents
    avant de faire une nouvelle copie, mais ça me laisse le formatage des cellules.
    J'ai pensé que l'erreur de copie venait de ça, et avant de chercher comment enlever ce formatage, j'ai tenté de supprimer les lignes à la main puis de refaire une copie.

    Ca ne marche pas non plus puisque je me paye maintenant un echec de la methode Copy de la classe Range, toujours sur la même ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignVis.Copy Feuil3.Cells(10, 1)
    Je remets le code de la methode pour plus de lisibilité (t'auras pas à jouer avec ta molette pour remonter au début du thread )

    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
    'copie des données filtrées de la feuille 1 vers la feuille 3
    Private Sub copDonnees()
     
    Dim i As Long
    Dim DerniereLigne As Long
    Dim lignVis As Range
    DerniereLigne = Feuil1.Cells(65536, 1).End(xlUp).Row
     
    ThisWorkbook.Worksheets("feuil3").Select
    Selection.ClearContents
    Worksheets("BASE").Activate
     
        For i = lignDeb To DerniereLigne
     
            If Not Feuil1.Rows(i).Hidden Then
            'si la ligne n'est pas masquée
                If Not lignVis Is Nothing Then
                    Set lignVis = Application.Union(lignVis, Feuil1.Cells(i, 1).EntireRow)
                Else
                    Set lignVis = Feuil1.Cells(i, 1).EntireRow
                End If
            End If
        Next
     
    lignVis.Copy Feuil3.Cells(10, 1)
    'Worksheets("Feuil3").Activate
    End Sub

  6. #6
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Là comme ça je sèche, ça bloque sur quelle ligne, quel est le message d'erreur?
    Sinon si ça te dérange pas de joindre le fichier, je veux bien y jeter un oeil
    (réunion annulée, j'ai un peu de temps )

  7. #7
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Arf je suis désolé mais comme c'est pour un stage et que le fichier contient tout plein d'infos confidentielles pour l'entreprise qui m'accueille, je ne peux pas le donner...Je suis vraiment désolé, d'autant que ta proposition est fort aimable.

    Ca bloque sur l'instruction de copie vers la fin de la sub :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    lignVis.Copy Feuil3.Cells(10, 1)
    "Erreur d'exécution '1004' :
    La méthode Copy de la classe Range a échoué."

  8. #8
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Re,
    Il y a un stress, j'ai adapté un bout de code pour tester de mon côté et je n'ai pas d'erreur!
    Même sans 'vider' la feuille 3
    Voici le code que j'ai testé, je sais que d'habitude on évite les select mais peut-être que l'erreur vient de là.

    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
    Sub testUnion()
     
    Dim lignVis As Range
     
    Sheets("Sheet1").Select
    For i = 3 To 10
        If Not lignVis Is Nothing Then
           Set lignVis = Application.Union(lignVis, Range(Cells(i, 1), Cells(i, 3)))
        Else
           Set lignVis = Range(Cells(i, 1), Cells(i, 3))
        End If
    Next i
     
    lignVis.Copy Sheet3.Cells(10, 1)
     
    End Sub
    A+

  9. #9
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Bonjour.

    J'ai essayé avec les quelques modifs que tu proposes, mais rien n'y fait, ça ne fonctionne toujours pas.

    Edit : J'ai également essayé de copier une seule ligne à la fois, sans succès.
    Voici quand même 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
    Private Sub copDonnees()
     
    Dim i As Long
    Dim y As Long
    Dim DerniereLigne As Long, lignVis As Range
    DerniereLigne = Feuil1.Cells(65536, 1).End(xlUp).Row
     
    'ThisWorkbook.Worksheets("Feuil3").Select
    'Selection.ClearContents
    ThisWorkbook.Sheets("BASE").Select
    y = 10
        For i = lignDeb To DerniereLigne
     
            If Not Feuil1.Rows(i).Hidden Then
            'si la ligne n'est pas masquée
                    Set lignVis = Feuil1.Cells(i, 1).EntireRow
                    lignVis.Copy Destination:=ThisWorkbook.Worksheets(3).Range("A" & y)
                    y = y + 1
            End If
        Next
     
    End Sub

  10. #10
    Membre émérite Avatar de Fvandermeulen
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juillet 2007
    Messages
    1 869
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juillet 2007
    Messages : 1 869
    Points : 2 662
    Points
    2 662
    Par défaut
    Salut,
    Je viens de tester ton dernier code et je ne reproduis pas l'erreur que tu mentionne, chez moi tout va bien...Il faut peut-être chercher du côté des données.
    Est-ce que tes données sont des formules ou des valeurs ?
    Si il y a des formules, il faut peut-être vérifier qu'elles soient toujours valables après la copie (j'espère être clair)
    A+

  11. #11
    Inactif  
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    2 054
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 054
    Points : 2 416
    Points
    2 416
    Par défaut
    Bonjour,
    Mettre toute la procédure..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Private Sub copDonnees
    .....
    Dans Module1 sous..
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Public Sub copDonnees
    ......
    A+

  12. #12
    Futur Membre du Club
    Inscrit en
    Avril 2009
    Messages
    28
    Détails du profil
    Informations forums :
    Inscription : Avril 2009
    Messages : 28
    Points : 8
    Points
    8
    Par défaut
    Bien le bonjour à vous.

    J'avais essayé de mettre le code dans un module, mais ça n'avait rien donné de probant non plus.
    Pour ce qui est des formules, elles ne m'intéressaient pas et je cherchais juste à récupérer les données.
    D'ailleurs j'avais regardé, la seule et unique fois où la copie avait fonctionné, et je récupérais bien juste les valeurs.

    Du coup j'ai fait autrement : je récupère juste les données qui m'intéressent dans les lignes de Feuil1 affichées suite à l'application du filtre par l'utilisateur, puis je les copie dans des cellules de Feuil3 en les traitant auparavant dans mon code.

    Merci beaucoup de votre aide et de votre temps cependant.

    Bonne journée.

  13. #13
    Modérateur
    Avatar de AlainTech
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mai 2005
    Messages
    4 235
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mai 2005
    Messages : 4 235
    Points : 24 327
    Points
    24 327
    Par défaut
    Peut-on en déduire que ton problème est résolu?

Discussions similaires

  1. Réponses: 2
    Dernier message: 17/02/2014, 11h41
  2. [XL-2003] Copier automatiquement des valeurs vers une autre feuille
    Par Rabiry dans le forum Macros et VBA Excel
    Réponses: 18
    Dernier message: 24/01/2013, 08h31
  3. Réponses: 5
    Dernier message: 20/12/2012, 11h22
  4. [PHPExcel] Récupération des valeurs via liaison vers une autre feuille
    Par thbmath dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 05/12/2012, 21h41
  5. [XL-2007] Macro: comment importer des valeurs de fichiers Excel vers un autre fichier Excel?
    Par jerdel dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 06/03/2012, 16h23

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