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 de plages de données de Feuilles selectionnées à partir d'une ListBOx d'un classeur vers un autre


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau membre du Club
    Homme Profil pro
    physico-chimiste
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : physico-chimiste

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Points : 37
    Points
    37
    Par défaut Copie de plages de données de Feuilles selectionnées à partir d'une ListBOx d'un classeur vers un autre
    Bonjour à tous,

    le titre de ce sujet résume ce que je veux faire mais pas les problèmes rencontrés que je vais énumérer.
    Tout d'abord voici mon 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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    Dim NouvelleFeuille As Worksheet
    Dim Onglet As Variant 'une variable for each poru les tableaux doit être de type variant
     
    Dim nbIsoSel As Integer
    Dim TabOnglets() As Variant
     
     
    nbIsoSel = 0
     
     
       For i = 0 To UserForm1.ListBox1.ListCount - 1 
       If UserForm1.ListBox1.Selected(i) = True Then
       nbIsoSel = nbIsoSel + 1
       ReDim Preserve TabOnglets(0 To nbIsoSel)
       TabOnglets(nbIsoSel - 1) = UserForm1.ListBox1.List(i) 'i=50 en fin de boucle alors qu'on lui demande de ne pas dépassé 50- 1 soit 49 dans le cas testé
     
     
     
       End If
     Next i
     
     
     Dim a As Integer
     
      For a = 0 To nbIsoSel - 1
      MsgBox TabOnglets(a)
      Next a
     
      MsgBox UBound(TabOnglets)
     
     
     Set FeuilleMoy = ClasseurMacro.Worksheets.Add
     FeuilleMoy.Name = "Feuille Moyenne"
     
    Dim j As Integer
    Dim dl As Integer
    Dim TabTrans() As Variant
     
     
    j = 1
     
     
     
    For Each Onglet In TabOnglets()
    If Onglet <> "" Then
    Set FeuilleOng = ClasseurKSV.Worksheets(Onglet)
     
     
    MsgBox Onglet
     
    dl = FeuilleOng.Range("G" & Rows.Count).End(xlUp).Row 'dernière ligne de la colonne Aire
     
    'FeuilleOng.Range("G2:H" & dl).Copy Destination:=FeuilleMoy.Range(Cells(2, j), Cells(dl, j + 1)) ' a vérifier
     
    TabTrans = Range(Cells(1, 7), Cells(dl, 8))
    FeuilleMoy.Activate
    Range(Cells(1, j), Cells(dl, j + 1)) = TabTrans
     
     
    j = j + 2
     
    End If
    Next Onglet
    A l'ouverture du classeur nommé ici ClasseurMacro, un userform apparait dans lequel une listbox me permet de sélectionner des feuilles automatiquement récupérées sur un autre classeur (nommé ClasseurKSV). Le nom de ces feuilles est ensuite stocké dans un tableau que je parcours après avec la boucle For each afin de copier une plage présente sur les feuilles selectionnées (dans le classeur KSV) sur une unique feuille (nommée Nouvelle Feuille) présente dans le classeurMacro (au fur et à mesure je décale la plage de données recevant les données pour pouvoir les copier sur la même feuille).
    Je vérifie avec des MsgBox que mes feuilles sont bien sélectionnées et stockés dans le tableau (TabOnglets) . De même que je vérifie que la boucle Eachfor parcours bien les différents Onglets.
    Toutefois la copie des données ne se fait pas comme je le souhaite.
    En effet indépendamment des Feuilles sélectionnées dans la list box seul la première feuille est copiée (même si elle n'est pas sélectionnée).

    Je ne suis pas sûr aussi d'utiliser correctement le TabTrans qui est mon tableau de transfert pour les données (le copier-coller conventionnel ne semble pas fonctionner d'un classeur à un autre avec Range(Cells()).

    D'autre part j'ai remarqué que, pour le cas testé, dans la boucle For i = 0 To UserForm1.ListBox1.ListCount - 1 l'incide de UserForm1.ListBox1.List(i) était porté à 50 en fin de boucle (alors qu'on demande bien à ce que la boucle s'arrête à 49 qui est le numéro du dernier index le premier étant 0). Ça n'a visiblement pas d'influence sur la suite, mais ça me pertube.

    Merci d'avance pour vos suggestions, idées, critiques,...

    David

  2. #2
    Nouveau membre du Club
    Homme Profil pro
    physico-chimiste
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : physico-chimiste

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Points : 37
    Points
    37
    Par défaut
    Je viens de comprendre la raison de la copie de la première feuille alors qu'elle n'était pas sélectionnée dans la Listbox. En fait c'est la feuille activée par défaut à l'ouverture du classeur or comme j'ai écrit

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    TabTrans = Range(Cells(1, 7), Cells(dl, 8))
    FeuilleMoy.Activate
    Range(Cells(1, j), Cells(dl, j + 1)) = TabTrans
    Sans préciser de quel Range de quelle Feuille de quel Classeur il s'agissait pour TabTrans = Range(Cells(1, 7), Cells(dl, 8)) la zone copiée était celle de la feuille sélectionnée par défaut qui correspondant à la première.
    Maintenant il faut que je comprenne comment copier les cellules des feuilles que j'ai sélectionnées dans la Listbox...

  3. #3
    Nouveau membre du Club
    Homme Profil pro
    physico-chimiste
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : physico-chimiste

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Points : 37
    Points
    37
    Par défaut
    C'est tout con (et apparemment le fait d'exposer ses bêtises aide à les voir et comprendre):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    FeuilleOng.Activate ' à rajouter
    TabTrans = Range(Cells(1, 7), Cells(dl, 8))
    FeuilleMoy.Activate
    Range(Cells(1, j), Cells(dl, j + 1)) = TabTrans
    Par contre je ne comprends toujours pas pourquoi dans

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    For i = 0 To UserForm1.ListBox1.ListCount - 1
       If UserForm1.ListBox1.Selected(i) = True Then
       nbIsoSel = nbIsoSel + 1
       ReDim Preserve TabOnglets(0 To nbIsoSel)
       TabOnglets(nbIsoSel - 1) = UserForm1.ListBox1.List(i)
    i = 50 en fin de boucles alors que UserForm1.ListBox1.ListCount = 50 donc -1 ça devrait faire 49. Ça ne semble pas avoir d'incidence pour la suite, mais c'est curieux.

  4. #4
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Points : 185
    Points
    185
    Par défaut
    Sans lire le code

    1 à 49 = 49 fois
    0 à 49 = 50 fois

  5. #5
    Nouveau membre du Club
    Homme Profil pro
    physico-chimiste
    Inscrit en
    Avril 2016
    Messages
    49
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : physico-chimiste

    Informations forums :
    Inscription : Avril 2016
    Messages : 49
    Points : 37
    Points
    37
    Par défaut
    Citation Envoyé par TonyNiort79
    1 à 49 = 49 fois
    0 à 49 = 50 fois
    Certes je suis d'accord que la boucle tourne 50 fois, mais l'indice "i" de "List(i)" n'indique pas le nombre de tour mais l'index (si je ne me trompe pas, mais c'est peut-être là que je me trompe) or l'index commençant à 0 (For i = 0) devrait finir à 49 dans mon cas (car ListCount = 50 auquel on retranche 1).
    Et ce n'est pas le chiffre que le débogueur fait apparaitre quand on passe la souris au dessus de i en fin de programme : il indique 50. Comme si la boucle avait tourné 51 fois.
    Bref comme si par défaut VBA faisait tourner la boucle une fois de plus à vide que le nombre indiqué.

    La preuve en image :

    Nom : List(i).png
Affichages : 199
Taille : 15,0 Ko

    Mais comme je le dis ce n'est pas un souci en soi puisque en apparence le programme fait ce que je lui demande, c'est juste que le débogueur m'indique un numéro d'index supérieur à ceux que je lui demande de lire. Et ça m'intéresserait d'en connaitre l'explication, mais ce n'est pas indispensable.

  6. #6
    Membre habitué
    Homme Profil pro
    Chargé d'affaire
    Inscrit en
    Septembre 2019
    Messages
    151
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : Chargé d'affaire

    Informations forums :
    Inscription : Septembre 2019
    Messages : 151
    Points : 185
    Points
    185
    Par défaut
    Bonjour,

    c'était juste une information,
    mais je ne peux répondre à la question,

Discussions similaires

  1. copie d'une plage de donnée d'un classeur vers un autre
    Par bitissa1991 dans le forum Macros et VBA Excel
    Réponses: 0
    Dernier message: 03/08/2016, 17h00
  2. [XL-2007] SUB pour selectionner à partir d'une ListBox
    Par 'OTM' dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 11/12/2014, 10h50
  3. [XL-2007] Copie données d'un classeur vers un autre classeur
    Par carlux3 dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 23/12/2010, 15h14
  4. Réponses: 2
    Dernier message: 12/01/2009, 10h39
  5. Réponses: 2
    Dernier message: 06/02/2007, 16h05

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