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 :

Import d'une plage variable de données vers un autre tableau source [XL-2003]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 8
    Par défaut Import d'une plage variable de données vers un autre tableau source
    Bonjour à tous,
    Cela fait un moment que je cherche et que j'essaie d'adapter différentes solutions que je trouves un peu partout mais rien y fait...
    Voici mon problème :

    J'ai, sur un classeur "Wbk2", une plage de donnée "PlageWbk2" que je voudrais extraire pour l'ajouter à la suite d'un tableau existant.


    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
     
    Dim titre As String
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
     
    Dim PlageWbk2 As Range
    Dim PlageWbk1 As Range
    Dim LastColWbk2 As Variant
    Dim LastLigneWbk2 As Variant
    Dim LastCol As Variant
    Dim Lastligne As Variant
    Dim OngletWbk2 As String
     
    OngletWbk2 = "Feuil2"
     
    titre = "MonFichier.xlsx"
    Set wbk1 = ThisWorkbook
    Set wbk2 = Workbooks.Open(titre) ' jouvre le classeur (titre)
     
    'Verification de la dernière ligne/colone du tableau Wbk2
    LastColWbk2 = wbk2.Worksheets(OngletWbk2).Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    LastLigneWbk2 = wbk2.Worksheets(OngletWbk2).Range("A" & Rows.Count).End(xlUp).Row
     
    'Verification de la dernière ligne/colone du tableau source
    LastCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    Lastligne = Range("A" & Rows.Count).End(xlUp).Row
     
    PlageWbk2 = wbk2.Worksheets(OngletWbk2).Range(LastLigneWbk2, LastColWbk2) 'si je mets .Range("A1", "A6") ça passe mais ça mets une erreur à la ligne 33
     
    PlageRecep = Range(Cells(Lastligne + 1, 1), Cells(Lastligne + LastLigneWbk2, LastCol))
     
     
    wbk2.Worksheets(OngletWbk2).Range(PlageWbk2).Copy wbk1.Worksheets(1).Range(PlageRecep)
     
    wbk2.Close
    Ce code qui fonctionne très bien pour une cellule ou pour une plage fixe. Mais dés que j'essaie de mettre des variable dans ma plage source cela me mets une erreur à chaque fois... Pouvez vous m'aider ? Merci beaucoup a tous !

  2. #2
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Un Range est un objet et non une valeur.
    Pour mettre une référence dans une variable objet, le "=" ne suffit pas. Il faut utiliser l'instruction Set.
    https://msdn.microsoft.com/fr-fr/lib.../gg251642.aspx
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set PlageWbk2 = wbk2.Worksheets(OngletWbk2).Range(LastLigneWbk2, LastColWbk2)
    Autre chose : autant que possible, évite de déclarer des variables avec le type Variant. Ca évite les ambigüités et ça permet de repérer plus facilement les erreurs lors du débugage.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Dim LastColWbk2 As Long
    Dim LastLigneWbk2 As Long
    Dim LastCol As Long
    Dim Lastligne As Long

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 8
    Par défaut
    Merci pour les informations ! Mais j'ai toujours une erreur à la ligne 27 "1004 erreur définie par l'application ou par l'objet"...

    Voici le code modifié :

    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
    Dim titre As String
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
     
    Dim PlageWbk2 As Range
    Dim PlageWbk1 As Range
    Dim LastColWbk2 As Long
    Dim LastLigneWbk2 As Long
    Dim LastCol As Long
    Dim Lastligne As Long
    Dim OngletWbk2 As String
     
    OngletWbk2 = "Feuil2"
     
    titre = "MonFichier.xlsx"
    Set wbk1 = ThisWorkbook
    Set wbk2 = Workbooks.Open(titre) ' jouvre le classeur (titre)
     
    'Verification de la dernière ligne/colonne du tableau Wbk2
    LastColWbk2 = wbk2.Worksheets(OngletWbk2).Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    LastLigneWbk2 = wbk2.Worksheets(OngletWbk2).Range("A" & Rows.Count).End(xlUp).Row
     
    'Verification de la dernière ligne/colonne du tableau source
    LastCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    Lastligne = Range("A" & Rows.Count).End(xlUp).Row
     
    Set PlageWbk2 = wbk2.Worksheets(OngletWbk2).Range(Cells(2, 1), Cells(LastLigneWbk2, LastColWbk2))
     
    Set PlageRecep = Range(Cells(Lastligne + 1, 1), Cells(Lastligne + LastLigneWbk2, LastCol))
     
     
    wbk2.Worksheets(OngletWbk2).Range(PlageWbk2).Copy wbk1.Worksheets(1).Range(PlageRecep)
     
    wbk2.Close
    Cela peut, peut être, simplifier le code :
    Le tableau que je dois extraire correspond à toutes les information d'un onget sans la première ligne.

    Merci encore pour votre aide !

  4. #4
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Grdcolas Voir le message
    Merci pour les informations ! Mais j'ai toujours une erreur à la ligne 27 "1004 erreur définie par l'application ou par l'objet"...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set PlageWbk2 = wbk2.Worksheets(OngletWbk2).Range(Cells(2, 1), Cells(LastLigneWbk2, LastColWbk2))
    Le problème est au niveau de tes Cells.
    Ecrit ainsi, les Cells désignent des cellules de l'onglet actif et non pas ceux de wbk2.Worksheets(OngletWbk2), même si tu as mis cette référence devant le Range.

    Tu peux utiliser un With pour éviter d'avoir à répéter wbk2.Worksheets(OngletWbk2).
    https://msdn.microsoft.com/fr-fr/lib.../gg264723.aspx

    Ou bien tu peux simplifier ton code ainsi :

    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim LastColWbk2 As Long
    Dim LastLigneWbk2 As Long
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Dim LastCellWbk2 As Range
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    LastColWbk2 = wbk2.Worksheets(OngletWbk2).Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    LastLigneWbk2 = wbk2.Worksheets(OngletWbk2).Range("A" & Rows.Count).End(xlUp).Row
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set LastCellWbk2 = wbk2.Worksheets(OngletWbk2).UsedRange.SpecialCells(xlCellTypeLastCell)
    Remplace
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set PlageWbk2 = wbk2.Worksheets(OngletWbk2).Range(Cells(2, 1), Cells(LastLigneWbk2, LastColWbk2))
    Par
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Set PlageWbk2 = wbk2.Worksheets(OngletWbk2).Range("A2", LastCellWbk2)

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2017
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2017
    Messages : 8
    Par défaut
    J'ai remplacé tout ce que tu m'as dis et il me sort encore la même erreur 1004, mais à la ligne 30
    En ajoutant un espion il semblerai que ce soit "PlageWbk2" qui renvoie ça dans l'onglet "Error" Cependant je le trouve dans d'autres variables, je ne sais pas si ça peut être gênant aussi.

    Revoici le code encore modifié :

    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
    Dim titre As String
    Dim wbk1 As Workbook
    Dim wbk2 As Workbook
     
    Dim PlageWbk2 As Range
    Dim PlageWbk1 As Range
    Dim LastCellWbk2 As Range
    Dim LastCol As Long
    Dim Lastligne As Long
    Dim OngletWbk2 As String
     
    OngletWbk2 = "Feuil2"
     
    titre = "Monfichier.xlsx"
    Set wbk1 = ThisWorkbook
    Set wbk2 = Workbooks.Open(titre) ' jouvre le classeur (titre)
     
    'Verification de la dernière ligne/colonne du tableau Wbk2
    Set LastCellWbk2 = wbk2.Worksheets(OngletWbk2).UsedRange.SpecialCells(xlCellTypeLastCell)
     
    'Verification de la dernière ligne/colonne du tableau source
    LastCol = Cells(1, Cells.Columns.Count).End(xlToLeft).Column
    Lastligne = Range("A" & Rows.Count).End(xlUp).Row
     
    'Définition des plages
    Set PlageWbk2 = wbk2.Worksheets(OngletWbk2).Range("A2", LastCellWbk2)
    Set PlageRecep = Range(Cells(Lastligne + 1, 1), Cells(Lastligne + LastLigneWbk2, LastCol))
     
     
    wbk2.Worksheets(OngletWbk2).Range(PlageWbk2).Copy wbk1.Worksheets(1).Range("A1")
     
    wbk2.Close
    Merci pour tout !

  6. #6
    Expert éminent Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Par défaut
    Citation Envoyé par Grdcolas Voir le message
    J'ai remplacé tout ce que tu m'as dis et il me sort encore la même erreur 1004, mais à la ligne 30
    En ajoutant un espion il semblerai que ce soit "PlageWbk2"
    PlageWbk2 est un objet de type Range.
    Il ne se contente pas de contenir l'adresse d'une cellule (ou d'une plage de cellules), il contient TOUTE sa référence y compris son classeur et son onglet, il pointe sur cette cellule unique.

    Donc, quand on l'utilise, on peut le faire bien plus simplement que dans ton code.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PlageWbk2.Copy wbk1.Worksheets(1).Range("A1")

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Toutes versions] Copier une plage variable d'un onglet à l'autre
    Par lesebh dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 19/06/2017, 11h03
  2. [XL-2003] saisir des formules avec une plage variable de données
    Par nazaire dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 28/01/2011, 08h35
  3. import d'une bdd avec les données dans phpmyadmin
    Par lodan dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/10/2006, 19h05
  4. [VBA-E]Importer une ligne d'un classeur vers un autre
    Par khiat dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 04/02/2006, 14h15
  5. Importation d'une base 8.1.7 vers 9.i
    Par hkhan dans le forum Import/Export
    Réponses: 12
    Dernier message: 08/10/2004, 09h16

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