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 :

Ne pas prendre toute la feuille, juste les lignes sélectionnées


Sujet :

Macros et VBA Excel

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2024
    Messages : 2
    Points : 1
    Points
    1
    Par défaut Ne pas prendre toute la feuille, juste les lignes sélectionnées
    Bonjour,

    J'ai un soucis, j'essaye d'importer certaines information d'un tableur externe sur mon tableur excel, le code ci dessous fonctionne, cependant il modifie toute la feuille et j'aimerais que les changement ne s'effectue que sur les lignes que j'ai selectione.
    J'ai fais le deuxieme code que vous trouverez encore en dessous mais ce dernier ne fonctionne pas, il m'ouvre le dossier source mais ne me copie pas mes infos, est-ce que quelqu'un saurait me dire ce qui coince et est different entre les deux code svp ?
    Merci d'avance
    ----------------------------------------------------------------------------------
    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
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    Sub CopierDonneesSiCorrespondance()
        Dim wsSource As Worksheet, wsDest As Worksheet
        Dim wbExt As Workbook
        Dim derniereLigneSource As Long, derniereLigneDest As Long, i As Long, j As Long
        Dim cheminFichier As String
        Dim valeurRecherche As Variant
        Dim trouve As Range
     
        ' Chemin du classeur externe
        cheminFichier = "Chemin/Fichier/TQT"
     
        ' Définition du classeur et de la feuille de destination
        Set wsDest = ThisWorkbook.ActiveSheet  ' ou spécifiez la feuille explicitement
        derniereLigneDest = wsDest.Cells(wsDest.Rows.Count, "B").End(xlUp).Row
     
        ' Ouvrir le classeur externe
        Set wbExt = Workbooks.Open(cheminFichier)
        Set wsSource = wbExt.Sheets(1)  ' Remplacez par le nom ou l'indice correct de la feuille
        derniereLigneSource = wsSource.Cells(wsSource.Rows.Count, "A").End(xlUp).Row
     
        ' Parcourir chaque ligne de la feuille de destination
        For i = 1 To derniereLigneDest
            valeurRecherche = wsDest.Cells(i, "B").Value ' Valeur de la colonne B
     
            ' Rechercher cette valeur dans la colonne A de la feuille source
            Set trouve = wsSource.Columns("A:A").Find(What:=valeurRecherche, LookIn:=xlValues, LookAt:=xlWhole)
     
            ' Si trouvé, copier les valeurs des colonnes C et D dans les colonnes J de la feuille de destination
            If Not trouve Is Nothing Then
                wsDest.Cells(i, "J").Value = wsSource.Cells(trouve.Row, "C").Value
                wsDest.Cells(i, "K").Value = wsSource.Cells(trouve.Row, "D").Value
            End If
        Next i
     
        ' Fermer le classeur externe sans sauvegarder les modifications
        wbExt.Close SaveChanges:=False
    End Sub
     
    --------------------------------------------------------------------------------
     
    Sub CopierDonneesSiCorrespondanceSelection()
        Dim wsSource As Worksheet
        Dim wbExt As Workbook
        Dim cell As Range
        Dim cheminFichier As String
        Dim valeurRecherche As Variant
        Dim trouve As Range
     
        ' Chemin du classeur externe
        cheminFichier = "Chemin/Fichier/TQT"
     
        ' Ouvrir le classeur externe
        Set wbExt = Workbooks.Open(cheminFichier)
        Set wsSource = wbExt.Sheets(1)  ' Remplacez par le nom ou l'indice correct de la feuille
     
        ' Parcourir chaque cellule dans la colonne B de la sélection
        For Each cell In Selection
            ' Vérifier si la cellule est dans la colonne B
            If cell.Column = 2 Then
                valeurRecherche = cell.Value ' Valeur de la cellule actuelle dans la colonne B
     
                ' Rechercher cette valeur dans la colonne A de la feuille source
                Set trouve = wsSource.Columns("A:A").Find(What:=valeurRecherche, LookIn:=xlValues, LookAt:=xlWhole)
     
                ' Si trouvé, copier les valeurs des colonnes C et D dans les colonnes J et K de la même ligne dans la feuille de sélection
                If Not trouve Is Nothing Then
                    cell.Offset(0, 8).Value = wsSource.Cells(trouve.Row, "C").Value ' Copie dans colonne J
                    cell.Offset(0, 9).Value = wsSource.Cells(trouve.Row, "D").Value ' Copie dans colonne K
                End If
            End If
        Next cell
     
        ' Fermer le classeur externe sans sauvegarder les modifications
        wbExt.Close SaveChanges:=False
    End Sub

  2. #2
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 644
    Points
    1 644
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If cell.Column = 2 Then
    Grand classique: Références implicites.
    Cette instruction (en réalité ActiveWorkbook.ActiveSheet.Cell.Column) pointe sur le classeur fraîchement ouvert.
    Donc, tu ouvres un classeur, fait des recherches / modifications dans ce dernier, et tu le fermes sans sauvegarder,
    ce qui en toute logique, ne sert a rien.

    Passe par des références explicites et tes soucis seront réglés.

    PS: Ne pas dépendre du contexte en programmation est primordial.
    Prend l'habitude d'être explicite.

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2024
    Messages
    2
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2024
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par deedolith Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If cell.Column = 2 Then
    Grand classique: Références implicites.
    Cette instruction (en réalité ActiveWorkbook.ActiveSheet.Cell.Column) pointe sur le classeur fraîchement ouvert.
    Donc, tu ouvres un classeur, fait des recherches / modifications dans ce dernier, et tu le fermes sans sauvegarder,
    ce qui en toute logique, ne sert a rien.

    Passe par des références explicites et tes soucis seront réglés.

    PS: Ne pas dépendre du contexte en programmation est primordial.
    Prend l'habitude d'être explicite.
    Je ne veut pas le modifier, je veut juste prendre les infos qu'il y a dans le tableur que le programme ouvre et les copier dans la sélection de mon tableur actuelle

  4. #4
    Membre expérimenté
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 118
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 118
    Points : 1 644
    Points
    1 644
    Par défaut
    Tu n'as pas compris.

    Tu penses que ton code agit entre 2 classeurs, alors qu'il agit sur un seul et même classeur.
    C'est du au fait que le contexte n'est pas celui que tu penses.

    Il n'y a pas 36 solutions: Libères toi du contexte.
    Une piste pour commencer:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    Dim Source As Excel;workbook
    Set Source = ...
     
    Dim Target As Excel.Workbook
    Set Target = ...

  5. #5
    Rédacteur

    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2013
    Messages
    947
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Août 2013
    Messages : 947
    Points : 4 058
    Points
    4 058
    Par défaut
    Citation Envoyé par BenLaTric Voir le message
    il modifie toute la feuille et j'aimerais que les changement ne s'effectuent que sur les lignes que j'ai sélectionnées
    Bonjour,
    Je n'ai peut-être pas compris la demande, ce que je pense c'est que vous souhaitez modifier certaines lignes, sélectionnées en amont du traitement. Si la sélection a été faite en appliquant une filtre il faut alors identifier les lignes visibles. Par exemple en testant la hauteur de la ligne : une ligne masquée a une hauteur de zéro. Donc ajouter un test dans votre code :

    Code VBA : 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
        ' Parcourir chaque ligne de la feuille de destination
        For i = 1 To derniereLigneDest
     
            If wsDest.Rows(i).Height > 0 Then ' Si la ligne est visible alors la traiter...
     
               valeurRecherche = wsDest.Cells(i, "B").Value ' Valeur de la colonne B
     
               ' Rechercher cette valeur dans la colonne A de la feuille source
               Set trouve = wsSource.Columns("A:A").Find(What:=valeurRecherche, LookIn:=xlValues, LookAt:=xlWhole)
     
               ' Si trouvé, copier les valeurs des colonnes C et D dans les colonnes J de la feuille de destination
               If Not trouve Is Nothing Then
                   wsDest.Cells(i, "J").Value = wsSource.Cells(trouve.Row, "C").Value
                   wsDest.Cells(i, "K").Value = wsSource.Cells(trouve.Row, "D").Value
               End If
     
            End If
     
        Next i

Discussions similaires

  1. Exporter tableau dans une autre feuille sans les lignes vides
    Par Caïndymion dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 24/03/2020, 10h42
  2. Tableview n'affiche pas les mots juste les lignes
    Par Julie201560 dans le forum XCode
    Réponses: 0
    Dernier message: 09/07/2016, 22h47
  3. Réponses: 2
    Dernier message: 13/05/2016, 22h26
  4. [Criteria] ne pas prendre toutes les colonnes dans un Join
    Par Sniper37 dans le forum Hibernate
    Réponses: 2
    Dernier message: 30/03/2009, 18h30
  5. Réponses: 1
    Dernier message: 15/04/2007, 20h09

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