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 :

Trouver les erreurs [XL-2007]


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 87
    Par défaut Trouver les erreurs
    Bonjour,

    Voici un fichier simplifié. L'userform sert à "écrire" dans le tableau contenu dans Sheets("Suivi déchets NON DANGEREUX"). Pour activer l'userform, il faut cliquer sur "Ajouter une benne".

    http://dl.free.fr/getfile.pl?file=/xsgGB3rI

    J'ai 2 problèmes:

    1. Dans le code de l'userform:

    Je veux remplacer 30000 par la derniere ligne remplie
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DerniereLigne = Range("A65536").End(xlUp).Row
    Le problème est que lorsque je fais ça il me met une erreur quelques lignes plus bas à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Range("A" & l).Value = TextBox1.Value
    .

    2. Toujours dans le code de l'userfom, je souhaite trier les résultats par nom puis par année puis par mois puis par jour.
    Le problème est qu'il ne comprend pas que la colonne mois est une date et il trie par ordre alphabétique donc ça ne va pas.


    Je vous remercie d'avance énormément. Le temps joue contre moi, et votre coup de main représente vraiment beaucoup.
    Merci pour vos futures réponses.

  2. #2
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Pour la 3ème question
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Suivi déchets NON DANGEREUX").Columns("K:K").Hidden = CheckBox1.value
    sur OnClick du CheckBox1

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 87
    Par défaut
    Merci

  4. #4
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    1. Modification
    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
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    'Clic sur OK
    Private Sub CommandButton1_Click()
     
    Dim sht As Worksheet
    Dim DerniereLigne As Long
     
        If TextBox1 = "" Or TextBox2 = "" Or TextBox3 = "" Or ComboBox1.ListIndex < 0 Or ComboBox2.ListIndex < 0 Or ComboBox3.ListIndex < 0 Or ComboBox4.ListIndex < 0 Or ComboBox5.ListIndex < 0 Then
            MsgBox "Les champs disposant d'un astérix sont obligatoires."
            Unload Me
            Exit Sub
        End If
     
    Set sht = Sheets("Suivi déchets NON DANGEREUX")
    With sht
        DerniereLigne = .Range("A65536").End(xlUp).Row + 1
     
        .Range("A" & DerniereLigne).Value = TextBox1.Value
        .Range("B" & DerniereLigne).Value = ComboBox1.Value
        .Range("C" & DerniereLigne).Value = TextBox2.Value
        .Range("D" & DerniereLigne).Value = ComboBox2.Value
        .Range("E" & DerniereLigne).Value = ComboBox3.Value
        .Range("F" & DerniereLigne).Value = ComboBox4.Value
        .Range("G" & DerniereLigne).Value = TextBox3.Value
        .Range("H" & DerniereLigne).Value = ComboBox5.Value
        .Range("I" & DerniereLigne).Value = TextBox4.Value
        .Range("J" & DerniereLigne).Value = TextBox5.Value
        .Range("K" & DerniereLigne).Value = TextBox6.Value
        .Range("L" & DerniereLigne).Value = IIf(CheckBox1, "OUI", "")
        .Range("M" & DerniereLigne).Value = TextBox7.Value
        .Range("N" & DerniereLigne).Value = TextBox8.Value
     
    End With
     
    'Classement des données par nom puis par mois puis par jour
         Dim maplage As Variant
              Set maplage = ActiveSheet.Range("A11" & ":S30000")
             maplage.Select
        With Selection
             .Sort key1:=ActiveSheet.Range("A11"), order1:=xlAscending, key2:=ActiveSheet.Range("F11"), order2:=xlAscending, key3:=ActiveSheet.Range("E11"), order3:=xlAscending, Header:=xlNo, Orientation:=xlSortColumns
        End With
     
    'Fermeture de la fenêtre
    sht.Protect
    Set sht = Nothing
    Unload Me
    End Sub
    Je n'ai pas touché au tri

  5. #5
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Pour le tri:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    'Classement des données par nom puis par mois puis par jour
              Set maplage = .Range("A11" & ":O" & DerniereLigne)  'Pourquoi tu as ici la Colonne S?
    End With
     
        With maplage
             .Sort key1:=ActiveSheet.Range("A11"), order1:=xlAscending, _
                 key2:=ActiveSheet.Range("F11"), order2:=xlAscending, _
                 key3:=ActiveSheet.Range("O11"), order3:=xlAscending, Header:=xlNo, _
                 Orientation:=xlSortColumns  'Dans la Colonne O seraient les N° des mois
        End With
    Sur les mois, je te conseille de faire cela dans ton userform par liste de choix à 2 colonnes! dont la première colonne le n° du mois (à cacher).
    Dans ta colonne O, tu insère le n° de mois, tu tri, et tu supprime la colonne

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 103
    Par défaut
    Bonjour,

    Sur la dernière ligne remplie :
    Si le tableau est rempli en continu à partir de la ligne 1.
    Si ce code ne sert pas aujourd'hui il pourra servir plus tard.
    Voir l'aide concernant Application.WorksheetFunction pour les détail.
    Application.WorksheetFunction utilise le résultat des fonction de feuille de calcul excel comme si c'était une formule...
    (A propos, sous XL2007, 65536 n'est pas la limite !)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Public Sub JMPSSub_Count()
     
    'Nombre de cellules non vides dans la colonne A
    NBUsed = JMPSFunction_Count("notempty", Range("A:A"))
     
    'Dernière ligne utilisée
    LastRow = NBUsed
    End Sub
    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
    Public Function JMPSFunction_Count(What As String, Where As Range)
    'Cette fonction compte le nombre de cellules d'une plage correspondant au critère indiqué
     
    What = UCase(What)
     
        Select Case What
     
            Case UCase("NotEmpty")
            'NotEmpty : Cellules non vides
            JMPSFunction_Count = Application.WorksheetFunction.CountA(Where)
     
            Case UCase("Empty")
            'Empty : Cellules vides
            JMPSFunction_Count = Where.Cells.Count - Application.WorksheetFunction.CountA(Where)
     
            Case UCase("Cells")
            'Cells : Nombre de cellules
            JMPSFunction_Count = Where.Cells.Count
     
        End Select
     
    End Function
    Sur le trie multicolonne :
    Exemple
    Colonne 1 = chiffres
    Colonne 2 = lettres
    Colonne 3 = date
    Colonne 4 = chiffres

    Quand je suis coincé comme ça, je créé une colonne de référence où

    Colonne 5 = Colonne1 & Colonne2 & format(Colonne 3,"000000") & Colonne 4

    L'utilisation de Format pour la date va concatener la date sous forme de nombre décimal à 6 positions avec des zéro devant pour contourner le problème du traitement des nombres comme du texte.

    Pour le code de trie "enregistrement macro" devrait pouvoir le fournir mieux que moi.

    Sur la checkbox

  7. #7
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 103
    Par défaut
    La dernière ligne visible dans une colonne filtrée
    (le code original n'est pas de moi)

    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
    Public Function JMPSFunction_FindLastVisible(Optional First As String = Empty) As String
    'Dernière ligne visible de la sélection
    'First est l'adresse STRING de la première cellule
    Dim MRange As Range
     
    If IsEmpty(First) Then Set MRange = Range("$A$1")
    Set MRange = Range(First)
     
    X = StrReverse(MRange.CurrentRegion.SpecialCells(xlCellTypeVisible).Address)
    JMPSFunction_FindLastVisible = StrReverse(Left(X, InStr(1, X, "$") - 1))
     
     
     
    'Fonction affichant l'adresse complète de la cellue
    'Sub zzz2()
    'x StrReverse(Range("A1").CurrentRegion.SpecialCells(xlCellTypeVisible).Address)
    'y = """" & x & """"
    'MsgBox StrReverse(Left(x, Evaluate("find(""$""," & y & ",find(""$""," & y &")+1)")))
    'End Sub
     
    End Function

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 87
    Par défaut Tri résolu
    Pour le tri, j'ai résolu le problème en utilisant l'idée de JMPS.VBA.

    Par contre, il me reste toujours le pb de la checkbox et un nouveau pb, celui d'un message d'avertissement "Dépassement de capacité".

    J'envoie un fichier plus propre bientôt pour que vous puissiez y jeter un oeil.

  9. #9
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Sheets("Suivi déchets NON DANGEREUX").Columns("K:K").Hidden = Not CheckBox1.value
    Si Tu as essayé ou testé mon dernier message d'hier?

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 87
    Par défaut
    Merci.

    Oui j'ai essayé le code que tu m'as envoyé hier.
    Au final, je me suis inspirée de ça et de l'idée de JMPS.VBA pour que ça fonctionne.

    Pour le problème du dépassement de capacité, j'ai vu que tu avais résolu un pb la dessus donc je vais essayer de comprendre et si je n'y arrrive pas je retourne vers toi.

    Enfin pour le format, pour dire que je veux que les cellules soient bordées, je vais chercher, mais si jamais tu as la réponse, n'hésite pas!

    Merci mille fois pour ton aide, j'étais vraiment désespérée avec cette histoire de tri, ça faisait un bon moment que j'étais dessus.

    Pb résolu!

    Merci!!!

  11. #11
    Expert éminent Avatar de mercatog
    Homme Profil pro
    Inscrit en
    Juillet 2008
    Messages
    9 435
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Autre

    Informations forums :
    Inscription : Juillet 2008
    Messages : 9 435
    Par défaut
    Je ne sais ta version finale de ton projet jusqu'à ici mais
    crée cette procédure dans un module public (tu peux directement l'incorporer dans ton code)
    mais j'estime que ça sera plus lisible
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Public Sub CadrerLigne(ByVal rng As Range)
     
    With rng
        .Borders(xlEdgeLeft).Weight = xlThin
        .Borders(xlEdgeRight).Weight = xlThin
        .Borders(xlEdgeTop).Weight = xlThin
        .Borders(xlEdgeBottom).Weight = xlThin
        .Borders(xlInsideVertical).Weight = xlThin
    End With
     
    End Sub
    Et dans ton code, juste après le collage de tes données issues de l'userform et avant le tri tu mets ça: (Tu encadre la plage de la dernière ligne de données ajoutée
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Set maplage=.Range("A" & DerniereLigne & ": S" & DerniereLigne)
    CadrerLigne maplage
    Set maplage=Nothing
    Si directement alors toujours juste après le collage de tes données issues de l'userform et avant le tri
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    With .Range("A" & DerniereLigne & ": S" & DerniereLigne)
        .Borders(xlEdgeLeft).Weight = xlThin
        .Borders(xlEdgeRight).Weight = xlThin
        .Borders(xlEdgeTop).Weight = xlThin
        .Borders(xlEdgeBottom).Weight = xlThin
        .Borders(xlInsideVertical).Weight = xlThin
    End With
    Bon courage

    le problème du dépassement de capacité
    Où survient cela??

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2009
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2009
    Messages : 87
    Par défaut dépassement de capacité
    Voici le fichier: http://dl.free.fr/getfile.pl?file=/XcDkxvPv

    Le dépassement de capacité intervient quand je clique sur le bouton Suivi déchets NON DANGEREUX dans l'onglet Accueil.

    Ce dépassement n'existait pas avant que je fasse les modifs d'hier soir. Donc je pense que c'est dû à quelque chose dans le code de l'userform.

    Merci

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 25/02/2015, 18h53
  2. Erreur pour trouver les librairies
    Par Milamber77 dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 28/11/2009, 18h34
  3. Gestion des erreurs : ou trouver les erreurs possibles pour une opération
    Par Godzestla dans le forum Macros et VBA Excel
    Réponses: 8
    Dernier message: 27/10/2008, 14h33
  4. Réponses: 3
    Dernier message: 21/05/2008, 16h37
  5. [Débutant] trouver les erreurs dans un code
    Par rouliane dans le forum C++
    Réponses: 11
    Dernier message: 26/01/2008, 12h47

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