Rechercher première ligne vide d'un fichier et ecrire

[Résolu/Fermé]
Signaler
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015
-
 baloo24 -
Bonsoir A Toutes et Tous !

Un vrai néophyte en VBA s'adresse aux pros pour tenter d'éclaircir sa lanterne ! Merci d'avance à toutes celles et ceux qui se pencheront sur mon souci (sûrement modeste pour nombre d'entre Vous !).
a) J'ai un fichier A dans lequel j'enregistre des infos diverses et variées.
b) J'ai un fichier B que je fais ouvrir à travers une macro. maintenant j'aimerai connaitre l'ensemble du code pour :
- se positionner dans le fichier B sur la première ligne vide,
- recopier des infos de A dans les cellules de cette première ligne vide du fichier B.
Pourriez-vous me donner un coup de main ? D'avance merci et excellente soirée
JPierre,

43 réponses

Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Bon, pour faire simple, complète les informations ci dessous:

Ce que tu veux copier se trouve dans le fichier B (celui qui est fermé au départ) :
1- Nom de ce fichier avec l'extension (ex : Classeur1.xlsx)
2- Chemin d'accès à ce fichier (ex : C:/User/MonNom/Travail/Fichiers Excel/) [si tu veux anonymiser ce chemin remplace ce qui doit l'être par des xxxxx, tu feras l'inverse dans le code]
3- Nom de la feuille ou se trouvent les données à importer
4- Adresse des cellules à importer (ex : AN7:BG7)

Tu veux copier ces données dans le fichier A (celui qui est ouvert au départ) :
5- ou? Si j'ai bien compris, tu veux copier les données à importer dans la première ligne vide à partir de la colonne A, confirme le.

6- subsidiaire : est ce obligatoire, pour toi, d'ouvrir le fichier B?

Si je me trompe sur toute la ligne, réponds moi en indiquant exactement ton souhait.
1
Merci

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

CCM 41713 internautes nous ont dit merci ce mois-ci

Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Merci Mike-31 de votre réponse ! Alors pour tenter d'être plus clair :

a) dans le fichier A j'ai des cellules avec infos (ex : A4; C7; L25; G6 etc...)

b) j'aimerai que la macro :

- ouvre le fichier B
- se positionne sur la première ligne vide de B (par exemple la ligne 47) et inscrive A47=A4, B47=C7, C47=L25, D47=G6 etc ...)

Ai-je été plus clair ? Merci d'avance de votre aide,
A+, Baloo
Messages postés
17595
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
18 octobre 2021
4 776
Re,

Je découvre ta réponse , ce qui me gène c'est que les cellule à copier ne sont pas contiguës

ex : A4; C7; L25; G6 etc...)

on peut écrire un code relativement court pour copier les lignes de A4 à G26 ou les lignes 4, 7, 25, 6, etc mais pour copier une cellule par ci par la, il va falloir trouver un élément commun déclencheur

Peux tu mettre ton fichier à notre disposition que l'on voit sa structure, que tu peux joindre avec ce lien

https://www.cjoint.com/
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Bonjour et merci Mike-31 pour votre réponse mais je ne comprends rien à rien ! Boeuf je suis, boeuf je reste ....
Cependant suite à votre remarque, j'ai créé sur A une ligne qui rapatrie les infos dispersées sur la feuille de A.
Maintenant je coince sur le fait de faire écrire cette ligne créée sur la première ligne vide de B ...
Vous serait-il possible de m'adresser le code complet pour opérer cette macro ? désolé de vous paraître aussi nul mais je ne connais pas du tout le vba et pensais que c'était plus simple ... Mais j'ai un besoin urgent because je dois présenter ce fichier à mes boss jeudi !!!Pour l'envoi des fichiers, délicat car dossier pro et de plus + de 5 MO ...
d'avance merci et excellente journée sous le soleil ... j'espère pour Vous !
Baloo
Messages postés
17595
Date d'inscription
dimanche 17 février 2008
Statut
Contributeur
Dernière intervention
18 octobre 2021
4 776
Salut,

Je pense que le mieux est de commencer par mettre à notre disposition ton fichier sans notes confidentielles.
Pour cela commence par cliquer sur ce lien

https://www.cjoint.com/

Ensuite sur parcourir, puis sur créer le lien. Un lien sera généré en haut de la page, colle le dans un prochain post de la discussion
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Bonjour Mike 31 !
Désolé mais je ne peux pas mettre ces fichiers en ligne car pro et de plus j'aurai plus de temps à défaire les liens car sur des serveurs différents et à "banaliser" les fichiers. Mais je repose ma dernière question :
Après avoir "recentré" sur une seule ligne toutes les infos que je veux transférer du fichier A vers le fichier B, je demandais simplement le code complet pour assurer ce transfert. Merci de votre aide. Bien sincèrement,
Messages postés
16525
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
18 octobre 2021
3 230
Bonjour

Vu le poids de 5 Mo, solution sans ouvrir le classeur source: remplacer source.xls par le nom réel

macro dans le classeur cible
Sub lire_ferme()

Dim chemin As String

ligvide = Cells.Find("*", , , , , xlPrevious).Row + 1

chemin = ThisWorkbook.Path ' A ADAPTER
For cptr = 1 To 4
     Cells(ligvide, 3) = ExecuteExcel4Macro("'" & chemin & "\[source.xls]Feuil1'!R1C1") 'R1C1=A3
     Cells(ligvide, 4) = ExecuteExcel4Macro("'" & chemin & "\[source.xls]Feuil1'!R2C2")
     Cells(ligvide, 5) = ExecuteExcel4Macro("'" & chemin & "\[source.xls]Feuil1'!R5C3") '=C5
     Cells(ligvide, 6) = ExecuteExcel4Macro("'" & chemin & "\[source.xls]Feuil1'!R7C4")
Next
End Sub


Demo:
https://www.cjoint.com/c/CDpkdfdn58T
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Merci Michel, je teste et vous tient au courant ! Bonne journée à Vous !
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Bonjour à Toutes et Tous !
Toujours coincé par cette macro ...
Voilà le code que j'ai transcris ! Merci de votre aide :

Sub CodifOpe()
'
' CodifOpe Macro
'Selection de la ligne à copier
LigneSource = ThisWorkbook.Sheets("Prospect").Range("AN7:BG7").End(xlUp).Row
'Ouverture du fichier destination
Workbooks.Open Filename:="X:\EROLA\Opérations.xlsx"
ActiveWindow.SplitRow = 0
Application.FormulaBarHeight = 12
Application.FormulaBarHeight = 1
'Recherche de la première ligne vide Opérations
LigneDestination = Sheets("Patrimoine").Range("B").End(xlUp).Row + 1
'Ecrire ligne sur Opérations
ThisWorkbook.Sheets("Patrimoine").Rows(LigneSource).Copy
Workbooks("Erola-6.xlsx").Sheets("Prospect").Range ("B" & LigneDestination)


End Sub
Messages postés
16525
Date d'inscription
lundi 12 septembre 2005
Statut
Contributeur
Dernière intervention
18 octobre 2021
3 230
Excuse moi d'avoir essayé de t'aider
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Bonjour à tous,

Désolé pour l'incruste, je ne fais que passer...

tu ne serais pas en train de confondre source et destination???
Relis ton code tranquillement...
LigneSource = ThisWorkbook.Sheets("Prospect").blablabla
Or tu copies (lignesource) dans la feuille patrimoine :
ThisWorkbook.Sheets("Patrimoine").Rows(LigneSource).Copy

LigneDestination = Sheets("Patrimoine").blablabla
Or tu colles (lignedestination) dans la feuille prospect :
Workbooks("Erola-6.xlsx").Sheets("Prospect").Range ("B" & LigneDestination)

N'y aurait il pas confusion?
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Bonjour Pijaku !
Je ne comprends pas votre remarque désolé ...
Ma sélection à copier ligne source se trouve dans Erola feuille Prospect de la cellule AN7 à BG7.

LigneSource = ThisWorkbook.Sheets("Prospect").Range("AN7:BG7").End(xlUp).Row

la première ligne vide de destination se trouve dans Opérations feuille Patrimoine

LigneDestination = Sheets("Patrimoine").Range("B").End(xlUp).Row + 1

et j'aimerai que la copie se fasse à partir de la colonne B ...
Où me serai-je planté ? Je comprends plus rien ! Merci d'avance
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
1- as tu essayé le code de Michel_M?
2- si oui, comment l'as tu adapté?
3- Est ce que le code de Michel_M fonctionne?
4- S'il ne "fonctionne pas", dis nous ce qui ne te va pas et ce que surligne (en jaune) le débogage.
5- dans mon précédent message, je te dis simplement que tu as inversé ta source et ta destination... Relis ton code.

Et, puisque tu ne sembles pas habitué des forums :
6- lorsque tu obtiens une réponse, si tu n'arrives pas à la faire fonctionner, demande des précisions à celui qui t'as aidé. Ne passes pas d'une aide à une autre sans tenir compte des avis qui ont précédés.

Pour info Mike31 et michel_m sont des pontes en VBA Excel (entres autres).
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Pijaku, Michel et Mickaël

Désolé d'avoir froissé quique ce soi ce n'était pas mon intention ... Veuillez accepter mes plus plates excuses ... et l'invitation tien toujours !!!
Pour revenir à mon souci et ma découverte du fonctionnement d'un forum, j'ai parlé de 5Mo de fichiers (un ensemble de 3 fichiers liés).
Pijaku, oui je viens de tester le code de Michel M ... J'ai juste un problème c'est que mon fichier A (Erola) est ouvert lorsque je lance le code de Michel qui ouvre le fichier B. Ce qui fait qu'il m'ouvre l'explorateur a la recherche d'un fichier A à ouvrir alors qu'il l'est déjà en fait ...
Mon idée initiale était qu'en lançant le fichier Erola dans lequel je saisis une foultitude d'infos, je puisse rapatrier à travers une macro sur le fichier B (Opérations) une synthèse d'une dizaine de cellules ... C'était "tout" en fait ... Mais pour moi d'une complexité extrême ! Merci de votre aide !
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

On va y arriver ... je pense sauf que c'est l'inverse, ce que je veux copier est dans A (Erola-6.xslm) !

a) C'est le fichier A (Erola) qui comporte les infos que je veux copier qui est ouvert donc pour répondre à vos questions dans l'ordre :

1- Nom : Erola-6.xslm
2- Chemin : "X:/Partage/Erola/Erola-6.xslm"
3- Nom de la Feuille : "Prospect"
4- Plage des cellules à exporter : "Prospect" (AN7:BG7)
5- Nom du Fichier de destination : Opérations.xslx
5'- Feuille : "Patrimoine"
Plage du fichier où doivent être copiées (ou importer) les cellules : de la colonne B(première ligne vide) à la colonne U(première ligne vide)
6- Oui je suis obligé d'ouvrir le fichier "Opérations.xslx" car j'ai des infos à consulter.

Ai-je été plus clair ? D'avance merci ! Cordialement,
JPierre
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Chemin du fichier de destination (Opération.xlsx)? (obligatoire pour l'ouvrir)?
Messages postés
14
Date d'inscription
mardi 9 avril 2013
Statut
Membre
Dernière intervention
31 mars 2015

Désolé je comprends votre question ? C'est le nom du fichier et son extension ! Merci !
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Non, son répertoire, son chemin d'accès, par exemple :
Chemin : "X:/Partage/Erola/Erola-6.xslm"
D'accord ! Alors le chemin
"Y/Partage/Opérations/Opérations.xslx"
Est-ce votre attente ? Merci quand même de votre aide !
Bonne soirée et bien sincèrement
JPierre
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Bonjour,

Ma proposition du jour, à placer dans le Classeur Erola et à tester :
Sub exporter()
Dim FichierA As Workbook, FichierB As Workbook, Lign As Long, Tb()

Set FichierA = ThisWorkbook
Tb = FichierA.Sheets("Prospect").Range("AN7:BG7").Value
' !!! A ADAPTER \ au lieu de / il me semble...
Set FichierB = Workbooks.Open("Y:/Partage/Opérations/Opérations.xslx")
With FichierB
    With .Sheets("Patrimoine")
        Lign = .Range("B" & Rows.Count).End(xlUp).Row + 1
        .Range("B" & Lign).Resize(1, UBound(Tb, 2)) = Tb
    End With
End With
End Sub

Bonjour Franck et Merci ! Cela fonctionne bien avec le code suivant :

Sub CodifOp()
'
'a) je souhaite copier la plage AN7:BG7 de la feuille "Prospect" du fichier "Erola".

'b) vers la plage (B(première ligne vide) à U(première ligne vide)) de la feuille
'"Patrimoine" du fichier "Opérations".

' CodifOpe Macro
Dim Wks As Worksheet
Dim LigneDestination As Long
Set Wks = ThisWorkbook.Sheets("Prospect")

'Ouverture du fichier destination
Workbooks.Open Filename:="X:\EROLA\Opérations.xlsx"


'Recherche de la première ligne vide Opérations
LigneDestination = Sheets("Patrimoine").Cells(Rows.Count, "B").End(xlUp).Row + 1
'Ecrire ligne sur Opérations
Wks.Range("AN7:BG7").Copy
Sheets("Patrimoine").Range("B" & LigneDestination).PasteSpecial Paste:=xlPasteValues
End Sub

Par contre, sans vouloir abuser, est-il possible d'introduire une notion de recherche si cette copie de cellules n'a pas déjà été faite, ceci afin d'éviter les doublons dans Opérations ? D'avance merci pour Tout
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
sans vouloir abuser
Sans vouloir abuser à mon tour, est il possible d'avoir toutes les informations dès maintenant?

Pour comparer les doublons, encore faut il savoir quelles données comparer...
Si la comparaison, par exemple, de la cellule AN7 avec toute la colonne B de la feuille Patrimoine suffit à éviter les doublons, s'il faut, a contrario, comparer toutes les cellules de AN7:BG7 avec le contenu des cellules de la feuille Patrimoine.........
Oui bien sûr ... Désolé mais j'ai du mal à fonctionner sur le forum ... Il est bien évident que vous n'êtes pas dans ma réflexion .. Il faut que je m'y fasse ! Encore mille excuses !
Donc les cellules à comparer sont les cellules AN7,AO7,AP7,AE7 d'Erola-6.xlsm avec respectivement les colonnes B,C, D, E d'Opérations.xlsx !
D'avance merci de votre aide !
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Combien de lignes comporte la feuille Patrimoine du fichier Opérations.xlsx aujourdhui? combien de lignes à terme?
687 lignes occupées aujourd'hui toute la feuille à terme .... excel 2007 soit 1 048 576 ... si possible !
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
ok.
Bon alors mon bon conseil du jour : n'utilise pas Excel.
Pour exemple, un fichier, possédant une feuille remplit de données (de type string avec un max de 9 caractères dans les cellules) sur 20 colonnes et 1 000 000 de lignes, "pèse" 86,1 Mo (90 335 903 octets). Je viens de tester.
Rien que pour enregistrer une petite modif, avec mon pc qui est pourtant une foudre de guerre, j'en ai eu pour plus de 45 secondes.....
A ouvrir, manipuler d'autres fichiers, tout cela via un réseau... C'est le plantage assuré!

Pour faire ce que tu souhaites, utilise une véritable base de données, pas un classeur Excel.
Après réflexion ... non 2000 lignes maxi ... Cela fera 10 ans et d'ici là la quille j'espère !!! Et toute la boite bosse sur Excel ... Alors je suis obligé d'y mordre malgré mes nombreuses sollicitations à changer !
Messages postés
12257
Date d'inscription
jeudi 15 mai 2008
Statut
Modérateur
Dernière intervention
3 septembre 2021
2 652
Je ne suis pas là cet aprème, donc une solution demain.

Par contre, passer de 1000000 de lignes à 2000 c'est radical!

Ah oui, j'oubliais, n'y a t'il pas une erreur ici :
Donc les cellules à comparer sont les cellules AN7,AO7,AP7,AE7 d'Erola-6.xlsm avec respectivement les colonnes B,C, D, E d'Opérations.xlsx !

AE7??? Pas AQ7 par hasard???............
Oui ... C'est moi qui avait m... par contre je n'ai pas le résultat escompté ... Pourquoi :
a) Mon fichier de base s'appelle Erola,
b) Après création de répertoire, il s'enregistre sous le nom de "323- Lille" par exemple.
c) Quand j'ouvre Lola, je dois pouvoir non plus aller chercher dans Erola les infos nécessaires mais dans "323-Lille"! Voilà pourquoi j'avais pensé passer par un fichier intermédiaire qui enregistrait le "323-Lille" comme variable que je rapatriais ensuite dans Lola pour faire fonctionner les formules grâce à Indirect() et l'enregistrer grâce au code que vous m'avez fourni ce matin ... A moins qu'il y ait une possibilité directe ????
Ai-je été clair ?
Pas sûr à me relire ...
Oui .... Heureusement que vous suivez ... C'est bien AQ7 et non AE7 ! Oui passer à 2000 lignes est radical mais à raison de 15à20 lignes par an cela laisse de la marge à mes successeurs .... Et d'ici là peut-être les boss auront-ils voulu abandonner excel au profit d'access ... Bon après-midi, profitez du beau temps si vous le pouvez et bien à Vous !
JPierre