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 :

Imports données sans doublon [XL-2010]


Sujet :

Macros et VBA Excel

  1. #21
    Invité
    Invité(e)
    Par défaut
    Salut,

    Le copier-coller dont tu parle demande une plage source (Range.Copy) et une plage de destination (Range.PasteSpecial).
    Ce code copie la plage A1:B10 de la feuille "Source", puis la copie au sein de la feuille "Destination" par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub MacroTest()
        ThisWorkbook.Worksheets("Source").Range("A1:B10").Copy
        ThisWorkbook.Worksheets("Destination").Range("J12").PasteSpecial xlPasteValuesAndNumberFormats
    End Sub
    La propriété Selection renvoie un Range, tu peux facilement la remplacer par n'importe quel autre range.


    Tu peux aussi faire cette opération entre 2 classeurs différents en remplaçant les ThisWorkbook par un Classeur Source et un Classeur Destination.
    J'ai testé tout de même avant de poster (au cas où):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Sub MacroTest2()
        Workbooks("Source.xlsx").Worksheets("Source").Range("A1:B10").Copy
        Workbooks("Destination.xlsx").Worksheets("Destination").Range("J12").PasteSpecial xlPasteValuesAndNumberFormats
    End Sub

  2. #22
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 939
    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 : 12 939
    Points : 28 936
    Points
    28 936
    Billets dans le blog
    53
    Par défaut
    Bonjour Eric,
    Mais lorsque j'ai besoin par exemple de couper une partie de la feuille pour la coller dans une autre, il faut bien sélectionner la cellule de départ et la feuille et la cellule de destination, non? comme cet exemple
    Absolument pas. Sauf si tu pars d'une sélection manuelle de l'utilisateur, il n'y a aucune raison d'utiliser les méthodes Select, Activate ni la propriété Selection etc.
    Voici un exemple d'une copie partielle d'une liste de données commençant à la ligne 90 et colonne 2 de cette liste se trouvant sur la feuille nommée [bd] en la collant à partir de la cellule A1 de la feuille nommée [Feuil3].
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub CopiePartielle()
     Dim rngSource As Range, rngTarget As Range
     Const StartRow As Long = 90, StartCol As Integer = 2
     With ThisWorkbook
      Set rngSource = .Worksheets("db").Range("A1").CurrentRegion
      Set rngTarget = .Worksheets("Feuil3").Range("A1")
     End With
     With rngSource
      Set rngSource = .Offset(StartRow - 1, StartCol - 1).Resize(.Rows.Count - StartRow + 1, .Columns.Count - StartCol + 1)
     End With
     rngSource.Copy rngTarget
     Set rnSource = Nothing: Set rngTarget = Nothing
    End Sub

  3. #23
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Merci Philippe et Nouveau2,
    J'ai bien saisi votre raisonnement mais lorsque l'on ne connait que la cellule de départ sans connaitre la colonne ni la ligne de fin, comme dans mon exemple, comment faire?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Col.Offset(2, j).Select 'Ma cellule de départ
    Range(Selection, Selection.End(xlToRight)).Select 'la dernière colonne non vide
    Range(Selection, Selection.End(xlDown)).Select 'la dernière ligne non vide
    Selection.Copy
    Eric

  4. #24
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 939
    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 : 12 939
    Points : 28 936
    Points
    28 936
    Billets dans le blog
    53
    Par défaut
    Bonjour Eric,
    Par programmation, tu as forcément connaissance de la cellule de départ. La preuve par ta ligne de code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Col.Offset(2, j).Select
    La variable J qui représente un déplacement par colonne a un moment donné une valeur trouvée par une instruction programmée.
    Dans mon exemple, j'utilise une constante mais bien évidemment cela pourrait être le résultat d'une recherche.

  5. #25
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Bonjour Philippe,
    En effet je connais ma cellule de départ, dans mon exemple "Col.Offset(2, j)", mais je ne connais pas le nombre de colonne à droite et de lignes en dessous à copier d'où mon utilisation de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Col.Offset(2, j).Select 'Ma cellule de départ
    Range(Selection, Selection.End(xlToRight)).Select 'la dernière colonne non vide
    Range(Selection, Selection.End(xlDown)).Select 'la dernière ligne non vide
    Selection.Copy
    Y-a-t-il une alternative sans utiliser de Select?
    Eric

  6. #26
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 939
    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 : 12 939
    Points : 28 936
    Points
    28 936
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    L'exemple que j'ai donné dans ma réponse #13 répond exactement à ce que tu cherches.
    Je ne sais jamais non plus combien de lignes et de colonnes il y a dans une liste de données
    Dans cette ligne de code, la variable objet rngSource est la plage de la liste de données. La propriété CurrentRegion renvoie un objet Range qui représente la zone en cours (c'est l'équivalent du Ctrl+"A" ou Ctrl + "*" que l'on active lorsque l'on sélectionne une cellule d'une liste de données).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     With ThisWorkbook
      Set rngSource = .Worksheets("db").Range("A1").CurrentRegion
    End With

  7. #27
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Rebonjour Philippe,
    Merci, je ne connaissais pas cette variable objet et cette propriété, je les utiliserai donc dorénavant
    Eric

  8. #28
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut




    Eric, regarde par exemple mes codes des posts #11, #12 & #16 :
    sans sélection et sans souci pour trouver la dernière colonne ou la dernière ligne …



  9. #29
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Merci Marc et Philippe
    Je vais prendre l'habitude d'utiliser ces variables et propriétés , faudra que ça rentre...
    Eric

  10. #30
    Expert éminent sénior
    Avatar de Marc-L
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Avril 2013
    Messages
    9 468
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2013
    Messages : 9 468
    Points : 18 674
    Points
    18 674
    Par défaut
    Citation Envoyé par eric4459 Voir le message
    J'ai réalisé le code sous Excel 2010 donc l'erreur vient peut-être de là.
    Même erreur en version 2007 …

    A partir du fichier du post #5, l'erreur #424 objet requis est provoquée en ligne n°41 lors de la seconde itération de la boucle
    car à cause de la ligne n°45 la variable BL a été vidée car elle ne peut plus pointer sur une cellule qui a été supprimée …
    C'est le problème d'utiliser des variables objets lors de la suppression de leurs références !

    En ajoutant avant la ligne n°51 Set BL = Base.Range("A1") (pointant ainsi la nouvelle cellule A1, logique objet oblige), le code passe …

    Mieux vaut utiliser une structure With … End With dans un tel cas, cela évite de gâcher du temps et des ressources
    en variables inutiles mais c'est vrai avec la puissance des ordinateurs d'aujourd'hui, cela ne compte plus vraiment …

    _________________________________________________________________________________________________
    La meilleure façon de ne pas avancer est de suivre une idée fixe. (Jacques Prévert)

  11. #31
    Inactif  

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Janvier 2012
    Messages
    4 903
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 68
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Finance

    Informations forums :
    Inscription : Janvier 2012
    Messages : 4 903
    Points : 10 166
    Points
    10 166
    Billets dans le blog
    36
    Par défaut
    Bonjour,

    À bien y penser, cela aurait probablement été plus simple de tout prendre, doublons inclus, et de faire un filtre élaboré avec extraction sans doublon.

    Mais bon...

  12. #32
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Philippe,
    J'essaie de mettre en application vos conseil pour éviter l'utilisation des Select.
    Voici ce que j'ai écrit:
    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 A_INTEGRER2()
    
    Dim Base As Worksheet
    Dim data As Worksheet
    Dim BL As Range
    Dim ACVAL As Range
    Dim i As Integer
    Dim j As Integer
    Dim rngSource As Range
    Dim rngTarget As Range
    Const StartRow As Long = 1
    Const StartCol As Integer = 1
    Set Base = ThisWorkbook.Sheets("A INTEGRER")
    Set data = ThisWorkbook.Sheets("DATA")
    Set BL = Base.Range(" A1")
    BL = BL.Offset(0)
    Set ACVAL = data.Range("A1")
    ACVAL = ACVAL.Offset(0)
    i = 0
    j = 0
    
    For i = 0 To 29 'Ici on va vérifier les 30 ligne de l'onglet "A INTEGRER" (meme si elles sont vide) A ADAPTER
    
    Do While ACVAL.Offset(j, 0) <> ""  'on vérifie tous les lignes de l'onglet "DATA"
    If BL.Offset(i, 1) = ACVAL.Offset(j, 1) And BL.Offset(i, 2) = ACVAL.Offset(j, 2) And BL.Offset(i, 4) = ACVAL.Offset(j, 4) And BL.Offset(i, 6) = ACVAL.Offset(j, 6) And BL.Offset(i, 7) = ACVAL.Offset(j, 7) Then
    ACVAL.Offset(j, 8) = ACVAL.Offset(j, 8) + 1 'Si les données des colonnes B, C, E, G et H sont identiques on incrémente la colonne I de la feuille "DATA"
    ACVAL.Offset(j, 0) = BL.Offset(i, 0) 'ici on actualise la date de la ligne identique à celle dans l'onglet"A INTEGRER"
    BL.Offset(i, 8) = 1 'Si les données des colonnes B, C, E, G et H sont identiques on marquela la ligne de la feuille "A INTEGRER"
    'on pourra ensuite selectionner et supprimer ces lignes et ne copier dans l'onglet "DATA" que celles qui ont des diffèrences
    i = i + 1
    j = 0
    Else
    i = i
    j = j + 1
    End If
    Loop
    j = 0
    Next i
    i = 0
    j = 0
    
    
    Do While BL.Offset(i, 0) <> ""
    If BL.Offset(i, 8) = 1 Then
    With thisworkbooks
    Set rngSource = .Worksheets("A INTEGRER").Range(BL.Offset(i, 0)).CurrentRegion
    Set rngTarget = Range("A65000").End(xlUp).Offset(1)
    End With
    With rngSource
    Set rngSource = .Offset(StartRow - 1, StartCol - 1).Resize(.Rows.Count - StartRow + 1, .Columns.Count - StartCol + 1)
    End With
    rngSource.Delete
    i = 0
    Else
    i = i + 1
    End If
    
    Set BL = Base.Range(" A1")
    
    Loop
    i = 0
    
    rngSource.Copy rngTarget
    
    Do While ACVAL.Offset(j, 0) <> ""
    If ACVAL.Offset(j, 8) = "" Then     'ici met la valeur 1 en colonne I pour les nouvelles lignes
    ACVAL.Offset(j, 8) = 1
    End If
    j = j + 1
    Loop
    
    rngSource.Delete
    
    End Sub
    Lors du test de la procédure j'ai une erreur Objet Requis en ligne 46.
    Pourtant tout à l'air d’être déclaré

    J'ai également testé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim StartRow As Long
    code....
    Set StartRow = i
    Mais j'ai la même erreur
    Que faut-il faire pour que cela passe?
    Eric

  13. #33
    Membre éprouvé
    Avatar de eric4459
    Homme Profil pro
    Ingénieur Gestion de Projets
    Inscrit en
    Avril 2014
    Messages
    605
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Alpes de Haute Provence (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur Gestion de Projets
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2014
    Messages : 605
    Points : 1 124
    Points
    1 124
    Par défaut
    Citation Envoyé par Marc-L Voir le message

    En ajoutant avant la ligne n°51 Set BL = Base.Range("A1") (pointant ainsi la nouvelle cellule A1, logique objet oblige), le code passe …
    Effectivement, je n'avais pas vu cela lors de mes premiers essais
    Merci
    Eric

  14. #34
    Rédacteur
    Avatar de Philippe Tulliez
    Homme Profil pro
    Formateur, développeur et consultant Excel, Access, Word et VBA
    Inscrit en
    Janvier 2010
    Messages
    12 939
    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 : 12 939
    Points : 28 936
    Points
    28 936
    Billets dans le blog
    53
    Par défaut
    Bonjour,
    Lors du test de la procédure j'ai une erreur Objet Requis en ligne 46.
    Pourtant tout à l'air d’être déclaré

    J'ai également testé ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim StartRow As Long
    code....
    Set StartRow = i
    Mais j'ai la même erreur
    Que faut-il faire pour que cela passe?
    L'instruction Set ne doit être utilisée que pour attribuer une référence d'objet à une variable objet.
    Pour affecter une valeur à une variable classique c'est le nom de la variable = Valeur (ex L=5)

+ Répondre à la discussion
Cette discussion est résolue.
Page 2 sur 2 PremièrePremière 12

Discussions similaires

  1. [XL-2010] Import de données sans doublons
    Par triaguae dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 25/08/2014, 16h36
  2. extraction d'une liste de données sans doublons et triées
    Par lps02 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 24/04/2012, 22h51
  3. [XL-2003] Exporter une liste de données sans doublons après un filtre sur une deuxième feuille
    Par mandrake57 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 08/07/2011, 13h36
  4. créer une série de chiffre aléatoire dans une plage donnée, sans doublon
    Par ProgElecT dans le forum Vos contributions VB6
    Réponses: 4
    Dernier message: 02/07/2008, 10h02
  5. [Conception] Insertion de données sans doublon
    Par Yukhaa dans le forum PHP & Base de données
    Réponses: 5
    Dernier message: 19/10/2006, 08h35

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