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 :

Problème .End(xlUp) dans un module [XL-2016]


Sujet :

Macros et VBA Excel

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 35
    Par défaut Problème .End(xlUp) dans un module
    bonjour,
    je suis débutant en ce qui concerne VBA, j'ai pour but de faciliter l'entrée de données dans un tableau de frais de déplacement sur excel.

    J'ai donc un tableau avec plusieurs montant a renseigner, ces montantSvont permettre de savoir si la personne a dépasser ou non un plafond maximum (colonne G, plage (G7;G29).pour renseigner ces montants La personne doit appuyer sur un bouton "nouveau déplacement".ce bouton lance donc un userform (userform6) qui permet la saisie des montants, l'userform envoie les données dans le tableau lorsque que l'on appuis sur le bouton valider.

    Cependant je veux que lorsque la ligne de montants est saisie, un module (module 4) vérifie si le plafond dans la colonne G a été dépassé ( valeur colonne G >0) ou si il n'a pas été dépassé (valeur colonne G = 0). Si le plafond n'a pas été dépassé alors un userform s'affiche pour demander si l'on veut enregistrer un autre déplacement ( userform9) alors que si le plafond a été dépassé la cellule se colore en rouge et un userform s'affiche pour alerter la personne ( userform7).



    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub plafond()
     
     If Range("G29").End(xlUp) = 0 Then
     
    UserForm9.Show
         Else
      Range("G29").End(xlUp).Interior.ColorIndex = 4
    UserForm7.Show
         End If
     
    End Sub
    Je veux que le module fasse la vérification sur la dernière cellule remplie de la colonne G du tableau ainsi c'est toujours la dernière saisie qui est vérifié d'ou l'utilisation de .end(lUp) dans mon code

    Enfaite mon problème c'est que ce code marche dans une colonne normale ou les valeurs des cellules ne provienne pas de formule. les valeurs de ma colonne G sont calculé avec une formule. le code ne fonctionne pas sur cette colonne comme si le End(Xlup) considérait que les cellules qui contiennent une valeur grâce a une formule sont des cellules vides.

  2. #2
    Expert confirmé
    Avatar de kiki29
    Homme Profil pro
    ex Observeur CGG / Analyste prog.
    Inscrit en
    Juin 2006
    Messages
    6 132
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : ex Observeur CGG / Analyste prog.

    Informations forums :
    Inscription : Juin 2006
    Messages : 6 132
    Par défaut
    Salut, pb de syntaxe entre autres, commence par lire : Dernière ligne et la dernière colonne renseignées d'une feuille

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 35
    Par défaut
    Je vais essayer de trouver ou est mon erreur, mais ce que je comprend pas c'est que ce code marche sur une autre colonne avec des cellules sans formule...

  4. #4
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Cela devrait fonctionner pour toi.

    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
    Sub plafond()
     
    Dim n As Integer
     
    n = Range("G" & Rows.Count).End(xlUp).Row
     
     If Range("G" & n) = 0 Then
     
    UserForm9.Show
         Else
      Range("G" & n).Interior.ColorIndex = 4
    UserForm7.Show
         End If
     
     
    End Sub

  5. #5
    Expert confirmé
    Homme Profil pro
    aucune
    Inscrit en
    Avril 2016
    Messages
    7 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 83
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : aucune

    Informations forums :
    Inscription : Avril 2016
    Messages : 7 563
    Par défaut
    Bonjour,
    Je n'aime pas cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("G29").End(xlUp) = 0 Then
    qui, ne précisant pas la propriété, est subordonnée à la bonne volonté de VBA (souvent gentil, mais ...)
    Il faut préciser la propriété. Un objet range est doté de deux propriétés à utiliser pour se référer à son contenu : la propriété Value et la propriété text.
    Dans ton cas (formules présentes), je préfèrerais personnellement utiliser la propriété Text :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("G29").End(xlUp).text = "0" Then
    Mais même ainsi, on pourrait être confronté à des problèmes en cas de formules mal construites. Et comme on ignore tes formules ...

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 35
    Par défaut
    Citation Envoyé par Kiouane Voir le message
    Cela devrait fonctionner pour toi.

    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
    Sub plafond()
     
    Dim n As Integer
     
    n = Range("G" & Rows.Count).End(xlUp).Row
     
     If Range("G" & n) = 0 Then
     
    UserForm9.Show
         Else
      Range("G" & n).Interior.ColorIndex = 4
    UserForm7.Show
         End If
     
     
    End Sub
    Nan ca ne marche pas...

  7. #7
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Tu peux nous en dire plus sur ta formule? et aussi me dire sur quelle ligne ça bloque?

  8. #8
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 35
    Par défaut
    Citation Envoyé par unparia Voir le message
    Bonjour,
    Je n'aime pas cette ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("G29").End(xlUp) = 0 Then
    qui, ne précisant pas la propriété, est subordonnée à la bonne volonté de VBA (souvent gentil, mais ...)
    Il faut préciser la propriété. Un objet range est doté de deux propriétés à utiliser pour se référer à son contenu : la propriété Value et la propriété text.
    Dans ton cas (formules présentes), je préfèrerais personnellement utiliser la propriété Text :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Range("G29").End(xlUp).text = "0" Then
    Mais même ainsi, on pourrait être confronté à des problèmes en cas de formules mal construites. Et comme on ignore tes formules ...
    la formule présente dans la colonne G est =SI(ET(H14="";I14="";J14="";K14="";L14="";M14="");"";SOMME(H14:M14))

  9. #9
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Si j'ai bien compris dans ta plage (G7:G27) tu as cette formule et tu veux faire ce test sur la dernière cellule non vide. Mais avec le end(xlup) il va toujours te retourner la cellule("G27"). Je te propose plutôt de faire un test sur les cellules. Je ne sais pas si j'ai bien compris.

  10. #10
    Membre Expert
    Avatar de pijaku
    Homme Profil pro
    Inscrit en
    Août 2010
    Messages
    1 817
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Nord (Nord Pas de Calais)

    Informations forums :
    Inscription : Août 2010
    Messages : 1 817
    Billets dans le blog
    10
    Par défaut
    Bonjour à tous,

    Regarde ce test basé sur la méthode find avec le paramètre xlValues :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub test()
    Dim L As Integer
    L = derlig_reelle(Range("G7:G27"))
    Debug.Print L
    End Sub
     
    Private Function derlig_reelle(plage As Range) As Long
       'cas d'absence de données dans la plage à traiter :
       If WorksheetFunction.CountA(plage) = 0 Then derlig_reelle = 1: Exit Function
       'dans tous les autres cas :
       derlig_reelle = plage.Find("*", , xlValues, , , xlPrevious).Row
    End Function

  11. #11
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Je ne sais pas si j'ai bien compris ou si je le fais bien mais en tout cas voilà ma petite contribution.


    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
    Sub plafond()
     
    For i = 27 To 7 Step -1
     
    If Cells(i, 7).Value <> "" Then
     
           If Cells(i, 7).Value = 0 Then
               UserForm9.Show
           Else
              Cells(i, 7).Interior.ColorIndex = 4
              UserForm9.Show
           End If
           Exit For
     
    End If
     
    Next i 
     
    End Sub

  12. #12
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 35
    Par défaut
    Citation Envoyé par Kiouane Voir le message
    Je ne sais pas si j'ai bien compris ou si je le fais bien mais en tout cas voilà ma petite contribution.


    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
    Sub plafond()
     
     
     
    For i = 27 To 7 Step -1
     
    If Cells(i, 7).Value <> "" Then
     
     If Cells(i, 7).Value = 0 Then
      UserForm9.Show
         Else
      Cells(i, 7).Interior.ColorIndex = 4
      UserForm9.Show
         End If
     Exit For
    End If
     
    Next i
     
     
     
    End Sub
    Ca marche ! merci beaucoup ! Bon je dois t'avouer que j'ai du mal a comprendre le code mais ca marche c'est le principal !!

  13. #13
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Tu peux marquer la discussion comme résolue. Et un petit pouce vert pour mon intervention m'encouragerait. ^^

    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
    Sub plafond()
     
     
     
    For i = 27 To 7 Step -1 'On commence par la dernière ligne et on remonte jusqu'à la première ligne de ta plage
     
    If Cells(i, 7).Value <> "" Then ' On vérifie s'il y a ou non un calcul qui s'est fait sur la ligne. Si oui, on lance ta procédure.
     
     If Cells(i, 7).Value = 0 Then 
      UserForm9.Show
         Else
      Cells(i, 7).Interior.ColorIndex = 4
      UserForm9.Show
         End If
     Exit For 'On sort de la boucle une fois ta procédure réalisée pour éviter de le faire pour toutes les lignes 
    End If
     
    Next i
     
     
     
    End Sub

  14. #14
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 35
    Par défaut
    Comment ca se fait que la lettre de ma colonne n'apparait nul part dans le code ? comment le code prend en compte la bonne colonne ?

  15. #15
    Membre chevronné Avatar de Kiouane
    Homme Profil pro
    Étudiant
    Inscrit en
    Avril 2016
    Messages
    198
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2016
    Messages : 198
    Par défaut
    Cells(x,y) ===> x pour le numéro de ligne, y pour le numéro de colonne

  16. #16
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 35
    Par défaut
    AH oui d'accord c'est plus clair ! Merci pour ton aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 25/08/2009, 15h17
  2. Problème de variables dans un module
    Par "Rone" dans le forum Macros et VBA Excel
    Réponses: 17
    Dernier message: 14/10/2008, 11h46
  3. Problème d'indexage dans une boucle FOR-END
    Par RAMZOON dans le forum MATLAB
    Réponses: 3
    Dernier message: 19/10/2007, 00h59
  4. problème d'écriture dans un module
    Par sebac dans le forum IHM
    Réponses: 2
    Dernier message: 05/07/2007, 17h10
  5. Réponses: 5
    Dernier message: 23/05/2007, 17h48

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