Précédent   Forum des professionnels en informatique > Logiciels > Microsoft Office > Excel > Macros et VBA Excel
Macros et VBA Excel Vos questions relatives aux macros Excel, à l'utilisation de VBA et à l'automatisation de vos classeurs Excel.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 16/08/2011, 18h14   #1
Invité de passage
 
Homme
Ingé
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Par défaut Récupérer une cellule de la dernière ligne non vide d'un tableau

Bonjour @ tous,

L'idée du code est de faire une chose paraissant assez simple mais qui me résiste a savoir faire le même principe qu'une RECHERCHEV mais en VBA à l'ouverture d'un fichier.

Situation:

J'ai un fichier "Source" que je remplis au fur et à mesure du temps sur les colonnes "A" et "B".
Ces 2 colonnes sont des liens hypertext celui de la colonne "B" ouvre un fichier .xls (que j'ai créé au préalable).
Ce fichier doit se remplir à l'ouverture dans :
* la cellule B2 du contenu de mon fichier "Source" situé ligne "?" colone "A"
* la cellule B3 du contenu de mon fichier "Source" situé ligne "?" colone "B"
* la cellule B4 de la date de création du fichier (ça c'est le bonus )

Note Si c'est la 1ere ouverture du fichier ça rempli, j'enregistre le fichier, et si je ré-ouvre le fichier ça ne le fait plus


Biensur le code suivant ne marche pas j'ai essayer des choses beaucoup plus simple mais j'arrive à la même conclusion du coup de patine

Code :
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
Private Sub Workbook_Open()
 
Dim Repertoire As String, Fichier As String
Dim Ligne As Long
 
Dim CLe, CLs As Workbook 'Classeur entree & source
Dim FLe, FLs As Worksheet 'Feuille entree & source
Dim DerniereLigneFeuille1, LigneCourante As Long
 
Application.ScreenUpdating = False 'suppresion des messages d actualisation
Application.DisplayAlerts = False
Application.AskToUpdateLinks = False 'décoche la confirmation auto des liens
 
    Set CLe = ThisWorkbook
    Set FLe = CLe.Worksheets("Feuille1")
 
Repertoire = "monchemin\quilestbeau\"
Fichier = Dir(Repertoire & "monfichieraouvrir.xls")
 
    Set CLs = Workbooks.Open(Repertoire & Fichier)
    Set FLs = CLs.Worksheets("Feuille1")
 
    DerniereLigneFeuille1 = FLs.Range("A5").End(xlDown).Row 'censé aller chercher la dernière ligne non vide
 
    If FLe.Cells(2, 2).Value = "" Then 'si j'ouvre le fichier et que c'est vide je rempli
 
       FLs.Range("A" & LigneCourante).Copy Destination:=FLe.Cells(2, 2) 'par la dernière ligne remplie de la colonne A
 
    End If
 
End Sub

D'avance merci
christoff916 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 19h00   #2
Candidat au titre de Membre du Club
 
Homme Alexandre DBQ
Ressources humaines
Inscription : août 2011
Messages : 20
Détails du profil
Informations personnelles :
Nom : Homme Alexandre DBQ
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Ressources humaines
Secteur : Service public

Informations forums :
Inscription : août 2011
Messages : 20
Points : 12
Points : 12
Bonjour,

Pour trouver la dernière ligne ayant un enregistrement tu peux utiliser:
Code :
1
2
3
 
dim NBline as integer
NBLine = Worksheets("nomdelafeuille").Range("A1").End(xlDown).Row
Citation:
* la cellule B4 de la date de création du fichier (ça c'est le bonus )
De quelle création? de la mise à jour (saisie sur cette ligne) ou la dernière sauvegarde?

Code :
Worksheets("nomdelafeuille").range("B4").value = Now
si je ne me trompe pas...

Citation:
Envoyé par christoff916 Voir le message
Code :
1
2
3
4
5
6
7
8
Private Sub Workbook_Open()
 
Dim Repertoire As String, Fichier As String
Dim Ligne As Long
 
Dim CLe, CLs As Workbook 'Classeur entree & source
Dim FLe, FLs As Worksheet 'Feuille entree & source
Dim DerniereLigneFeuille1, LigneCourante As Long
Pourquoi ne pas déclarer DerniereLigneFeuille1 et LigneCourante comme des "Integer"?

Citation:
Envoyé par christoff916 Voir le message
Code :
1
2
 
DerniereLigneFeuille1 = FLs.Range("A5").End(xlDown).Row 'censé aller chercher la dernière ligne non vide
Pourquoi tu pars de la 5ème ligne?
Citation:
Envoyé par christoff916 Voir le message
Code :
1
2
 
FLs.Range("A" & LigneCourante).Copy Destination:=FLe.Cells(2, 2) 'par la dernière ligne remplie de la colonne A
Tu n'es pas obligé de mettre le
Citation:
Destination:=
Tweelight est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 23h18   #3
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
Citation:
Code :
Dim DerniereLigneFeuille1, LigneCourante As Long
attention avec ce code seul Ligne courante et un long, DernierLigneFeuille1 est un variant , en VB lors des déclaration il faut répéter le type pour chaque variables : XIII. Déclaration de variables , même chose pour tes autres déclarations .

ensuite tu utilise DernierLigneFeuille1 pour calculer la première ligne libre mais ensuite tu utilise LigneCourante que tu n'as pas calculé !


@Tweelight : Les variables LigneCourante et DernierLigneFeuille1 doivent être des long car maintenant un classeur peu avoir plus de 65535 lignes.

Citation:
Envoyé par Tweelight
Pourquoi tu pars de la 5ème ligne?
si les lignes 1 à 4 sont vide il faut partir de la 5° ligne !
bbil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 23h33   #4
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Bonsoir,

Citation:
Envoyé par Tweelight
Pourquoi ne pas déclarer DerniereLigneFeuille1 et LigneCourante comme des "Integer"?
comme le dit bbil, il faut désormais penser impérativement en terme de portabilité, et de toutes façons :

Citation:
... il est inutile et même préjudiciable de déclarer des variables en Integer vu qu’elles sont de toutes façons converties en Long, et que du coup on y perd en performance...
cf ce fil #1 et la suite...

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 16/08/2011, 23h40   #5
Candidat au titre de Membre du Club
 
Homme Alexandre DBQ
Ressources humaines
Inscription : août 2011
Messages : 20
Détails du profil
Informations personnelles :
Nom : Homme Alexandre DBQ
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Ressources humaines
Secteur : Service public

Informations forums :
Inscription : août 2011
Messages : 20
Points : 12
Points : 12
Bonjour Bbil et Ormonth,

Merci de cette information (variables et portabilité), je suis bon pour revoir quelques macros ^^.
Par contre si nous sommes sûrs que le fichier ne dépassera jamais les 10000 lignes, peut-on garder l'integer?

Pour le départ de la 5ème ligne, il est possible comme moi de ne pas tenir compte de certaines lignes le temps du codage... Donc un "oubli" est si vite arrivé...
_______________________________________________________________
Question stupide: Où peut on poster un projet complet? avec les étapes de développement et pouvoir en parler avec des personnes?
Tweelight est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 00h09   #6
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Citation:
Envoyé par Tweelight Voir le message
Par contre si nous sommes sûrs que le fichier ne dépassera jamais les 10000 lignes, peut-on garder l'integer?
C'est surtout un problème de contexte d'utilisation et de champ d’utilisation et de devenir. il ne s'agit pas de tout reprendre, mais de prendre la bonne habitude pour dès demain et de commenter ou revoir les codes qu'on soupçonne à juste titre de pouvoir poser problème dans l'avenir du fait de leur champ d'application justement.

cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 00h16   #7
Candidat au titre de Membre du Club
 
Homme Alexandre DBQ
Ressources humaines
Inscription : août 2011
Messages : 20
Détails du profil
Informations personnelles :
Nom : Homme Alexandre DBQ
Localisation : France, Haut Rhin (Alsace)

Informations professionnelles :
Activité : Ressources humaines
Secteur : Service public

Informations forums :
Inscription : août 2011
Messages : 20
Points : 12
Points : 12
Citation:
Envoyé par Ormonth Voir le message
il ne s'agit pas de tout reprendre
Ouf de soulagement.
Citation:
Envoyé par Ormonth Voir le message
mais de prendre la bonne habitude pour dès demain et de commenter ou revoir les codes qu'on soupçonne à juste titre de pouvoir poser problème dans l'avenir du fait de leur champ d'application justement.
Didier
Pourtant sur le Tuto de SilkyRoad, il ne parle pas de ce problème à venir... Surtout que l'on entend (lit) encore que de la définition du type de variable dépendra le temps de calcul et d'utilisation de cycle machine pour la programmation. Et quand tu as "obligation" d'utiliser Excel (tu rajoute de ta propre initiative le VBA) pour traiter un listing de 5.000 à 10.000 lignes (de A à H). Tu prie pour la mémoire...

Par contre, je ne sais pas si je peux ouvrir un fil pour un projet un peu lourd. J'ai déjà commencer à en parler dans deux sujets créés par mes soins, mais j'aimerai pouvoir faire un gros fil de discussion. Je ne trouve pas d'endroit pour poster des projets.

Enfin j'aimerai une aide pour simplifier le code car je ne vois pas forcément où je peux tailler à la hache dans le code.
Tweelight est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 00h39   #8
Rédacteur
 
Avatar de Ormonth
 
Homme Didier GONARD
Formateur Développeur Office - indépendant
Inscription : février 2008
Messages : 2 353
Détails du profil
Informations personnelles :
Nom : Homme Didier GONARD
Localisation : France, Loire Atlantique (Pays de la Loire)

Informations professionnelles :
Activité : Formateur Développeur Office - indépendant

Informations forums :
Inscription : février 2008
Messages : 2 353
Points : 4 682
Points : 4 682
Citation:
Envoyé par Tweelight Voir le message

Par contre, je ne sais pas si je peux ouvrir un fil pour un projet un peu lourd. J'ai déjà commencer à en parler dans deux sujets créés par mes soins, mais j'aimerai pouvoir faire un gros fil de discussion. Je ne trouve pas d'endroit pour poster des projets.
Il existe le forum Conception en sous forum Excel.

Mais il faut bien comprendre que nous sommes sur un forum d'entraide et pas sur un truc genre peut-on faire mon boulot

Donc non, on ne peut pas poster un code très long en demandant de faire le ménage ni une solution "clef en main".

Par contre en consultant les FAQ et Tutoriels, on apprendra à faire tout ça et on revient sur le forum sur des points précis et argumentés quand ça coince...

cf entre autres :
Programmer efficacement avec Excel en VBA
44 pages :

http://bidou.developpez.com/article/VBA/
233 pages :


cordialement,

Didier
__________________
Didier Gonard

Ps :
Pour noter positivement ou négativement un post, vous pouvez cliquer sur les pouces en bas à droite !
Tutoriels : Voir la liste de mes tutoriels et mon site pro sur ma Page DVP
N'oubliez pas de mettre : ..quand c'est le cas !
Ormonth est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 17/08/2011, 11h07   #9
Invité de passage
 
Homme
Ingé
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Citation:
Envoyé par Tweelight Voir le message
Bonjour,

Pour trouver la dernière ligne ayant un enregistrement tu peux utiliser:
Code :
1
2
3
 
dim NBline as integer
NBLine = Worksheets("nomdelafeuille").Range("A1").End(xlDown).Row
Bah ça reviens à ce que j'ai fait avec ma variable DerniereLigneFeuille1

De quelle création? de la mise à jour (saisie sur cette ligne) ou la dernière sauvegarde?
Code :
Worksheets("nomdelafeuille").range("B4").value = Now
si je ne me trompe pas...
La date de création du fichier ouvert mais ça je devrais y arriver avec openFile.DateCreated

Citation:
Envoyé par bbil Voir le message
attention avec ce code seul Ligne courante et un long, DernierLigneFeuille1 est un variant , en VB lors des déclaration il faut répéter le type pour chaque variables : XIII. Déclaration de variables , même chose pour tes autres déclarations .
oki
ensuite tu utilise DernierLigneFeuille1 pour calculer la première ligne libre mais ensuite tu utilise LigneCourante que tu n'as pas calculé !

Bon j'ai supprimé ligne courante, par contre le but de DerniereLigneFeuille1 est de me renvoyer le numéro de la dernière ligne de mon tableau par la première !

@Tweelight : Les variables LigneCourante et DernierLigneFeuille1 doivent être des long car maintenant un classeur peu avoir plus de 65535 lignes.


si les lignes 1 à 4 sont vide il faut partir de la 5° ligne !

C'est tout à fait ça, utilisé pour les titres de mon tableau
Bon alors voilà mon nouveau code et j'ai une erreur d'execution '424' sur le worbook.open

Code :
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
 
Private Sub Workbook_Open()
 
Dim Repertoire As String, Fichier As String
Dim Ligne As Long
Dim CLe As Workbook, CLs As Workbook
Dim FLe As Worksheet, FLs As Worksheet
Dim DerniereLigneFeuille1 As Long
 
Application.ScreenUpdating = False 'suppresion des messages d actualisation
Application.DisplayAlerts = False
Application.AskToUpdateLinks = False 'décoche la confirmation auto des liens
 
    Set CLe = ThisWorkbook
    Set FLe = CLe.Worksheets("Feuille1")
 
Repertoire = "monchemin\quilestbeau\"
Fichier = Dir(Repertoire & "monfichieraouvrir.xls")
 
    Set CLs = Workbooks.Open(Repertoire & Fichier)
    Set FLs = CLs.Worksheets("Feuille1")
 
    DerniereLigneFeuille1 = FLs.Range("A5").End(xlDown).Row
 
    If FLe.Cells(2, 2).Value = "" Then
 
       FLs.Range("A" & DerniereLigneFeuille1).Copy = FLe.Cells(2, 2)
 
    End If
 
End Sub
christoff916 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 11h14   #10
Responsable Visual Basic
 
Avatar de bbil
 
Inscription : juin 2003
Messages : 11 773
Détails du profil
Informations personnelles :
Âge : 45
Localisation : France, Ariège (Midi Pyrénées)

Informations forums :
Inscription : juin 2003
Messages : 11 773
Points : 16 847
Points : 16 847
Envoyer un message via Skype™ à bbil
est-tu sur de tes répertoire ...:
Ajoute ces quelques lignes:
Code :
1
2
3
4
5
6
7
8
 
(..)
Fichier = Dir(Repertoire & "monfichieraouvrir.xls")
if Fichier = "" then 
   MsgBox "Fichier Inexistant !!"
   exit sub
endif
(...)
bbil est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 17/08/2011, 14h22   #11
Invité de passage
 
Homme
Ingé
Inscription : juillet 2011
Messages : 16
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

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

Informations forums :
Inscription : juillet 2011
Messages : 16
Points : 4
Points : 4
Raaaaaa il me met fichier inexistant, pourtant j'ai essayer de le déplacer pour avoir un chemin plus simple, j'ai copier le nom du fichier pour être sur le l'orthographe mais rien ni fait sinon pour moi mon code devrait fonctionner?
christoff916 est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h43.


 
 
 
 
Partenaires

Hébergement Web