Transfert de données d'un classeur vers un autre classeur EXCEL VBA Le sujet est résolu

Forum pour toutes vos questions à propos d'Excel (avec ou sans macros) ...
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 1296
Appréciations reçues : 114
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 12 novembre 2018, 09:56

LucieBRETON a écrit :
12 novembre 2018, 09:38
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").
Bonjour !

A moins d'utiliser un type inadapté à tes données, le type de variable ne génère pas d'erreur. Aussi, cheminfichier est effectivement une chaîne de caractères, et pourrait être déclaré en type String (moins consommateur de mémoire que Variant).

Je suis presque certain que l'origine du problème est liée à des plages de tailles différentes. En effet, la plage copiée démarre à la ligne 2, et se prolonge jusqu'à LigImport. Donc, en résumé, on copie LigImport - 1 lignes. Ce décalage est à prendre en compte dans la plage de destination...
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
LucieBRETON
Membre habitué
Membre habitué
Messages : 109
Inscrit le : 6 novembre 2018
Version d'Excel : 2013

Message par LucieBRETON » 12 novembre 2018, 10:06

Effectivement, je me doutais que ce serait peut-être un problème de plage de données. Tu me dis que je dois prendre en compte le fait que nous ayons mis LigImport- 1ligne donc peut-être que je devrais utiliser l'une de ces deux solutions (la deuxième me parait la plus jouable).

Première solution
ça :

Code : Tout sélectionner

WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A:AE" & LigImport).Value
Plutôt que ça :

Code : Tout sélectionner

WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
Deuxième solution:
ça :

Code : Tout sélectionner

LigImport = .Range("A" & .Rows.Count).End(xlUp).Row+1 'Détermine la dernière ligne de l'import
           WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
Plutôt que ça :

Code : Tout sélectionner

LigImport = .Range("A" & .Rows.Count).End(xlUp).Row 'Détermine la dernière ligne de l'import
           WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
Qu'en penses-tu ?
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 1296
Appréciations reçues : 114
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 12 novembre 2018, 12:10

La plage copiée débute à la ligne 2, considérant que la première ligne est une en-tête, et qu'il n'est pas nécessaire de la reporter.

Ta première proposition est fausse, car "A:AE" & LigImport n'est pas une plage valide, puisque tu n'as pas de ligne de départ.

Ta seconde proposition, bien que la syntaxe soit correcte, est inadaptée. En effet, il ne s'agit pas de copier une ligne de plus (LigImport + 1 étant par ailleurs une ligne vide), mais de coller sur une ligne de moins. En clair, le problème n'est pas sur la plage à copier, mais sur la plage où l'on colle les données !
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
LucieBRETON
Membre habitué
Membre habitué
Messages : 109
Inscrit le : 6 novembre 2018
Version d'Excel : 2013

Message par LucieBRETON » 12 novembre 2018, 13:41

D'accord donc si je comprends bien ce que tu veux dire, la modification que je dois effectuer si je souhaite que le code fonctionne se trouve sur cette partie:

Code : Tout sélectionner

[WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value/code]

de cette ligne :

[code]WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
car de cette manière, je modifierais la plage de données ou l'on colle les données et pas la plage de données à copier ?
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 1296
Appréciations reçues : 114
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 12 novembre 2018, 14:13

LucieBRETON a écrit :
12 novembre 2018, 13:41
D'accord donc si je comprends bien ce que tu veux dire, la modification que je dois effectuer si je souhaite que le code fonctionne se trouve sur cette partie:

Code : Tout sélectionner

[WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value/code]

de cette ligne :

[code]WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
car de cette manière, je modifierais la plage de données ou l'on colle les données et pas la plage de données à copier ?
Exact
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
LucieBRETON
Membre habitué
Membre habitué
Messages : 109
Inscrit le : 6 novembre 2018
Version d'Excel : 2013

Message par LucieBRETON » 12 novembre 2018, 14:21

Bon d'accord alors j'ai essayé ça :

Code : Tout sélectionner

 WBdest.Range("A" & DerLig & ":AE" & DerLig - 1 + LigImport).Value = .Range("A2:AE" & LigImport).Value
Plutôt que ça:

Code : Tout sélectionner

WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
Premièrement ça ne fonctionne pas :lol:
et deuxièmement est-ce que ça revient à annuler le + 1 de cette ligne de code ?

Code : Tout sélectionner

DerLig = .Range("A" & .Rows.Count).End(xlUp).Row + 1 
LucieBRETON
Membre habitué
Membre habitué
Messages : 109
Inscrit le : 6 novembre 2018
Version d'Excel : 2013

Message par LucieBRETON » 12 novembre 2018, 14:32

Enfait j'aurais besoin que tu m'expliques cette ligne :

Code : Tout sélectionner

WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
Comme ça je pourrais trouver l'erreur.

Parce que pour moi cette ligne de code signifie :
"Je copie les valeurs des cellules de la colonne A2 à la colonne AE jusqu'à la première ligne vide. Puis, je les colle dans les cellules de la colonne A à partir de la dernière ligne remplie (derlig) jusqu'aux cellules de la colonne AE à partir de la dernière ligne remplie (derlig) dans le classeur actif."
Je n'arrive pas à associer de fonctions à LigImport dans cette ligne.
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 1296
Appréciations reçues : 114
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 12 novembre 2018, 15:38

LucieBRETON a écrit :
12 novembre 2018, 14:32
Enfait j'aurais besoin que tu m'expliques cette ligne :

Code : Tout sélectionner

WBdest.Range("A" & DerLig & ":AE" & DerLig + LigImport).Value = .Range("A2:AE" & LigImport).Value
Comme ça je pourrais trouver l'erreur.

Parce que pour moi cette ligne de code signifie :
"Je copie les valeurs des cellules de la colonne A2 à la colonne AE jusqu'à la première ligne vide. Puis, je les colle dans les cellules de la colonne A à partir de la dernière ligne remplie (derlig) jusqu'aux cellules de la colonne AE à partir de la dernière ligne remplie (derlig) dans le classeur actif."
Je n'arrive pas à associer de fonctions à LigImport dans cette ligne.
Tu n'es pas loin. Je te mets un fichier pour mieux illustrer. Dans mon exemple, chaque onglet correspond à un fichier.
Illu plages.xlsx
(21.26 Kio) Téléchargé 2 fois
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
LucieBRETON
Membre habitué
Membre habitué
Messages : 109
Inscrit le : 6 novembre 2018
Version d'Excel : 2013

Message par LucieBRETON » 12 novembre 2018, 16:02

Super bien illustré (merci d'avoir pris le temps de faire ça) !
Donc on voit bien que dans l'onglet "WBsource" (qui est un autre fichier bien sur), il y a 49 lignes à importer (car on ne prend pas en compte les titres des colonnes). On voit que LigImport est enfait la dernière ligne remplie donc la 50ème. C'est ça ?

Et quand dans le premier onglet "WBdest" tu dis que "'64 = DerLig + LigImport - 2" en mettant un -2 car DerLig comporte un +1 (donc -1) et qu'il faut éliminer les champs de l'onglet deux donc -1. Je me trompe pas ?
Avatar du membre
Pedro22
Membre impliqué
Membre impliqué
Messages : 1296
Appréciations reçues : 114
Inscrit le : 26 janvier 2017
Version d'Excel : 2010

Message par Pedro22 » 12 novembre 2018, 16:10

LucieBRETON a écrit :
12 novembre 2018, 16:02
Super bien illustré (merci d'avoir pris le temps de faire ça) !
Donc on voit bien que dans l'onglet "WBsource" (qui est un autre fichier bien sur), il y a 49 lignes à importer (car on ne prend pas en compte les titres des colonnes). On voit que LigImport est enfait la dernière ligne remplie donc la 50ème. C'est ça ?

Et quand dans le premier onglet "WBdest" tu dis que "'64 = DerLig + LigImport - 2" en mettant un -2 car DerLig comporte un +1 (donc -1) et qu'il faut éliminer les champs de l'onglet deux donc -1. Je me trompe pas ?
Oui. DerLig correspond bien à la première ligne vide, où l'on commence à coller la plage copiée (d'où ce +1 dans son calcul). Cette fois, ça devrait fonctionner !

Autre remarque : le code utilisé pour le calcul des dernières lignes repose uniquement sur la colonne A, et la valeur peut-être erronée si la cellule A de la dernière ligne est vide. Si tu prend le fichier que je t'ai envoyé et que tu supprimes la cellule A50 de l'onglet "WBsource", la macro déterminera LigImport comme égale à 49, bien que le reste de la ligne 50 soit complet...

A toi de voir si le cas risque de se présenter dans tes données ou pas ! Si oui, il faut peut-être choisir une autre colonne dont tu es sûre qu'elle est systématiquement complète ou utiliser une autre méthode dans le code.
Le problème n'est pas de ne pas savoir, le problème est de ne pas chercher...
Ton problème est résolu ? N'oublie pas de l'indiquer :
Répondre Sujet précédentSujet suivant
  • Sujets similaires
    Réponses
    Vues
    Dernier message