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 :

message d'erreur: l'objet ne supporte pas cette propriété ou cette méthode


Sujet :

Macros et VBA Excel

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut message d'erreur: l'objet ne supporte pas cette propriété ou cette méthode
    Bonsoir à tous,

    il s'agit de ma première tentative de création d'un programme sous vba (j'avais déjà vu turbo pascal mais bon, c'est pas le même principe de programmation).

    Description des données de base :

    Je dispose dans la colonne A d'une feuille excel de noms, séparés par des cellules vides.

    Par exemple,

    cellule A1 : maison
    plage (A2:A10) : vide
    cellule A11 : verte
    plage (A12:A14) : vide

    Le but du programme est de remplir les cellules vides avec le nom précédent. Par exemple, le programme doit ici remplir la plage (A2:A10) avec "maison" et la plage (A12:A14) avec "verte".


    j'ai déjà le code suivant, mais je bloque maintenant

    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
    Sub frt()
     
    Dim i As Long
     
        For i = 2 To 65936
     
    'initialisation de la boucle
     
        Cells(i, 1).Activate
            Do While ActiveCell.Value <> Empty
     
    'définition de la condition dans mon idée tant que la cellule parcourue est vide alors
    'le programme fait un copier/coller.
            Cells(i - 1, 1).Copy
            Selection.Copy
            cells(i, 1).Paste
            Selection.Paste
            If ActiveCell.Value.false <> Empty Then Exit Do
    'si le programme rencontre une cellule pleine, alors il sort de la boucle do et change de i
           Loop
     
        Next i
     
    End Sub
    Je ne comprends pas pourquoi je ne peux pas faire de copier/coller sur une cellule.

    A mon avis, ce ne doit pas être la seule erreur, mais la programmation ce n'est pas ce que j'ai le plus étudié pendant ma scolarité...je m'y remet maintenant.

    Bonne soirée et merci d'avance pour vos observations.

  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,

    Tout d’abord, 2 conseils :

    • Évite autant que possible les Copier/Coller. En général utiliser les propriétés de l’objet Range, quitte à les stocker dans une variable est plus rapide.
    • De même Activate et Select sont à éviter le plus souvent. Utilise des variables objets pour faire référence à un classeur, une feuille, une plage de cellules, ... et lis ou modifie les propriétés en utilisant la variable correspondante.


    C’est ce qui est fait ici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Remplissage()
    Dim c As Range, TexteRef
            With ActiveSheet
                    For Each c In Intersect(.UsedRange, .Range("A:A"))
                            If c <> "" Then
                                TexteRef = c
                            Else
                                c = TexteRef
                            End If
                    Next
            End With
    End Sub
    c est une variable objet, qui dans la boucle va successivement faire référence à toutes les cellules concernées en colonne A.

    UsedRange permet de se limiter à la zone utilisée de la feuille : inutile de passer + 60 000 fois dans la boucle si 50 lignes sont à traiter !

    Cordialement,

    Michel Gaboly

  3. #3
    Candidat au Club
    Inscrit en
    Décembre 2007
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2007
    Messages : 2
    Par défaut merci quelques questions
    merci, c'est ce que voulais obtenir


    Utilise des variables objets pour faire référence à un classeur, une feuille, une plage de cellules
    j'ai bien compris que le vba est orienté objet, mais c'est encore un peu flou: une cellule, une plage de cellules.. sont elles des objets à la base, ou bien est-il préférable de déclarer au début les objets que l'on va utiliser?

    et lis ou modifie les propriétés en utilisant la variable correspondante.
    si j'ai bien compris, les propriétés sont les "caractéristiques" de l'objet (ici les propriétés de c seraient donc "ce sont les cellules de la colonne A"?)

    merci encore

    jean2c

  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
    Rebonsoir,

    Une plage de cellule est un objet Range. Une cellule est un cas particulier d’objet Range.

    Tu peux écrire

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    MsgBox Range("A1:A10").Rows.Count
    ou affecter une variable à la plage concernée et utiliser ensuite la variable :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Dim Ref as Range
        Set Ref = Range("A1:A10")
        MsgBox Range("A1:A10").Rows.Count
    Les 2 sont équivalents, et font référence à la plage A1:A10 de la feuille active. Cependant, si en cours de traitement, la feuille en question (également un objet, en l’occurrence accessible avec la propriété Parent de l’objet Range) cesse d’être la feuille active, la variable fera toujours référence à la même plage, tandis que Range("A1:A10") fera référence à une plage de la nouvelle feuille active.

    Tu peux le vérifier ainsi :

    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
    Sub Macro1()
    Dim Ref As Range
        ' Création dun nouveau classeur
        Workbooks.Add
        ' Affecttion d'un objet, la cellule "A1" (de la feuille active, sauf
        ' indication contraire qui doit être explicite) à la variable objet "Ref"
        Set Ref = ActiveCell
        ' Entrée de la valleur 12 en A1
        ActiveCell.FormulaR1C1 = "12"
        ' Affichage d'un message indiquant sur 2 lignes, les valeurs de la cellule A1 et de "Ref".
        ' Les 2 valeurs sont identiques, égales à 12
        MsgBox "Cellule A1 : " & Range("A1") & vbNewLine & "Ref : " & Ref
        ' Ajout dune feuille au classeur
        Sheets.Add
        ' Affichage d'un message indiquant sur 2 lignes, les valeurs de la cellule A1 et de "Ref".
        ' Les 2 valeurs sont différentes, rien pour la cellule A1, car il s'agit par défaut de la
        ' cellule A1 de la feuille active, tandis que Ref a toujours 12 comme valeur, car rien n'a
        ' modifié la plahe associée à la "Ref".
        MsgBox "Cellule A1 : " & Range("A1") & vbNewLine & "Ref : " & Ref
    End Sub
    Si tu dois faire référence à une plage située dans une feuille d’un classeur qui n’est pas forcément le classeur actif, cela vaut clairement la peine de lui associer une variable, le code sera plus concis.

    De manière générale, plus ce que tu fais est complexe, et plus il est fait fréquemment référence à un objet particulier au cours du traitement, plus il est justifié de lui affecter une variable.

    NB - Pour affecter un objet à une variable, il faut utiliser le mot "Set" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Ref As Range
        Set Ref = ActiveCell
    alors que pour une variable non objet le signe égale suffit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim Nb As Integer
        Nb = 100
    Il y a une exception : avec une boucle For Each ... Next, "Set" n’est pas employé :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Remplissage()
    Dim c As Range, TexteRef 
            With ActiveSheet
                    For Each c In Intersect(.UsedRange, .Range("A:A"))
                            '...
                    Next
            End With
    End Sub
    Ici c est un objet Range, en l’occurrence une cellule, qui va prendre comme affectation chaque cellule de la plage indiquée (l'Intersection de la zone utilisée dans la feuille avec la colonne A), successivement.


    Citation Envoyé par jean2c Voir le message
    merci, c'est ce que voulais obtenir

    j'ai bien compris que le vba est orienté objet, mais c'est encore un peu flou: une cellule, une plage de cellules.. sont elles des objets à la base, ou bien est-il préférable de déclarer au début les objets que l'on va utiliser?
    Les cellules de la colonne A sont des objets Range. Les propriétés d’un objet sont ses caractéristiques, que tu peux lire et éventuellement modifier

    Par exemple "ColumnWidth" correspond à la largeur de la colonne à laquelle appartient la cellule active.

    Dans certains cas, une propriété peut renvoyer un objet ou une collection d’objets :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ActiveWorkBook.Sheets(1)
    La propriété Sheets renvoie la collection des feuilles du classeur actif. Sheets(1) renvoie un objet, la première feuille de cette collection.

    Il te reste à expérimenter, et à regarder quelques sites consacrés à Excel et VBA, celui-ci, le mien, d’autres encore.

    Cordialement,

    Michel Gaboly

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

Discussions similaires

  1. Réponses: 0
    Dernier message: 20/06/2013, 16h57
  2. Réponses: 2
    Dernier message: 20/02/2013, 14h32
  3. Message d'erreur "https is not supported"
    Par nono08 dans le forum Web
    Réponses: 5
    Dernier message: 04/04/2006, 14h10
  4. Réponses: 2
    Dernier message: 07/09/2005, 09h55
  5. Réponses: 6
    Dernier message: 03/09/2003, 10h29

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