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 :

Problème de collage par transpose


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
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 103
    Par défaut Problème de collage par transpose
    Bonjour à tous,

    Je souhaite récupérer d'un fichier A des lignes qui sont à B46:AJN46 / B59:AJN59 / B72:AJN72 / B85:AJN85 / B97:AJN97. Vous avez remarqué que ces lignes se répètent par pas de 13.

    Ensuite les coller par tranposage sur un fichier B aux colonnes : E10:E958 puis F10:F958 etc... (le pas ici est de 1).

    Voici une partie du 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
    For I = 1 To 5
     
                m = 46 + 13 * (I - 1)
     
                'Sélectionne la plage
                Range("B" + CStr(m) + ":" + "AJN" + CStr(m)).Copy
     
                'Copie-colle la sélection sur un autre fichier
                ' Selection.Copy
     
                'Sélection de la plage réception
                Workbooks("Reception.xlsx").Activate
                Sheets("Test").Select
     
                'Conversion de la colonne
                ColR = Chr(I + 68)
     
                'Sélection de la colonne récepteur
                Range(ColR + "10:" + ColR + "958").Select
     
                'Colle par transpose
                Selection.PasteSpecial Paste:=xlPasteAll, Transpose:=True
                Application.CutCopyMode = False
     
                'Convertir les points en virgule
                Set plage = Range(ColR + "10:" + ColR + "958")
                For Each c In plage
                    c.Value = Replace(c.Value, ".", ",")
                Next c
     
            Next
    Le problème est que ça m'affiche :

    Erreur d'exécution '1004' :
    Cette sélection n'est pas valide.
    Raisons possibles :
    .Les zones de copie et de collage ne peuvent se superposer que si elles sont de dimension et de forme identiques.
    .Si vous utilisez la commande Créer à partir de la sélection, la ligne ou la colonne contenant les noms proposés n'est pas incluse dans les (...)
    La dernière phrase s'arrête là à cause du format réduit du message d'erreur.

    Avez vous des idées du bug ?

    Merci d'avance.

  2. #2
    Membre émérite
    Homme Profil pro
    Responsable des études(en disponibilité)
    Inscrit en
    Juin 2007
    Messages
    367
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable des études(en disponibilité)
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 367
    Par défaut
    Bonjour.

    Il faut peut être resélectionner ton classeur d'origine à chaque next ??????

    vu le message je pense que à la deuxième copie

    tu colle de la feuille test vers la feuille test du classeur reception

  3. #3
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Il y a un problème d'algorithme dans ton code : tu ne donnes pas les parents (classeur et onglet) des cellules à copier ce qui fait que VBA utilise ceux par défaut. Or, plus loin dans la boucle, tu actives le classeur de destination (ce qui en fait le classeur par défaut) dans jamais revenir au classeur source.
    Donc, au second tour, la copie se fait sur les cellules du classeur destination.

    En plus, ton premier Copy ne sélectionne pas les cellules (il ne fait que les... copier, placer leur contenu dans le presse-papier) donc le second Copy appliqué à Selection a peu de chance de s'appliquer à ce que tu souhaites et en plus il écrase le premier.

    Il y a aussi quelques autres broutilles dans la suite.

    En fait, tu compliques trop ton code.
    En voici une version simplifiée.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Dim WSSource As Worksheet, WSDest As Worksheet
    Dim I As Long
     
    Set WSSource = ActiveSheet
    Set WSDest = Workbooks("Reception.xlsx").Sheets("Test")
     
    For I = 1 To 5
        WSSource.Range("B" & (33 + 13 * I) & ":AJN" & (33 + 13 * I)).Copy
        WSDest.Cells(10, 4 + I).PasteSpecial Paste:=xlPasteAll, Transpose:=True
    Next I
     
    Columns("E").Resize(, I - 1).Replace(".", ",")

  4. #4
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 103
    Par défaut
    Bonjour à tout le monde,

    Effectivement c'est un problème de parent etc...

    Depuis j'ai reformulé (et minimiser les Select en passant) et tout marche !!!

    A présent j'ai un truc surement benêt pour vous : quand je fais tourner le macro à partir du fichier Excel (par un bouton) qui le supporte, les opérations me paraissent plus longues.

    Si je fais tourner le macro à partir du codeur VBA et que le fichier Excel qui le supporte est réduit (non visible), les opérations sont plus rapides... Pourquoi cela ?

    Merci d'avance !

  5. #5
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par ThonySp Voir le message
    Si je fais tourner le macro à partir du codeur VBA et que le fichier Excel qui le supporte est réduit (non visible), les opérations sont plus rapides... Pourquoi cela ?
    Parce que la réactialisation de l'affichage pompe une grosse partie du temps de traitement.

  6. #6
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Juin 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juin 2010
    Messages : 103
    Par défaut
    J'ai vu cela en parcourant les FAQ

    Mais ça me fait gagner presque deux secondes (sans rafraichissement : 19'50 et avec rafraichissement : 17'80).

    J'ai aussi mis :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    'Réduit la fenêtre Excel
    Application.WindowState = xlMinimized
    'Arrêt rafraichissement écran
    Application.ScreenUpdating = False
     
    ... mon codage ...
     
    'Retour rafraichissement écran
    Application.ScreenUpdating = True
    'Remet la fenêtre Excel
    Application.WindowState = xlMaximized
    Des idées pour mieux accélérer ? Sinon je vais devoir créer une copie Matlab qui est nettement plus rapide ...

Discussions similaires

  1. Problème de communication par sockets
    Par Linio dans le forum Entrée/Sortie
    Réponses: 33
    Dernier message: 06/05/2006, 18h50
  2. Réponses: 1
    Dernier message: 27/10/2005, 11h14
  3. Problème ouverture fichier par double clic...
    Par sankookai dans le forum MFC
    Réponses: 4
    Dernier message: 11/05/2005, 09h13
  4. [CR8.5] Problème de division par zéro sur formule
    Par franck.cvitrans dans le forum Formules
    Réponses: 3
    Dernier message: 10/06/2004, 13h41
  5. Probléme d'insertion par défault
    Par xavier62 dans le forum SQL
    Réponses: 7
    Dernier message: 28/11/2003, 13h03

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