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 :

Traiter une colonne


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut Traiter une colonne
    Bonsoir,

    Je débute en VBA pour Excel et j'ai un léger problème.

    Ma feuille se présente de la manière suivante :
    Je n'ai des informations que sur la colonne A, mais pas une information à chaque ligne.

    Je fais Outils > Macros > Visual Basic Editor
    Je double clique sur Feuil1.

    J'écris le code suivant : (assez court)
    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
    Function VaChercher(Ligne As Integer)
        Dim Index As Integer
        Index = Ligne
        Do While Range("A" & Index).Value <> ""
        Index = Index - 1
        Loop
     
        VaChercher = Index
    End Function
     
    Function VaChercherValeur(Index As Integer)
        VaChercherValeur = Range("A" & Index).Value
    End Function
     
    Sub NoManquants()
        Dim Feuille As Worksheet
        Set Feuille = Worksheets("Feuil1")
        Dim i As Integer
        i = 1
        Do While i < 13
            If Feuille.Range("A" & i).Value <> "" Then
                Dim Valeur As Integer
                Valeur = VaChercherValeur(VaChercher(i))
                Feuille.Range("B" & i).Value = Valeur
            End If
            i = i + 1
        Loop
    End Sub
    Toutefois, lorsque j'exécute dans l'éditeur, j'ai droit à un :
    La méthode 'Range' de l'objet '_Worksheet' a échoué
    Après quelques recherches, je n'ai rien trouvé d'intéressant.
    C'est pourquoi je vous sollicite afin d'obtenir des explications sur la nature du problème pour enfin faire fonctionner mon code.

    Je n'ai pas jugé nécessaire d'expliquer ce qu'est censé faire le code, mais si vous en avez besoin, je le ferai sans problème.


  2. #2
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    Bonsoir,

    Quelle version d’Excel as-tu ? J’ai créé un classeur, copié/collé ton code et je l’ai exécuté, sans avoir de message d’erreur, avec Excel 2007.

    Ceci dit, plusieurs remarques :

    1. Que veux-tu obtenir ? En face de chaque cellule non vide de la colonne A, ton programme affiche un 0. Je ne suis pas sur que ce soit le but visé.
    2. Il y a plusieurs sortes de modules où on peut écrire du code. Le module associé à une feuille est en principe destiné à gérer les événements relatifs à la feuille (Activate, Change, SelectionChange, Calculate, ...).
    3. Lorsque le code ne concerne aucun événement, il n'y a aucune raison d’écrire le code dans le module de la feuille. Utilise un module standard, que tu obtiens en l’insérant (menu Insertion de VBE, ou clic droit dans l’explorateur de projets).
    4. Regroupe tes déclarations en début de procédure : on a ainsi une vue d’ensemble des variables, et c’est plus simple à comprendre pour quelqu’un d’autre.
    5. Evite d’utiliser comme nom variable quelque chose comme Index qui est une fonction d’Excel. Cela peut conduire à de mauvaises surprises.


    S’il s’agit d’obtenir les numéros de lignes vides en colonne A,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub NumManquants()
    Dim c As Range, i As Integer
        i = 1
            With Worksheets("Feuil1")
                    For Each c In Intersect(.UsedRange, Range("A:A"))
                            If c = "" Then
                                Range("B" & i) = c.Row
                                i = i + 1
                            End If
                    Next
            End With
    End Sub
    suffit.

    Cordialement,

  3. #3
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Bonsoir et merci pour la réponse.

    Citation Envoyé par Bigalo Voir le message
    Quelle version d’Excel as-tu ? J’ai créé un classeur, copié/collé ton code et je l’ai exécuté, sans avoir de message d’erreur, avec Excel 2007.
    J'ai Excel 2003, mais cela ne devrait pas poser de problème par rapport au 2007.

    Citation Envoyé par Bigalo Voir le message
    Que veux-tu obtenir ? En face de chaque cellule non vide de la colonne A, ton programme affiche un 0. Je ne suis pas sur que ce soit le but visé.
    J'ai par exemple pour A quelque chose du genre :
    300


    301






    302
    303
    Et je voudrais la chose suivante :
    Si une case de la colonne A est vide, disons à la ligne i, alors on doit remonter jusqu'à récupérer la valeur contenue dans la dernière case de colonne A non vide (en remontant), et enfin mettre cette valeur dans la colonne B, à la ligne courante. Dans l'exemple que je t'ai donné, je voudrais avoir B2 = 300, B3 = 300, B5 jusqu'à B10 qui valent 301, etc ...

    Citation Envoyé par Bigalo Voir le message
    Il y a plusieurs sortes de modules où on peut écrire du code. Le module associé à une feuille est en principe destiné à gérer les événements relatifs à la feuille (Activate, Change, SelectionChange, Calculate, ...).
    Ici, je ne me préoccupe d'aucun évènement => je voudrais exécuter le script en allant dans Outils > Macros > je sélectionne ma macro, par exemple.

    Citation Envoyé par Bigalo Voir le message
    Lorsque le code ne concerne aucun événement, il n'y a aucune raison d’écrire le code dans le module de la feuille. Utilise un module standard, que tu obtiens en l’insérant (menu Insertion de VBE, ou clic droit dans l’explorateur de projets).
    On peut toutefois laisser le code dans le module de la feuille ? Ou bien cela ne marchera que si on le met dans un module standard ?

    Citation Envoyé par Bigalo Voir le message
    Regroupe tes déclarations en début de procédure : on a ainsi une vue d’ensemble des variables, et c’est plus simple à comprendre pour quelqu’un d’autre.
    Oui, c'est une habitude que j'ai en C++, mais là j'ai écrit ce code "à l'arrache". Merci pour la "piqûre de rappel"

    Citation Envoyé par Bigalo Voir le message
    Evite d’utiliser comme nom variable quelque chose comme Index qui est une fonction d’Excel. Cela peut conduire à de mauvaises surprises.
    C'est noté, merci.

    Citation Envoyé par Bigalo Voir le message
    S’il s’agit d’obtenir les numéros de lignes vides en colonne A,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub NumManquants()
    Dim c As Range, i As Integer
        i = 1
            With Worksheets("Feuil1")
                    For Each c In Intersect(.UsedRange, Range("A:A"))
                            If c = "" Then
                                Range("B" & i) = c.Row
                                i = i + 1
                            End If
                    Next
            End With
    End Sub
    suffit.

    Cordialement,
    Il ne s'agit pas seulement d'obtenir ces lignes, mais de rajouter dans la case B qui correspond la valeur dernière valeur rencontrée dans la colonne A.
    C'est à ceci que servent les fonctions VaChercher/VaChercherValeur.

    Qu'est-ce qui ne tourne pas rond dans mon code, donc ?

    beaucoup

  4. #4
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    De rien, je te demandais ta version, car avec 2007, je n’avais pas réussi à reproduire ton message d’erreur.

    Nul besoin de VBA pour ce que tu veux obtenir :

    en B1 :

    en B2 :

    à recopier vers le bas jusqu'à la dernière ligne "utile".

    Par ailleurs, de manière générale évite d’utiliser un module de feuille si tu ne gères pas d'événement. Il y a des limitations, en particulier pour intervenir sur d’autres feuilles.

    Si tu tiens à obtenir le résultat par VBA, voici une façon de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    Sub NumManquants()
    Dim Plage As Range, c As Range, Ref As Range
            With Worksheets("Feuil1")
                Set Plage = Intersect(.UsedRange, Range("A:A"))
                Set Ref = Plage.Cells(1, 1)
                    For Each c Plage
                            If c <> "" Then
                                Set Ref = c
                            End If
                        c.Offset(0, 1) = Ref
                    Next
            End With
    End Sub
    Quant à ton code (pas si court que tu ne prétends ), j’avais testé avec A1 vide. Dans le cas contraire, j’ai effectivement le plantage que tu signales, et cela vient de :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
        Do While Range("A" & Index).Value <> ""
            Index = Index - 1
        Loop
    Avec Index = 1, tu traites la cellule A1. Si elle n’est pas vide,

    conduit à tester la cellule "A0" qui n’existe pas


    Cordialement,

  5. #5
    Alp
    Alp est déconnecté
    Expert confirmé

    Avatar de Alp
    Homme Profil pro
    Inscrit en
    Juin 2005
    Messages
    8 575
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Juin 2005
    Messages : 8 575
    Par défaut
    Merci beaucoup. Tout cela devrait suffir

  6. #6
    Membre chevronné
    Avatar de Bigalo
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    445
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2007
    Messages : 445
    Par défaut
    De rien ;-)

    Mon premier bouquin sur les macros (c’était sur Excel 1.5 !), commençait par cette boutade : la meilleure macro, c’est de ne pas en écrire

    En clair, quand une quelque chose est déjà disponible dans Excel, pourquoi écrire du code ?

    Cordialement,

    Citation Envoyé par Alp Voir le message
    Merci beaucoup. Tout cela devrait suffir

Discussions similaires

  1. Réponses: 1
    Dernier message: 05/02/2013, 15h30
  2. [XL-2010] Traiter une liste de colonnes choisies par l'utilisateur
    Par Norore dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/03/2012, 17h55
  3. Macro pour traiter une colonne en relatif
    Par jacques64 dans le forum Macros et VBA Excel
    Réponses: 14
    Dernier message: 14/06/2007, 12h53
  4. [PostGres] Suppresion d'une colonne.
    Par Gandalf24 dans le forum Requêtes
    Réponses: 4
    Dernier message: 23/05/2003, 09h02
  5. [VB.NET] Insérer une colonne de CheckBox dans un DataGrid
    Par Manue.35 dans le forum Windows Forms
    Réponses: 2
    Dernier message: 22/05/2003, 11h44

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