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 :

Sélection et copie


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut Sélection et copie
    Bonjour,

    J'ai un fichier Excel avec 2 feuilles. Je souhaite au clic sur un bouton dans la 2nd feuilles pouvoir sélectionner des lignes de la 1er feuille puis de les ajouter dans ma 2nd feuille (copier/coller).

    De toutes mes recherches j'ai seulement trouver comment demander à l'utilisateur de sélectionner les lignes qu'il souhaite importer dans la feuille :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    Sub copy()
      Dim r As Range
      Set r = Application.InputBox("Sélectionnez les lignes à importer :", Type:=8)
      MsgBox r.Address 'Affiche la sélection
     
      Dim c As Range '
      For Each c In r 'Parcours les cellules de la plage
     
          ?? 
     
      Next
    End Sub

    A savoir que dans ma 2nd feuille les colonnes ne sont pas identiques à la première et il faudrait donc que je puisse traiter colonne par colonne pour dire où les données doivent aller dans la feuille de destination.
    Est-ce que vous auriez quelques exemples / pistes pour moi ?

    Merci

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Salut.

    Tu ne dis rien de la conception de ton classeur, notamment des plages source et cible. S'agit-il de tableaux structurés? d'une plage "formulaire" à transférer dans un tableau structuré?

    Je suis parti de l'idée que l'on travaille avec des tableaux structurés.

    Pour ajouter des données d'un tableau structuré à un autre en en saisissant les valeurs manuellement, on pourrait s'inspirer de ceci, qui ne transférera que les valeurs des colonnes qui existent dans le tableau cible.

    Au départ, deux tableaux (la cible à gauche et la cible à droite). On remarque que les colonnes ne sont pas ordonnées de la même façon et que la colonne Service de la source n'existe pas dans la cible. Voici un code qui utilise les ListObject (les tableaux structurés en VBA) pour organiser le transfert.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    Sub TransferRows(Source As Range, Target As Range)
      Dim i As Long
     
      Set Target = Target.ListObject.ListRows.Add().Range(1)
      For i = 1 To Source.Columns.Count
        If ColumnExists(Target.ListObject, Source.ListObject.ListColumns(i).Name) Then _
          Target(1, Target.ListObject.ListColumns(Source.ListObject.ListColumns(i).Name).Index).Resize(Source.Rows.Count).Value = Source.Columns(i).Value
      Next i
    End Sub
    Cette procédure utilise une fonction (à garder au chaud ) qui détermine si une colonne existe dans un tableau structuré.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Function ColumnExists(Table As ListObject, Name As String) As Boolean
      Dim i As Long: i = 1
     
      Do While i <= Table.ListColumns.Count And ColumnExists = 0
        If StrComp(Table.ListColumns(i).Name, Name, vbTextCompare) = 0 Then ColumnExists = True
        i = i + 1
      Loop
    End Function
    On utilise TransferRows en lui passant des plages (de tableaux structurés)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Test()
      Dim Source As Range
      Dim Target As Range
     
      Set Source = Application.InputBox("Choisissez les lignes du tableau source", Type:=8)
      Set Target = Range("t_Cible")
      TransferRows Source, Target
    End Sub

    Une façon de faire qui évite la fonction de vérification de l'existence de la colonne est de passer par un bloc On Error. Perso, je ne suis pas chaud sauf si le projet VBA est verrouillé à l'affichage. Sans cela, on risque de s'arrêter en débogage sur l'erreur levée lorsque la colonne n'existe pas.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub TransferRows(Source As Range, Target As Range)
      Dim i As Long
     
      Set Target = Target.ListObject.ListRows.Add().Range(1)
      For i = 1 To Source.Columns.Count
        On Error Resume Next
        Target(1, Target.ListObject.ListColumns(Source.ListObject.ListColumns(i).Name).Index).Resize(Source.Rows.Count).Value = Source.Columns(i).Value
        On Error GoTo 0
      Next i
    End Sub
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  3. #3
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut
    Bonjour,

    Merci pour votre réponse très détaillée. Il s'agit en effet d'un tableau structuré.

    Concernant le fonction Test j'ai une petite question sur la ligne : Set Target = Range("data"). Je dois mettre le noms de ma feuille de destination ? Car j'ai une erreur lors de l'exécution, ma feuille s'appelle data.

  4. #4
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    13 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur, développeur et consultant Excel, Access, Word et VBA

    Informations forums :
    Inscription : Janvier 2010
    Messages : 13 176
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Dans l'instruction Set Target = Range("data") "data" doit être le nom du tableau structuré et pas de la feuille (avec cette instruction, Excel sait dans quelle feuille se trouve le tableau)
    Philippe Tulliez
    Ce que l'on conçoit bien s'énonce clairement, et les mots pour le dire arrivent aisément. (Nicolas Boileau)
    Lorsque vous avez la réponse à votre question, n'oubliez pas de cliquer sur et si celle-ci est pertinente pensez à voter
    Mes tutoriels : Utilisation de l'assistant « Insertion de fonction », Les filtres avancés ou élaborés dans Excel
    Mon dernier billet : Utilisation de la fonction Dir en VBA pour vérifier l'existence d'un fichier

  5. #5
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut
    D'accord merci. Mes tableaux n'étaient pas correctement créés.

    Par contre j'ai une erreur 1004. Je trouve que les erreurs sont très peu détaillé. Est-ce qu'il y a un moyen d'avoir plus d'information ? Car même le pas à pas me retourne uniquement ce message :

    Nom : Capture d’écran 2020-11-18 à 13.43.51.png
Affichages : 236
Taille : 247,2 Ko

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Tu as probablement un format, une mise en forme conditionnelle ou une validation qui va jusqu'à ta dernière ligne de la feuille. Excel ne peut donc "éjecter" cette ligne lorsqu'il essaie d'ajouter une ligne à ton tableau.

    Tu devrais nettoyer ta feuille en sélectionnant toutes les lignes après la dernière du tableau puis les supprimer.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  7. #7
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut
    On ne peux pas avoir des validations de données sur notre tableau avec cette méthode ?

    D'ailleurs une question que je me pose dans le même thème : comment pouvons-nous mettre en place un système de contrôle de saisie sans que ce contrôle saute lors d'un copier/coller ? Car là ça semble bloquer MAIS dans le cas d'un CTRL+C / V on efface les validations de données.

  8. #8
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Je te conseille la lecture de mon tuto sur les tableaux structurés. Tu y liras que si tu places une validation sur une colonne de données entière du tableau, la validation est reportée sur les nouvelles lignes lors de l'ajout, comme pour une mise en forme conditionnelle.


    Par contre, la validation fait partie des propriétés de la cellule. Si tu copies une cellule source sur une cellule cible, la cellule cible reçoit toutes les propriétés de la cellule source. Dès lors, tu ne dois pas réaliser un copier-coller de tes données dans le tableau, mais uniquement un copier-collage spécial valeurs. C'est du reste ce que je fais lorsque je code Cible.Value = Source.Value.
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  9. #9
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut
    D'accord, merci pour cette réponse. Je vais étudier votre lien !

    De ce que je comprends, lorsque qu'on partage un fichier Excel et qu'on veut vérifier les données saisie sans empêcher de faire du copier/coller (à partir d'une valeur google par exemple) la validation de données sur une colonne ne fonctionne pas. Est-ce qu'il y a une méthode pour le faire en VBA ?
    Ceci en dehors du fait de la sélection et copie automatique qu'on mentionnait tout à l'heure. Je parle ici plutôt d'une saisie manuelle cellule par cellule.

  10. #10
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    La meilleure méthode, hors usine à gaz, est de former ses utilisateurs Excel.

    Cela dit, lorsque l'on copie-colle un lien Google, on ne copie pas une cellule donc on n'écrase pas la validation de ladite cellule. C'est uniquement lors d'un copier-coller de cellule que l'on remplace la validation.

    Je comprends de moins en moins ton problème. On ne peut greffer du VBA sur de l'Excel que si l'on maîtrise au moins les bases du logiciel... ^^
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

  11. #11
    Membre averti
    Femme Profil pro
    Étudiant
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 30
    Localisation : France, Calvados (Basse Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Par défaut
    Je voudrais "sécuriser" la saisie dans un fichier Excel pour des personnes ne sachant pas utiliser le logiciel justement. Pour éviter d'avoir un fichier qui n'a plus aucune cohérence.

    L'idée initiale est :
    - une table de saisie et une table d'archive
    - la table d'archive bloquée par un mdp
    - copier/coller les lignes "vérifiées" de la table de saisie dans la table archive
    - ajouter des validations de données sur la table saisie pour réduire le temps de "vérification"

    Et j'en suis arrivée à chercher des cas improbables pour des utilisateurs novices. Bref...

    Merci pour votre aide en tout cas, avec toutes ces informations je vais pouvoir avancer

  12. #12
    Rédacteur/Modérateur


    Homme Profil pro
    Formateur et développeur chez EXCELLEZ.net
    Inscrit en
    Novembre 2003
    Messages
    19 125
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : Belgique

    Informations professionnelles :
    Activité : Formateur et développeur chez EXCELLEZ.net
    Secteur : Enseignement

    Informations forums :
    Inscription : Novembre 2003
    Messages : 19 125
    Billets dans le blog
    131
    Par défaut
    Si les utilisateurs saisissent les données "ligne par ligne", c'est-à-dire en saisissant une ligne pour la transférer dans la table avant d'en saisir une nouvelle, tu pourrais te diriger vers une feuille "formulaire" dans laquelle tu agencerais tes cellules pour une saisie ergonomique, en verrouillant les cellules qui doivent l'être (Validation, ...) et placer un bouton pour activer le transfert vers ta feuille de données (qui serait par exemple en VeryHidden côté VBA ou avec une protection au niveau de la structure du classeur).
    "Plus les hommes seront éclairés, plus ils seront libres" (Voltaire)
    ---------------
    Mes billets de blog sur DVP
    Mes remarques et critiques sont purement techniques. Ne les prenez jamais pour des attaques personnelles...
    Pensez à utiliser les tableaux structurés. Ils vous simplifieront la vie, tant en Excel qu'en VBA ==> mon tuto
    Le VBA ne palliera jamais une mauvaise conception de classeur ou un manque de connaissances des outils natifs d'Excel...
    Ce ne sont pas des bonnes pratiques parce que ce sont les miennes, ce sont les miennes parce que ce sont des bonnes pratiques
    VBA pour Excel? Pensez D'ABORD en EXCEL avant de penser en VBA...
    ---------------

Discussions similaires

  1. Réponses: 17
    Dernier message: 10/09/2020, 14h35
  2. [XL-2016] Sélection et copie
    Par Aakash Qureshi dans le forum Macros et VBA Excel
    Réponses: 15
    Dernier message: 31/12/2018, 13h05
  3. Sélection case + copie
    Par aminebelhaj007 dans le forum Excel
    Réponses: 3
    Dernier message: 24/04/2016, 01h11
  4. Sélection et copie d'une plage variable
    Par Rémy A. dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 18/07/2013, 18h44
  5. [WD14] Interrupteur sélection et copie vers fenêtre
    Par Truster dans le forum WinDev
    Réponses: 1
    Dernier message: 04/09/2009, 13h13

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