RÉSOLU: Code d'importation simple qui oublie quelques lignes

  • Initiateur de la discussion Initiateur de la discussion Gen Rose
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

Gen Rose

XLDnaute Impliqué
Supporter XLD
Bonjour à tous 🙂

Je viens de réduire un gigantesque document d'environ 4 feuilles à 65 000 lignes chaques à environ 300 lignes chaque grâce à vous.

J'ai maintenant l'intention de réunir toutes les feuilles sur une seule avec ce code:

Code:
Sub import()
For i = 2 To Sheets.Count
    With Sheets(i)
        T = .Range("A1:J" & .Range("A65000").End(xlUp).Row).Value
        Range("A65000").End(xlUp).Offset(1).Resize(UBound(T, 1), UBound(T, 2)) = T
    End With
Next
End Sub

Il importe bel et bien toutes les feuilles sur une seule, comme prévu, mais dans la première feuille importé il a omis les 2 lignes du bas, de la deuxième feuille les 15 dernières, de la troisième les 10 dernières et de la quatrième les 5 dernières.

J'ai découvert que toutes ces lignes ont un point en commun; les case A et C sont vide et la ligne qui les précèdes (et la dernière importée) est remplie en ABCD. Je me demande comment dire au code que tant qu'il y a de l'information sur une ligne, elle doit être importée.

Voir en p.j le document pour un visuel.

Je désire réellement comprendre donc ne vous gênez pas pour m'expliquer ou me faire travailler; j'adore ça! Je ne parle pas encore VBA, mais je vais y arriver. Ceci dit, je ne post pas pour que l'on fasse tout à ma place; ce n'est pas un travail d'école noté et je n'ai pas de "deadline" ici même au travail; je fais ces projets car je veux bien les faire.😉

Un GROS merci pour votre aide et comme toujours, c'est sincèrement apprécié.
 

Pièces jointes

Dernière modification par un modérateur:
Re : Code d'importation simple qui oublie quelques lignes

Bonsoir,
Je désire réellement comprendre donc ne vous gênez pas pour m'expliquer ou me faire travailler; j'adore ça! Je ne parle pas encore VBA, mais je vais y arriver. Ceci dit, je ne post pas pour que l'on fasse tout à ma place; ce n'est pas un travail d'école noté et je n'ai pas de "deadline" ici même au travail; je fais ces projets car je veux bien les faire.

Ok , alors allons-y :
Pour définir une plage comportant ce type de caractéristiques (toutes les cellules ne sont pas remplies), il est préférable d'utiliser la propriété Range.CurrentRegion.
Tiré de l'aide d'Excel (touche F1) :
Cette propriété renvoie un objet Range qui représente la zone en cours. Celle-ci est une plage limitée par toute combinaison de lignes et de colonnes vides. Type de données en lecture seule.
Syntaxe

expression.CurrentRegion

expression Variable qui représente un objet Range.

Remarques


Cette propriété est utile pour de nombreuses opérations qui étendent automatiquement la sélection de façon à y inclure toute la zone en cours, à l'exemple de la méthode AutoFormat.

Cette propriété ne peut pas être utilisée dans une feuille de calcul protégée.


Exemple


Cet exemple montre comment sélectionner la zone en cours de la feuille « Sheet1 ».

Visual Basic pour Applications
Worksheets("Sheet1").Activate
ActiveCell.CurrentRegion.Select

Cet exemple suppose que vous disposez d'un tableau avec ligne d'en-tête dans « Sheet1 ». L'exemple montre comment sélectionner le tableau sans sélectionner la ligne d'en-tête. La cellule active doit se trouver quelque part dans le tableau avant d'exécuter l'exemple.

Visual Basic pour Applications
Set tbl = ActiveCell.CurrentRegion
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _
tbl.Columns.Count).Select

Une fois que tu as délimité la zone de la feuille avec CurrentRegion, tu peux charger ton tableau T.
Ensuite, tu devras te placer dans ta feuille IMPORT, déterminer la 1ère ligne vide et transposer ce tableau dans cette feuille, et ainsi de suite.
A+
 
Re : Code d'importation simple qui oublie quelques lignes

Bonsoir Geneviève, bonsoir le forum,

pour définir la dernière ligne éditée tu fais référence à la colonne A qui n'est pas toujours renseignée alors que la colonne B semble l'être. Modifie ton code comme ça :
Code:
Sub import()
For i = 2 To Sheets.Count
    With Sheets(i)
        T = .Range("A2:D" & .Range("B65000").End(xlUp).Row).Value
        Range("B65000").End(xlUp).Offset(1, -1).Resize(UBound(T, 1), UBound(T, 2)) = T
    End With
Next
End Sub
J'ai aussi remplacé la plage A : J par la plage A : D...

[Édition]
Bonsoir David on s'est croisé...
 
Dernière édition:
Re : Code d'importation simple qui oublie quelques lignes

Bonjour à vous deux et merci pour vos réponses!

@Robert; J'ai fait exactement comme ton code et il refait le même problème que le miens au départ; il ignore les dernières lignes. Ensuite, j'ai remarqué que le Offset de ton exemple était différent du mien (le mien étant Offset (1) et le tient Offset(1, -1); une fois cette partie ajustée, cela me donne une erreure d'exécution 1004. Je vais donc tenter d'appliquer le Range.CurrentRegion.
de David.

@David84; Je vais tenter d'appliquer le Range.CurrentRegion soit, celui-ci tiré de ton exemple
Code:
Set tbl = ActiveCell.CurrentRegion
tbl.Offset(1, 0).Resize(tbl.Rows.Count - 1, _
tbl.Columns.Count).Select
Je me demande seulement où le mettre alors j'en déduis que c'est dans l'entête du code;

J'ai besoin de précisions stp David
Une fois que tu as délimité la zone de la feuille avec CurrentRegion, tu peux charger ton tableau T.
Que veux dire "charger" le tableau T?

Ensuite, tu devras te placer dans ta feuille IMPORT, déterminer la 1ère ligne vide et transposer ce tableau dans cette feuille, et ainsi de suite.
Donc, je dois commencer la macro dans le VBE et ensuite me mettre en mode enregistrement pour sélectionner, copier coller chacun des tableau vers la feuille IMPORT?...Il me semble que ça ne peux pas être ça...ais-je mal compris?

En attendant de tes nouvelles, je vais commencer un début de solution et chercher dans les tutoriels de bases (ce que je fais autant que possible).

Mille mercis et une très belle journée à vous 2 😀
 
Dernière modification par un modérateur:
Re : Code d'importation simple qui oublie quelques lignes

Je voulais tester la solution de créer une macro en enregistrant la sélection des tableaux pour l'agencer à la formule Range.CurrentRegion mais j'ai ce problème:
macroimpossible.JPG

Donc, je vais tenter de simplement écrire en VBA dans l'éditeur...je me demande si mon document n'est pas corrompu? Si quelqu'un a une explication ou que ça lui est déjà arrivé, merci de m'en faire part!
 
Re : Code d'importation simple qui oublie quelques lignes

Re
ta procédure sub doit :
- définir et typer tes variables
- mettre en place une boucle permettant de traiter tous les onglets du classeur excepté le 1er
- à l'intérieur de cette boucle :
- délimiter la plage de valeurs à ramener (UsedRange) : le plus simple à mon avis est d'instancier un objet Plage afin de récupérer ses limites (son nombre de lignes et de colonnes) et ses valeurs (pour instancier un objet, on utilise le mot clé Set).
Tu n'auras plus ensuite qu'à te placer dans la feuille IMPORT pour :
- déterminer la dernière ligne non vide de la zone
- te positionner sur celle d'en dessous
- transposer les valeurs de Plage dans la feuille IMPORT
Et ainsi de suite pour les autres feuilles.

La 1ère partie de la procédure Sub (macro) donnerait donc :
Code:
Sub Import2()
'on déclare les variables
Dim Plage As Range
Dim Tablo As Variant
Dim i As Integer
Dim DerLig As Long

'on boucle sur toutes les feuilles du classeur à partir de la feuille 2
For i = 2 To Sheets.Count
    With Sheets(i)
        Set Plage = .Range("A1").CurrentRegion 'on instancie la zone utile
        Set Plage = Plage.Rows(2).Resize(Plage.Rows.Count - 1) 'on enlève la ligne des entêtes
    End With

'Pour t'aider à quoi cela sert d'instancier un objet Plage, affiche la fenêtre des variables locales (onglet Affichage=>fenêtre des variables locales) et
'clique sur la croix placée à gauche de Plage, puis descend jusqu'à value2 et clique dessus, puis sur value2(1), value2(2), etc. :
' tu verras que les valeurs de l'onglet sont dedans.

'suite de la procédure à écrire :
' Il te faut maintenant te placer dans la feuille IMPORT pour :
'- déterminer la dernière ligne non vide de la zone (utiliser CurrentRegion)
'- te positionner sur celle d'en dessous
'- calibrer la zone qui va recevoir les valeurs de Plage (utiliser Resize)
'- transposer les valeurs de Plage dans la feuille IMPORT (zone=Plage.value)

Next i 'on passe à la feuille suivante
End Sub
Dis-nous où tu bloques.
A+
 
Dernière édition:
Re : Code d'importation simple qui oublie quelques lignes

Mon premier bout de code toute seule!!!

Code:
Sub SelectionComplete()

Worksheets("condense_0").Activate
ActiveCell.CurrentRegion.Select

Worksheets("condense_1").Activate
ActiveCell.CurrentRegion.Select

Worksheets("condense_2").Activate
ActiveCell.CurrentRegion.Select

Worksheets("condense_3").Activate
ActiveCell.CurrentRegion.Select

End Sub

Je suis toute excitée que ça fonctionne...c'est là que l'on voit à quel point je suis débutante 😉

Donc, cette mini macro sélectionne entièrement tous mes tableaux; j'ai tenté d'utiliser le deuxième exemple de David pour sélectionner le tableau sans l'entête mais j'avais constamment l'erreur 1004.

Maintenant, je m'attaque à l'importation...🙂

EDIT.: je viens de voir que David m'a répondu ci-dessus! Je vais voir cela...
 
Re : Code d'importation simple qui oublie quelques lignes

Re David (et merci pour le coaching!) J'ai lu, relu et rerelu tout ton post et je commence à saisir le langage, quoique vraiment sensiblement.

Tu prends la peine de m'aider et donc, je me risque à quelques questions:

Ma mini macro (ci-dessous) fonctionnait bien dans le sens où lorsque je l'activais, je voyais la sélection active sur la feuille visée.
Code:
Worksheets("condense_0").Activate
ActiveCell.CurrentRegion.Select
Mais avec le début de macro que tu m'as donné plus haut, je ne vois pas cet effet sur les feuilles;je croyais que le fait d'avoir instancié les plage était cette portion du travail (sélection des 4 tableaux en entier - la première ligne).

Ensuite, j'ai bien tenté d'afficher la fenêtre des variables locales, mais voici ce qui apparaît
variablenondispo.jpg

Finalement, j'aimerais beaucoup m'attaquer à la suite de l'écriture du code...
Tu n'auras plus ensuite qu'à te placer dans la feuille IMPORT pour :
- déterminer la dernière ligne non vide de la zone
mais la feuille IMPORT est entièrement vide sauf pour le bouton avec cette macro.

Je suis réellement perdue; je tente de comprendre la suite et je vais regarder le code que j'avais au départ pour faire des liens et faire un code-frankenstein qui fonctionnera peut-être, en adaptant.

Merci beaucoup
 
Re : Code d'importation simple qui oublie quelques lignes

Re
Mais avec le début de macro que tu m'as donné plus haut, je ne vois pas cet effet sur les feuilles;je croyais que le fait d'avoir instancié les plage était cette portion du travail (sélection des 4 tableaux en entier - la première ligne).
c'est très bien d'apprendre à utiliser l'enregistreur de macro car te fournit le nom des propriétés (caractéristiques) et méthodes (actions) des objets que tu manipules. Mais après il te faut le retravailler car il n'est pas très performant tel quel et il te faut l'épurer car l'enregistreur te ramène des éléments dont tu n'as pas besoin et qui t'alourdit la procédure.
Par exemple, au lieu d'utiliser les méthodes Select ou Activate pour te positionner dans une feuille, il te suffit d'utiliser with...End With :
With worksheets(2)
.....
End With

Ensuite, j'ai bien tenté d'afficher la fenêtre des variables locales, mais voici ce qui apparaît
Oui. Lance ta macro en pas à pas (clique dans ta macro et appuie sur F8 : chaque appui fait progresser ta macro d'une étape) et tu verras à un certain moment Plage s'incrire, puis à un autre moment une croix se placer devant Plage. Fais ensuite ce que je t'avais indiqué dans mon message précédent.

Je suis réellement perdue; je tente de comprendre la suite et je vais regarder le code que j'avais au départ pour faire des liens et faire un code-frankenstein qui fonctionnera peut-être, en adaptant.
Je pensais que tu ne voulais pas que l'on te donne le résultat tout cuit.
Alors, si tu veux apprendre, cela ne se fait pas en un tour de main.
Maintenant, si tu veux la macro complète, et bien dis-le et je te la fournis.
A+
 
Re : Code d'importation simple qui oublie quelques lignes

@David

En effet, je ne veux pas le résultat tout cuit donc je ne veux pas le résultat tout de suite!!!

Mais je suis contente que tu me le proposes! Voici ce que je vais faire; je reviens avec une proposition de code après un très dur travail et si je n'ai pas réussi, je prendrai ta solution pour la comparer à mes ratés. De cette manière, j'apprendrai davantage.

Je vais maintenant m'amuser avec ce formidable F8 (j'ai bien hâte de voir ça) et utiliser l'enregistreur.

De toute façon, mon Frankeinstein est un échec total et trop hasardeux.

Je recommence.

merci beaucoup, beaucoup 🙂
 
Re : Code d'importation simple qui oublie quelques lignes

Bonsoir,

la première macro adaptée (de façon basique) sans les lignes de titres:
Code:
'bouton de lancement sur cette feuille IMPORT !
Private Sub CommandButton1_Click()
  Dim i As Long, dl As Long, T
  'ligne pour éviter une accumulation d'appels
  Range("A2:D" & Range("B65000").End(xlUp).Row + 1).Clear
  For i = 2 To Sheets.Count
    dl = Range("B65000").End(xlUp).Row + 1
    With Sheets(i)
      '2, pour éviter les lignes des titres
      T = .Range("A2:D" & .Range("B65000").End(xlUp).Row).Value
      Range("A" & dl & ":D" & dl + UBound(T) - 1) = T
    End With
  Next
End Sub

J'ai rajouté une ligne d'effacement pour éviter d'avoir les plages qui s'ajoutent à chaque appel !
J'ai changé la dernière colonne (D dans ton fichier)
J'ai supprimé des onglets pour alléger le fichier mais la macro s'adapte.
Attention, la boucle démarre à 2 car le 1 correspond à la feuille "IMPORT" (qui ne doit pas être prise dans cette boucle) !

Remarque : pour comprendre les étapes d'une macro,tu peux utiliser, dans l'éditeur, la touche F8 pour la lancer et la dérouler ligne par ligne.
 

Pièces jointes

Dernière édition:
Re : Code d'importation simple qui oublie quelques lignes

Bonsoir,
@Fo-rum : bon ,puisque tu as vendu la mèche🙄, je livre ma solution (cf. fichier ci-joint).
Par curiosité, j'ai comparé au niveau temps les 2 possibilités (passage par un tableau VBA ou par une plage instanciée).
Chez moi, sur 5 onglets (+ IMPORT) représentant en tout plus de 50000 lignes.
Résultat : performances équivalentes
- via un tableau : 0,8125 sec
- via une plage instanciée : 0,789 sec

Sur le fichier placé sur le forum (10000 lignes) :
- via un tableau : 0,164 sec
- via une plage instanciée : 0,156 sec

Qu'en est-il de ton côté ?
A+
 

Pièces jointes

Re : Code d'importation simple qui oublie quelques lignes

Bonsoir,

Désolé david84 mais c'était pour que la mèche ne fasse pas long feu.

Le but essentiel était de donner quelques explications et par la même occasion, donner à d'autres débutants un exemple basique pour comprendre la méthode utilisée. Voilà pour le fond. Pour la forme, chacun est plus sensible à la sienne qu'à celle des autres (question de niveau) ! Tout en haut, il est normal que l'efficacité prime.

Chez moi aussi, les 2 donnent des durées proches encore que tout dépende des travaux en tâche de fond du moment, avec un avantage quand même pour la plage instanciée.
 
Re : Code d'importation simple qui oublie quelques lignes

Bonjour à vous deux et merci d'avoir pris le temps de m'aider avec ce problème
(ainsi que tous les autres qui tomberons sur ce fil!).

En effet, la mèche devenait très longue dans l'intérêt du forum donc je comprends le point! Le dernier fichier est absolument superbe; tout est très clair et la comparaison des deux formules, presque identiques, est bien présentée. J'avais commencé des débuts de solutions mais bien honnêtement, en regardant le résultat, je n'y serais jamais arrivée; il me manque trop de notions encore.

J'ai gardé ton début de solutions avec explications David et, avec F8, je vais repasser le nombre de fois qu'il faudra pour arriver à saisir la démarche. Imaginez, c'est comme parler anglais quand on ne sait que "yes" "no" !

Encore un GROS merci pour votre aide!
😱
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
33
Affichages
3 K
Réponses
2
Affichages
684
Réponses
8
Affichages
1 K
Réponses
1
Affichages
1 K
Retour