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 :

Un code pourtant si simple qui ne marche pas


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Par défaut Un code pourtant si simple qui ne marche pas
    Bonjour à tous,

    J'aimerais créer une macro qui compte le nombre de cellule non vide d'une colonne sur une plage. Cependant ces cellules ne sont comptées que si la date (Se trouvant sur la même ligne) appartient a une année et un mois entré en paramètre.

    Pour le moment voici le code :
    (Il est un peu plus complet afin d'être sur que l'inputbox est bien un chiffre, mot de passe pour l'activer, etc)
    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
    47
    48
    49
    50
    51
    52
    53
    54
     
    Sub ttt_annuel
     
    Dim m As Integer
    Dim i As Integer
    Dim j As Integer
    Dim tampon
    Dim date_test
    Dim Nb_carte
    Dim Ligne_vide As Boolean
    Dim individuel(12) As String
     
    'Année en parametre
     
    date_test = InputBox("Entrer une Année sous la forme AAAA", "Quel l'année à tester?")
     
    'Nombre cartes
     
    ActiveWorkbook.Sheets("Carte").Select
    Ligne_vide = False
    Nb_carte = 6
    Do Until Ligne_vide = True
    Cells(Nb_carte, 4).Select
    If IsEmpty(ActiveCell) = True Then
    Ligne_vide = True
    Else: Nb_carte = Nb_carte + 1
    End If
     
    Loop
     
    'Remplissage nombre de individuelle par mois
    For m = 1 To 12
    tampon = 0
     
            For k = 6 To Nb_carte
    If IsEmpty(Cells(k, 9)) = True Then
    If Month(Cells(k, 6)) = m And Year(Cells(k, 6)) = date_test Then tampon = tampon + 1
    End If
            Next k
    individuel(m) = tampon
    Next m
     
    'affichage données
    Call Design
     
    ActiveSheet.Name = "Stats de l'année " & date_test
    For i = 1 To 23 Step 2
    Cells(i, 3) = individuel((i + 1) / 2)
     
    Next i
     
     
     
    End Sub
    Je suis un débutant sur VBA, j'ai trouvé beaucoup de solutions en cherchant sur ce forum et diverses autres sources, mais là cela m'échappe.
    La macro doit compter le nombre de carte dans la feuille "Carte" sur une cellule forcement pleine pour avoir le nombre de case à traiter.
    Sur cette feuille on a une date ; une case vide ou non .
    Ensuite elle doit compter le nombre d’occurrence entre "La cellule n'est pas vide" et vérifier que le mois et l'année de cette carte sont égaux à : une boucle faisant varier le mois de 1 a 12 / année demandée a l'utilisateur
    Elle enregistre ensuite dans un tableau les résultats. Et enfin elle met ce résultat sur une nouvelle feuille.

    Mon problème est que quelque soit les entrées de ma base de données le résultat est toujours 0 à l'affichage.


    J'espère avoir été clair, pour la concision je ne suis pas le meilleur.

    Merci d'avance pour votre aide.

  2. #2
    Membre Expert Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Par défaut
    Salut,

    je te propose de faire le travail sans passer par une macro : donc par une formule :
    • j'ai mis l'année à traiter en G1 (2016 par exemple),
    • le mois à traiter en G2 (05 par exemple).
    • Les dates sont dans la colonne C,
    • La colonne contenant les cellules vides à comptabiliser en colonne B.


    Et çà donne çà :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    =SOMMEPROD((ANNEE(C3:C11)=G1)*(MOIS(C3:C11)=G2)*(B3:B11=""))
    Je suis parti sur une zone qui va de la ligne 3 à la ligne 11. A toi d'adapter.
    En espérant que cela puisse t'aider.

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Par défaut
    Merci pour la rapidité de réponse. Je n'ai pas précisé que le fichier est entièrement protégé et modifiable uniquement par des macro.

    Pour plus de visibilité
    Nom : Capture d’écran 2016-05-17 à 17.55.17.png
Affichages : 332
Taille : 97,0 Ko
    Nom : Capture d’écran 2016-05-17 à 17.55.34.png
Affichages : 260
Taille : 102,3 Ko

    Du coup j'ai beaucoup de mal a imaginer une solution avec la méthode que tu propose. La base de donnée va grandir et je ne vois vraiment pas comment automatiser ce que tu proposes pour une année demandée à l'utilisateur.

  4. #4
    Membre Expert Avatar de jerome.vaussenat
    Homme Profil pro
    Formateur Bureautique
    Inscrit en
    Janvier 2011
    Messages
    1 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 56
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Formateur Bureautique
    Secteur : Enseignement

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 629
    Par défaut
    Salut,

    Voici le code modifié :

    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
    47
    48
    49
    50
    Sub ttt_annuel()
     
    Dim m As Integer
    Dim i As Integer
    Dim j As Integer
    Dim tampon
    Dim date_test
    Dim Nb_carte
    Dim Ligne_vide As Boolean
    Dim individuel(12) As String
     
    'Année en parametre
     
    date_test = CDbl(InputBox("Entrer une Année sous la forme AAAA", "Quelle est l'année à tester?"))
     
    'Nombre cartes
     
    'ActiveWorkbook.Sheets("Carte").Select
    Ligne_vide = False
    Nb_carte = 6
    Do Until Ligne_vide = True
        Cells(Nb_carte, 4).Select
        If IsEmpty(ActiveCell) = True Then
            Ligne_vide = True
        Else
            Nb_carte = Nb_carte + 1
        End If
    Loop
     
    'Remplissage nombre de individuelle par mois
    For m = 1 To 12
        tampon = 0
        For k = 6 To Nb_carte
            
            If IsEmpty(Cells(k, 9)) = True Then
                If Month(Cells(k, 6)) = m And Year(Cells(k, 6)) = date_test Then tampon = tampon + 1
            End If
        Next k
        individuel(m) = tampon
    Next m
     
    'affichage données
    'Call Design
     
    'ActiveSheet.Name = "Stats de l'année " & date_test
    For i = 1 To 12 'Step 2
        'Cells(i, 3) = individuel((i + 1) / 2)
         MsgBox individuel(i)
    Next i
    End Sub
    J'en ai profité pour modifier l'indentation sur tes boucles et test (plus de lisibilité).
    J'ai mis en commentaires certaines lignes (passage d'une feuille à l'autre, ...)
    En gros le problème vient du fait que ce que récupère dans ton input box est considéré comme un texte.
    La comparaison d'un texte avec un nombre, c'est pas top.

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2016
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2016
    Messages : 10
    Par défaut
    Merci beaucoup. Tu viens de m'enlever un sacré tronc du pied merci. A l'avenir je ferais plus attention à cela.

    J'ai juste rajouté ce qui suit a l'inputbox pour éviter les erreurs lors de la conversion si la valeur n'est pas adaptée au format
    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
     
     
    Do Until test = True
        date_test = InputBox("Entrer une Année sous la forme AAAA", "Quel l'année à tester?")
     
        If IsNumeric(date_test) = True Then
        date_test = CDbl(date_test)
        test = True
            ElseIf date_test = "" Then Exit Sub
            ElseIf date_test = " " Then MsgBox "Vous n'avez pas rentré de date"
            Else: MsgBox "Veuillez entrer une date valide SVP"
     
    End If
     
     
    Loop

    Une dernière question, j'ai testé cette méthode sur une base de donnée de 20000 entrée et ca devient vite très long. Y a-t-il des manières de procéder inconnue de moi qui permettrait de faire la même tâche de manière plus rapide ? Pas la peine de vous embêter à le coder j'apprendrais en le faisant. Juste une piste de recherche s'il vous plaît. Merci.

  6. #6
    Membre chevronné
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    473
    Détails du profil
    Informations personnelles :
    Localisation : France, Vendée (Pays de la Loire)

    Informations forums :
    Inscription : Novembre 2007
    Messages : 473
    Par défaut
    Salut,

    Un select dans une boucle ce n'est pas top ça ralentie énormément!

    Montre une feuille de départ et le résultat que tu souhaite en png!

    Une réponse un peu rapide sans testé et en enlevant le .select

    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
    47
    48
    49
    50
    Sub ttt()
     
    Dim m As Integer
    Dim i As Integer
    Dim j As Integer
    Dim tampon
    Dim date_test
    Dim Nb_carte
    Dim Ligne_vide As Boolean
    Dim individuel(12) As String
     
    'Année en parametre
     
    date_test = CDbl(InputBox("Entrer une Année sous la forme AAAA", "Quelle est l'année à tester?"))
     
    'Nombre cartes
     
    'ActiveWorkbook.Sheets("Carte").Select
    Ligne_vide = False
    Nb_carte = 6
    Do Until Ligne_vide = True
     
        If IsEmpty(Cells(Nb_carte, 4)) = True Then
            Ligne_vide = True
        Else
            Nb_carte = Nb_carte + 1
        End If
    Loop
     
    'Remplissage nombre de individuelle par mois
    For m = 1 To 12
        tampon = 0
        For k = 6 To Nb_carte
     
            If IsEmpty(Cells(k, 9)) = True Then
                If Month(Cells(k, 6)) = m And Year(Cells(k, 6)) = date_test Then tampon = tampon + 1
            End If
        Next k
        individuel(m) = tampon
    Next m
     
    'affichage données
    'Call Design
     
    'ActiveSheet.Name = "Stats de l'année " & date_test
    For i = 1 To 12 'Step 2
        'Cells(i, 3) = individuel((i + 1) / 2)
         MsgBox individuel(i)
    Next i
    End Sub
    J'ai juste rajouté ce qui suit a l'inputbox pour éviter les erreurs lors de la conversion si la valeur n'est pas adaptée au format
    à la place d'un inputbox, tu pourrais placer un Userform avec un combobox qui pourrais déjà filtrer les années déjà présentes , ça éviterais de demander une année qui n'existe pas!

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

Discussions similaires

  1. Code pourtant "correct"
    Par Amybond dans le forum Flash
    Réponses: 2
    Dernier message: 24/07/2007, 18h30
  2. Je sèche et pourtant çà parait simple
    Par zooffy dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 03/11/2006, 08h07
  3. Expression régulière pourtant toute simple
    Par Danae dans le forum Linux
    Réponses: 1
    Dernier message: 01/12/2005, 15h18
  4. Probleme très étrange mais pourtant si simple ! (Alias)
    Par Artanis dans le forum Langage SQL
    Réponses: 2
    Dernier message: 13/05/2005, 19h56

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