IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Macros et VBA Excel Discussion :

Récupérer une cellule de la dernière ligne non vide d'un tableau


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingé
    Inscrit en
    Juillet 2011
    Messages
    20
    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 : 20
    Points : 13
    Points
    13
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Août 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 39
    Points : 41
    Points
    41
    Par défaut
    Bonjour,

    Pour trouver la dernière ligne ayant un enregistrement tu peux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    dim NBline as integer
    NBLine = Worksheets("nomdelafeuille").Range("A1").End(xlDown).Row
    * 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    Worksheets("nomdelafeuille").range("B4").value = Now
    si je ne me trompe pas...

    Citation Envoyé par christoff916 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    Destination:=

  3. #3
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 !

  4. #4
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    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 :

    ... 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

  5. #5
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Août 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 39
    Points : 41
    Points
    41
    Par défaut
    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?

  6. #6
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    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

  7. #7
    Membre du Club
    Homme Profil pro
    Ressources humaines
    Inscrit en
    Août 2011
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haut Rhin (Alsace)

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

    Informations forums :
    Inscription : Août 2011
    Messages : 39
    Points : 41
    Points
    41
    Par défaut
    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.

  8. #8
    Expert éminent
    Avatar de Didier Gonard
    Homme Profil pro
    Formateur Office et développeur VBA en freelance
    Inscrit en
    Février 2008
    Messages
    2 805
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Formateur Office et développeur VBA en freelance

    Informations forums :
    Inscription : Février 2008
    Messages : 2 805
    Points : 6 699
    Points
    6 699
    Par défaut
    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

  9. #9
    Membre à l'essai
    Homme Profil pro
    Ingé
    Inscrit en
    Juillet 2011
    Messages
    20
    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 : 20
    Points : 13
    Points
    13
    Par défaut
    Citation Envoyé par Tweelight Voir le message
    Bonjour,

    Pour trouver la dernière ligne ayant un enregistrement tu peux utiliser:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  10. #10
    Expert éminent sénior


    Profil pro
    Inscrit en
    Juin 2003
    Messages
    14 008
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 14 008
    Points : 20 040
    Points
    20 040
    Par défaut
    est-tu sur de tes répertoire ...:
    Ajoute ces quelques lignes:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    (..)
    Fichier = Dir(Repertoire & "monfichieraouvrir.xls")
    if Fichier = "" then 
       MsgBox "Fichier Inexistant !!"
       exit sub
    endif
    (...)

  11. #11
    Membre à l'essai
    Homme Profil pro
    Ingé
    Inscrit en
    Juillet 2011
    Messages
    20
    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 : 20
    Points : 13
    Points
    13
    Par défaut
    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?

Discussions similaires

  1. Réponses: 6
    Dernier message: 10/03/2011, 09h37
  2. Dernière ligne non vide, dans un fichier contenant des plans.
    Par Faelucc dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 01/07/2010, 13h27
  3. Calcul de la somme d'une colonne apres la derniere ligne non vide
    Par lilp1 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 05/06/2009, 11h14
  4. Réponses: 3
    Dernier message: 13/02/2008, 10h10
  5. Ajouter des données après la dernière ligne non vide
    Par jnmab dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 14/11/2007, 10h21

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo