Transfert de données d'un classeur vers un autre classeur Excel VBA

Dans ce code :

Sub Test2()

DerLig As Long, Lignes_A_Traiter As Long, Classeur As Workbook
Set Classeur = "MyClasseur.xlsm"

With Sheets("Feuil1")
   DerLig = .UsedRange.Rows.Count + 1
   Lignes_A_Traiter = 50
   .Range("A" & DerLig) = Classeur
   .Range("A" & DerLig & ":A" & DerLig + Lignes_A_Traiter) = Workbooks("test3.xlsm").Worksheets("ETAT DE LA LISTE DES FACTURES").Range("A1:A48")
End With

End Sub

Ma question est la suivante :

Ce code

  .Range("A" & DerLig) = Classeur 

ne va pas du tout indiquer à VBA de m'importer le fichier que je veux dans mon classeur. Alors faut-il que je crée un nouvel objet avec le classeur que je veux importer dans mon classeur actif afin que je le place dans la ligne de code

  .Range("A" & DerLig) = Classeur

à la place de "Classeur" ?

Par exemple :

nomfichier = "test3.xlsm" 'mon classeur que je veux importer

On ne met pas un classeur dans un cellule, mais une donnée. Encore une fois tu veux aller trop vite et tu fais un peu n'importe quoi. Sauf que le code VBA, c'est pas du hasard, c'est de la précision...

On a un objet de type classeur, dans lequel on affecte le classeur a importer.

Il faut ensuite, dans ce classeur :

  • Connaitre la feuille où se trouvent les données à importer
  • Déterminer la plage dans laquelle se trouvent ces données
  • Mémoriser ces données pour les reporter dans le classeur d'import

Oui je comprends ce que tu veux dire ...

Alors comment faire pour mettre mon classeur dans un classeur et pas dans une cellule ?

Ou alors comment faire pour mettre chaque donnée de mon classeur dans une cellule respective ?

Oui je comprends ce que tu veux dire ...

Alors comment faire pour mettre mon classeur dans un classeur et pas dans une cellule ?

Ou alors comment faire pour mettre chaque donnée de mon classeur dans une cellule respective ?

J'ai modifié mon précédent message pour y ajouter des compléments... Vas y dans l'ordre plutôt que de te jeter partout !

Pour connaitre la feuille, on utilise

sheets("")

Pour connaitre les cellules, on utilise

range("")

Pour mémoriser les valeurs, on utilise

.Value

Est-on d'accord ?

Pour connaitre la feuille, on utilise

sheets("")

Pour connaitre les cellules, on utilise

range("")

Pour mémoriser les valeurs, on utilise

.Value

Est-on d'accord ?

Pour manipuler oui, c'est une syntaxe du genre. Je ne connais pas l'organisation de tes fichiers à importer, mais je suppose que tu connais le nom ou la position de la feuille contenant les données à importer.

.Value ne sert pas à mémoriser des valeurs, il s'agit juste de préciser que tu travailles sur les valeurs d'une plage de données. Car il est aussi possible de travailler sur :

.Formula --> Les formules

.Font --> La police d'écriture

.Interior --> Le remplissage

Du coup ça donnerait quelque chose comme ça :

Workbooks ("").Worksheets("").Range("")

Du coup ça donnerait quelque chose comme ça :

Workbooks ("").Worksheets("").Range("")

Oui, mais as prit la peine de déclarer un objet classeur, qui devrait te simplifier un peu l'écriture ci-dessus...

Bon, je vais essayer de faire avancer le débat, étudie moi ça de près, adapte-le aux noms de tes fichiers, feuilles... et reviens me faire tes commentaires :

Sub Import()

Dim cheminfichier As Variant, WBsource As Workbook, WBdest As Workbook, DerLig As Long, LigImport As Long

        'On affecte le classeur actif à un nom, pour pouvoir y revenir facilement
        Set WBdest = ThisWorkbook
    With WBdest.Sheets("MaFeuille")
              DerLig = .Range("A" & .Rows.count).End(xlUp).Row + 1 'Première ligne vide de la feuille
        End With

        ' Sélection du classeur source à partir d'une fenêtre
        cheminfichier = Application.GetOpenFilename("Fichiers Excels (*.xlsm), *.xlsm")

        'Ouverture du classeur source, que l'on affecte à un objet classeur
        Set WBsource = Workbooks.Open cheminfichier

        'Report des valeurs
        With WBsource.Sheets(1)
             LigImport = .Range("A" & .Rows.count).End(xlUp).Row 'Détermine la dernière ligne de l'import
             WBdest.Range("A" & DerLig & ":AK" & DerLig + LigImport).Value = .Range("A2:AK" & LigImport).Value
        End With

End Sub

Oui mais ou est-ce que je peux le coder dans cette ligne ?

à la place de workbook ?

Oui mais ou est-ce que je peux le coder dans cette ligne ?

à la place de workbook ?

Quelle ligne ? Je ne te suis pas, de quoi tu parles ?

Merci beaucoup ! Je le regarde

Tu ne m'as toujours pas dit ou est ton post pour que je puisse le voir ?

Merci beaucoup ! Je le regarde

Tu ne m'as toujours pas dit ou est ton post pour que je puisse le voir ?

Tu as l'art du mystère ! Je ne suis pas dans ta tête, peux-tu préciser à quoi tu fais référence ?

J'avoue que j'ai des questions mais seulement pour bien comprendre ton code (après je ne t'embête plus et je te remercie vraiment de m'avoir accorder tant de temps et de patience) :

1) Ici tu ouvres la procédure "Import()" et tu déclares les variables chemin fichier comment un "tout type", WBsource comme un classeur/objet, WBdest comme un classeur/objet, DerLig comme une variable numérique et LigImport comme une variable numérique.

Sub Import()

Dim cheminfichier As Variant, WBsource As Workbook, WBdest As Workbook, DerLig As Long, LigImport As Long

2) Ici tu associes à la variable WBdest (avec un Set car c'est un type d'objet qui ne stocke pas de valeur) ce classeur ci en disant "ThisWorkbook".

3)Tu ouvres ensuite la procédure with qui concerne tout ce qui va se trouver dans la feuille 1 de ce classeur (classeur actif).

4)Tu affectes, à la variable DerLig, une commande qui va calculer dans la colonne "A" le nombre de lignes (rows.count) et remonte jusqu'à la cellule indiquée pour remonter jusqu'à la dernière cellule non vide (en(xlUp) et compte une ligne de plus pour insérer dans la première cellule vide.

Je ne suis pas sure pour End(xlUp) c'est bien ça ?

5) Puis tu fermes la procédure.

'On affecte le classeur actif à un nom, pour pouvoir y revenir facilement
        Set WBdest = ThisWorkbook
        With WBdest.Sheets("Feuil1")
              DerLig = .Range("A" & .Rows.Count).End(xlUp).Row + 1 'Première ligne vide de la feuille
        End With

6) Ici tu associes à la variable "cheminfichier" l'instruction d'ouvrir une fenêtre qui nous permet d'aller chercher un fichier de type Excel dans notre ordinateur.

 ' Sélection du classeur source à partir d'une fenêtre
        cheminfichier = Application.GetOpenFilename("Fichiers Excels (*.xlsm), *.xlsm")

7) Ici tu ouvres l'extraction/la source que l'on exporte dans notre classeur

Cette ligne ne fonctionne pas quand j'exécute ma macro (peut-être que c'est parce que j'ai mal modifié mes noms de feuilles avant).

 'Ouverture du classeur source, que l'on affecte à un objet classeur
        Set WBsource = Workbooks.Open cheminfichier

8) Ici tu ouvres une procédure qui concerne la feuille 1 du classeur source.

9) Tu associes à LigImport une commande qui va calculer dans la colonne "A" le nombre de lignes (rows.count) et remonte jusqu'à la cellule indiquée pour remonter jusqu'à la dernière cellule non vide (en(xlUp) et va importer les données de la source dans la première cellule vide. Est-ce bien ça ?

10) Puis tu va chercher les valeurs des cellules de A2:AK pour les exporter vers le classeur actif représenté par WBdest.

11) Tu fermes la procédure.

12) Tu fermes la procédure.

'Report des valeurs
        With WBsource.Sheets(1)
             LigImport = .Range("A" & .Rows.Count).End(xlUp).Row 'Détermine la dernière ligne de l'import
             WBdest.Range("A" & DerLig & ":AK" & DerLig + LigImport).Value = .Range("A2:AK" & LigImport).Value
        End With

End Sub

Si par exemple je veux que le code aille chercher la feuille 2 plutôt que la feuille 1, est-ce que je peux faire ça :

With WBsource.Sheets(2)

Je le teste tout de suite pour comprendre !

Tu fais quoi comme métier ? Développeur ?

Je sors d'un apprentissage... Et je dois avoir déposé un post pour me présenter sur la section dédiée, si tu souhaite y faire un tour.

Du coup non, je ne suis pas développeur, malgré les apparences, j'ai des compétences limitées sur Excel, surtout au regard de quelques spécimens que l'on a sur ce forum !

Tu m'as parlé d'un post ou je pouvais aller faire un tour. Je voulais savoir ou était le post pour que je puisse y faire un tour !

'Ouverture du classeur source, que l'on affecte à un objet classeur
        Set WBsource = Workbooks.Open cheminfichier

Malgré mes manip' ce code ne fonctionne pas : une page d'erreur m'indique : Erreur syntaxe

Cependant lorsque je mets simplement ça :

Workbooks.Open cheminfichier

ça fonctionne

Mais le code continue jusqu'à

 With WBsource.Sheets(1)

, il me le surligne et dit "WBsource n'est pas un objet défini" : dois je faire ça

WBsource = nomfichier 

Voici une capture pour être plus explicite.

capture

Il manque juste les parenthèses autour de "cheminfichier", c'est à dire : Set WBsource = Workbooks.Open(cheminfichier)

Je précise aussi que tu as plusieurs moyen de voir ce qui ne va pas dans l'éditeur VBA :

  • -> Sélectionner un objet et appuyer sur F1 ouvre l'aide
  • -> Exécuter le mode pas à pas avec F8 permet de voir les valeurs prises par les différentes variables...
  • -> Placer des espions, permet de voir le contenu et le type de données dans une variable lors de l'exécution

Bonjour Pedro ! J'espère que tu as passé un bon week-end

J'ai utilisé tes raccourcis pour vérifier et comprendre les endroits ou VBA m'indique que j'ai des erreurs et je souhaitais juste confirmer quelques choses avec toi.

Pour cette capture d'écran, j'ai utilisé le raccourci F1 en sélectionnant un objet. Il semble me dire que ma première erreur se trouve dans l'expression du ".Value".

Est-ce qu'utiliser le ".Value" dans ce contexte est faux car mes variables sont déclarées en tant que As Variant, As Workbook et As Long plutôt qu'en As String ?

(c'est ce que je comprends des indications présentent dans la fenêtre "aide").

capture
Rechercher des sujets similaires à "transfert donnees classeur vba"