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 :

Copier une plage variable de cellules dans une nouvelle feuille


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 2
    Par défaut Copier une plage variable de cellules dans une nouvelle feuille
    Bonjour,

    Je découvre tout juste le merveilleux monde d'excel, de ses macros et du VBA.
    Alors voilà, j'ai un travail à effectuer sur lequel je bloque :
    Je dispose d'un énorme tableau dans une première feuille de calcul appelée "Tableau de Suivi", dont la première colonne correspond à un numéro de station.
    Je souhaiterais pouvoir copier, dans une nouvelle feuille appelée "0 - Remarques Générales", toutes les lignes de ce tableau qui ont le numéro 0 (sachant qu'elles sont triées par numéro de station justement).

    Pour ce faire, j'ai cherché un peu comment utiliser une fonction de recherche, afin de trouver la première ligne dont la première colonne contient "0".

    Par la suite, je souhaiterais copier la première cellule de cette ligne, puis la seconde, puis la troisième etc.. jusqu'à la dernière colonne du tableau (soit ici la 11ème).

    Après ça, je souhaite vérifier si la ligne d'en dessous contient aussi "0" en première colonne, ou si on est passé à la station 1. Si on contient toujours 0, on recommence et ainsi de suite.

    Voilà le code que j'ai pour l'instant :

    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
    Private Sub MiseAJour_0_Click()
    Dim L As Integer
    Dim C As Integer
    Dim sel As range
     
    Set sel = Worksheets("Tableau de Suivi").Columns(1).Find(What:="0", Lookat:=xlWhole, SearchDirection:=xlNext)
    If sel Is Nothing Then MsgBox "Hoho.. Impossible de copier (plage non trouvée)" Else: MsgBox "OK !"
     
    L = sel.Row
    C = 1
     
     
    While Worksheets("Tableau de Suivi").Cells(L, C) = "0"
        While C <= "11"
            Worksheets("0 - Remarques Générales").Cells(L, C).Copy Worksheets("Tableau de Suivi").Cells(L, C)
            C = C + 1
            Wend
        L = L + 1
        Wend
     
    End Sub
    Malheureusement, il ne fonctionne pas, et voici le message d'erreur qu'Excel m'affiche :
    "Erreur d'execution '91' : Variable objet ou variable de bloc With non définie" et le débogage me surligne la ligne "L = sel.Row"

    A partir de là, je ne comprends pas d'où vient le problème, alors si une âme charitable pouvait me donner un petit coup de pouce, il aurait ma reconnaissance éternelle ^^

    Nom : tabl.png
Affichages : 435
Taille : 148,4 Ko

    Sur la photo vous pouvez voir une partie du tableau que j'aimerais copier (on ne voit pas les 0 dans la première colonne mais ils y sont bien ^^)


    Merci d'avance !


    EDIT : J'ai remarqué que j'avais inversé la plage de cellules que je souhaite copier et la destination. Ceci corrigé, j'arrive à copier la première ligne mais pas la suivante, et lorsque j'utilise le débogage pas à pas, il fait bien 11 fois la première boucle while (celle imbriquée), mais il ne fait qu'une fois la seconde (celle avec l'incrémentation de L)

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    If sel Is Nothing : il faut abandonner et sortir du Sub puisque non trouvé. Tu ne peux pas y faire sel.Row, erreur
    Tu cherches "0" (string) et non 0 (nombre).

    Une autre façon. J'ai décomposé pour la compréhension :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
        Dim station As Long, pl As Range, lig1 As Long, nblig As Long
        station = 0
        lig1 = WorksheetFunction.Match(station, Columns(1), 0)
        nblig = WorksheetFunction.CountIf(Columns(1), station)
        Set pl = [A1].Offset(lig1 - 1).Resize(nblig, 11)
        If pl Is Nothing Then MsgBox "aie !": Exit Sub
        MsgBox pl.Address
        ' copier-coller toutes les lignes d'un coup
    Tu peux aussi filtrer sur A et copier-coller les cellules visibles avec .SpecialCells
    eric

  3. #3
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2019
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2019
    Messages : 2
    Par défaut
    Bonjour,

    Tout d'abord, merci pour ta réponse !

    En fait ce matin avant d'ouvrir le forum j'ai continué à chercher un peu, et j'ai trouvé ce qui n'allait pas : j'oubliais de remettre C à 1 après son passage dans la 2ème boucle ^^'

    En revanche, sel.row fonctionne bien, puisque sel me renvoie l'adresse de la cellule trouvée (dont je souhaite extraire le numéro de ligne).

    En revanche j'ai désormais un autre problème, sur une insertion de lien hypertexte (je ne sais pas si je dois ouvrir rune nouvelle discussion ou si je peux poser ma question ici, dans le doute je post, qu'on me prévienne si je fais fausse route ^^)

    Mon objectif a été légèrement modifié (je n'utilise même plus la recherche) puisque désormais j'ai un lien hypertexte pour chaque station, qui me renvoie sur la feuille correspondante (j'ai donc environ 48 feuilles prêtes à accueillir les données correspondantes à la station en question).
    J'ai donc modifié mon programme pour que la copie des données se fasse lorsque je clique sur ce lien hypertexte (et ça marche très bien). Cependant, lorsque je suis sur la 48ème feuille, pour revenir au Tableau de Suivi, je souhaiterais pouvoir simplement cliquer sur un lien hypertexte.

    Et là je bloque, puisque mon adresse de destination est apparemment mauvaise..
    J'ai épluché la doc Excel et divers forum mais je n'ai pas trouvé de réponse à ma question :/

    Voilà ce que j'ai pour le moment :

    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
    Public Sub Worksheet_FollowHyperlink(ByVal Target As Hyperlink)
        
        Dim K As Integer
        K = Target.Parent.Value
      
      
        Dim L As Integer
        Dim C As Integer
        Dim sel As range
        
        MsgBox "Waiting for updating"
    
        L = Target.Parent.Row
        M = 1
        C = 1
        While Worksheets("Tableau de Suivi").Cells(L, 1) = K
            C = 1
            While C <= 11
                Worksheets(K + 4).Cells(M, C).Clear
                Worksheets("Tableau de Suivi").Cells(L, C).Copy Worksheets(K + 4).Cells(M, C)
                Worksheets(K + 4).Columns(C).ColumnWidth = Worksheets("Tableau de Suivi").Columns(C).ColumnWidth
                C = C + 1
            Wend
            L = L + 1
            M = M + 1
        Wend
        
        With Worksheets(K + 4)
            .Hyperlinks.Add Anchor:=.Cells(M + 1, 1), Address:="", SubAddress:=Worksheets(3).Name & "!A1", TextToDisplay:="Retour au Tableau"
        End With
        
         
        ActiveWorkbook.Worksheets(K + 4).Activate
        ActiveWindow.Zoom = 60
      
     
    End Sub

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Février 2007
    Messages
    2 266
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2007
    Messages : 2 266
    Par défaut
    Bonjour,

    nouvelle question, nouveau topic.

    En revanche, sel.row fonctionne bien
    Tant que tu ne lui demandes pas une valeur qu'il ne trouve pas...

    Libre à toi de ne pas tenir compte des conseils, mais ta version de lire-écrire les cellules une par une est au moins 100 fois plus lente que de le faire en une seule fois d'un bloc.
    eric

Discussions similaires

  1. [XL-2013] Créer une formule avec des plages variables de cellules
    Par Théo78 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 03/01/2019, 16h13
  2. [XL-2007] Copier le contenu de plusieurs cellules dans une seule
    Par Iddbro dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 16/03/2018, 10h17
  3. [XL-2007] Sélectionner une plage variable de cellules
    Par Nonno 94 dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 01/07/2014, 19h07
  4. Copier une nouvelle feuille avant (before) "Variable"
    Par SUKINET dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 28/09/2009, 17h05
  5. copier des plages variables de plusieurs feuilles vers une seule
    Par irene15 dans le forum Macros et VBA Excel
    Réponses: 19
    Dernier message: 22/06/2007, 13h44

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