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 avec Range (Cells( [XL-MAC 2011]


Sujet :

Macros et VBA Excel

  1. #1
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2020
    Messages : 10
    Points : 12
    Points
    12
    Par défaut Problème avec Range (Cells(
    Bonjour,
    Je fais mes premiers pas de programmation en VBA (Excel pour Mac 2011 - Version 14.0.0). J’ai acheté le livre pour les nuls. C’est dire si je suis néophyte.
    J’ai fait un exercice. C’est une macro qui est censée sélectionner la cellule B6, en copier le contenu et, au moyen d’une boucle, le recopier dans les cellules B10:B16. À la ligne en gras, le programme bloque en affichant le message :
    « Erreur de compilation : Utilisation incorrecte de la propriété ».
    J’ai beau potasser mon bouquin, les forums et les aides en ligne, je n’y comprends rien.
    Il y a certainement quelqu’un qui me lira et qui pourra m’aider.
    D’autre part, l’application se met en Mode Arrêt suite à ce bug. Je n’ai trouvé d’autre moyen, pour en sortir, que de fermer le classeur, puis de le rouvrir.
    Merci de ne pas être trop technique. Je le répète : je suis néophyte.

    Voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Sub Macro1()
        Range("B6").Select
        Selection.Copy
        Ligne = 10
        For Ligne = 10 To 16
            Range (Cells(Ligne, 2))
            Selection.Paste
            Ligne = Ligne + 1
        Next
        ActiveWorkbook.Save
        Range("I18").Select
        ActiveWorkbook.Save
        Range("I18").Select
    End Sub
    Merci.

  2. #2
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Bonjour, Foromeurs confinés!
    J'ai testé votre code rectifié avec mon Mac excel2011 et ça marche chez moi.
    par contre, il est vital pour l'avenir de déclarer les variables. mettez Option Explicit en tête de module, ainsi, vous ne pourrez pas oublier de déclarer vos variables.
    Vous pouvez aussi choisir dans préférences/éditeur, de cocher la case "déclaration de variable obligatoire", ainsi cela deviendra obligatoire dans tous vos nouveaux documents Excel.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Option Explicit
    Sub Macro1()
    Dim Ligne as long
        Range("B6").Select
        Selection.Copy
        Ligne = 10
        For Ligne = 10 To 16
        Cells(Ligne, 2).Select
           Selection.PasteSpecial xlValue
        Next
        ActiveWorkbook.Save
        Range("I18").Select
    End Sub
    par ailleurs lorsque suite à une erreur, VBA est bloqué, vous cliquez sur le bouton Carré du menu développeur voir ci-dessous:

    Nom : Capture d’écran 2020-05-08 à 09.04.20.png
Affichages : 634
Taille : 19,3 Ko

    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  3. #3
    Membre expérimenté Avatar de Transitoire
    Homme Profil pro
    Auditeur informatique
    Inscrit en
    Décembre 2017
    Messages
    724
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 69
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Auditeur informatique

    Informations forums :
    Inscription : Décembre 2017
    Messages : 724
    Points : 1 454
    Points
    1 454
    Par défaut
    Re , vous pourriez simplifier le code voir ci-dessous, je vous ai mis des commentaires pour expliquer.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Macro2()
    Dim Ligne As Long                                                   'Déclaration de la variable Ligne
        For Ligne = 10 To 16                                            'Départ de la boucle de la ligne 10 à la ligne 16
            Cells(Ligne, 2).Value = Range("B6").Value   'Entrée de la valeur de la plage B6 dans les cellules de 10 à 16
        Next                                                             'Retour au départ de la boucle pour une nouvelle valeur.
        ActiveWorkbook.Save                                      'Sauvegarde du classeur actif
        Range("I18").Select                                         'Sélection de la plage I18.
    End Sub
    Cordialement
    On a deux vies, la deuxième commence quand on se rend compte qu'on n'en a qu'une.
    Confucius

  4. #4
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour le fil,

    Deux conseils supplémentaires :
    1. Éviter les Select inutiles
    2. Préciser la parentalité des Range & Cells

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    Sub Macro1()
    Dim Ligne As Long
      With ActiveSheet   'préférer une désignation sans ambigüité Worksheets("Feuil1")
        .Range("B6").Copy
        For Ligne = 10 To 16
          .Cells(Ligne, 2).PasteSpecial xlValue
        Next
        ActiveWorkbook.Save
        .Range("I18").Select
      End With
    End Sub


    EDIT :
    Bonjour Transitoire ,
    Avec la parentalité ça donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Sub Macro2()
    Dim Ligne As Long
      With ActiveSheet   'préférer une designation sans ambigüité Worksheets("Feuil1")
        For Ligne = 10 To 16
            .Cells(Ligne, 2).Value = .Range("B6").Value
        Next
        ActiveWorkbook.Save
        .Range("I18").Select
      End With
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  5. #5
    Expert éminent sénior Avatar de Menhir
    Homme Profil pro
    Ingénieur
    Inscrit en
    Juin 2007
    Messages
    16 037
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Finistère (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2007
    Messages : 16 037
    Points : 32 866
    Points
    32 866
    Par défaut
    Il y a de nombreuses erreurs dans ton code.

    Premièrement, si tu débutes, commence à prendre de bonnes habitudes en évitant les Select/Selection sur les cellules (Cells ou Range).
    Je sais que l'enregistreur de macro en met partout mais ce n'est pas un exemple à suivre.
    Il est préférable d'utiliser directement la référence dans la méthode ou la propriété.
    Par exemple, au lieux d'écrire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
        Range("B6").Select
        Selection.Copy
    Ecris :
    Autre bonne habitude à prendre : toujours déclarer et typer ses variable en début de code.
    Dans ton cas, la variable Ligne devrait être déclarée ainsi Dim Ligne As Long.
    Pour t'obliger à déclarer tes variables, coche "Déclaration de variables obligatoire" dans Outils > Options.
    Ca te mettra en début de code l'instruction Option Explicit qui empêche l'exécution si des variables ne sont pas déclarées.

    Ton Range (Cells(Ligne, 2)) est une sorte de pléonasme informatique. Tu demandes la cellule de la cellule.
    On met Cells à l'intérieur de Range quand on veut désigner une plage. Par exemple Range(Cells(1, 2), Cells(Ligne, 2)).
    Mais pour une seule cellule, il suffit d'écrire Cells(Ligne, 2) ou Range("B" & Ligne).

    De plus, cette ligne n'est pas une instruction, c'est juste un objet. Elle ne peut donc pas être valide par elle-même.
    Je suppose que tu as oublié de la terminer par Select, ce qui a provoqué ton bug.

    Ton Ligne = 10 avant le For ne sert à rien.
    Le For se charge d'initialiser la variable à la valeur de la borne inférieure à son premier tour.

    Le même, il ne faut pas mettre de Ligne = Ligne + 1 en fin de boucle, le Next se charge d'incrémenter la variable.
    Tel qu'il est écrit, ton exécution ira de 2 en 2 puisque la variable sera incrémentée 2 fois.
    A lire : https://docs.microsoft.com/fr-fr/off...next-statement

    Prend aussi toujours l'habitude de rappeler ta variable de boucle dans le Next.
    Même si ça n'est pas obligatoire, ça t'évitera de t’emmêler les pinceaux quand tu auras plusieurs boucles imbriquées.

    Pour Selection.Paste, voir la remarque sur les Select/Selection.
    Sauf que là, c'est plus grave.
    Paste ne fait pas partie des méthode de Range.
    Alors pourquoi ça ne plante pas ? Parce que ton Selection ne désigne pas ici une cellule mais la feuille de calcul.
    Tu vois à quel point Selection peut être ambigu : on ne sait jamais ce qu'il désigne vraiment. D'où mon conseil de ne pas l'utiliser.

    Pour faire une copie sur une cellule, on utilise PasteSpecial.
    Lire ça : https://msdn.microsoft.com/fr-fr/lib...6(v=office.15)

    Inutile de mettre deux fois ActiveWorkbook.Save.

    Et le dernier Select ne sert plus à rien puisque, ayant supprimé tous les autres Select dans ton code, la cellule sélectionnée avant l'exécution ne changera pas.

    Ton code revu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    Sub Macro1()
        Dim Ligne As Long
        Range("B6").Copy
        For Ligne = 10 To 16
            Cells(Ligne, 2).PasteSpecial
        Next Ligne
        ActiveWorkbook.Save
    End Sub
    Encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Sub Macro1()
        Dim Ligne As Long
        For Ligne = 10 To 16
            Range("B6").Copy Cells(Ligne, 2)
        Next Ligne
        ActiveWorkbook.Save
    End Sub
    ou simplement :
    Encore plus simple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Sub Macro1()
        Range("B6").Copy Range("B10:B16")
        ActiveWorkbook.Save
    End Sub
    Merci de cliquer sur pour chaque message ayant aidé puis sur pour clore cette discussion.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2020
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Un grand merci à tous les trois.
    Je vais imprimer tous vos conseils pour les appliquer et je vais poursuivre mes essais.
    Je vous souhaite une bonne journée.

  7. #7
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2020
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Ça y est ! Cela fonctionne. Encore merci à tous pour votre amabilité et votre compétence.
    Je perfectionne ma macro en posant un filtre.
    Je dois filtrer un tableau sur la colonne A (Dates) de la feuille JOURNAL.
    Les critères du filtre (date de début et date de fin) sont contenus respectivement dans deux cellules (au format Date, évidemment) : I22 et I24 de la feuille RÉSULTAT.
    Je crée deux variables : Date_1 et Date_2 de type date.
    J'attribue à chacune de ces variables le contenu de la cellule correspondante (dans la feuille RÉSULTAT).
    Et j'établis un filtre dans le tableau de la feuille JOURNAL. (Ligne en gras dans le code.)
    Le problème, c'est que le filtre prend, comme critère de date, le nom de la variable et non son contenu.
    J'ai essayé en mettant les noms des variables entre guillemets dans la ligne de code mais cela bogue.
    Comment faire ?
    Merci.

    https://www.cjoint.com/c/JECj6kglQCt

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Filtre()
    ' Filtre Macro
    Dim Date_1 As Date
    Dim Date_2 As Date
    Sheets("RESULTAT").Select
    Date_1 = Range("I22").Value
    Date_2 = Range("I24").Value
    Sheets("JOURNAL").Select
    Selection.AutoFilter 'Désactive les filtres courants
    Range("A9").Select
    ActiveSheet.Range("$A$7:$F$925").AutoFilter Field:=1, Criteria1:=">=Date_1", Operator:=xlAnd, Criteria2:="<=Date_2"
    End Sub

  8. #8
    Expert confirmé Avatar de Patrice740
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2007
    Messages
    2 475
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 70
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Retraité
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Mars 2007
    Messages : 2 475
    Points : 5 630
    Points
    5 630
    Par défaut
    Bonjour,

    Rappel :
    Citation Envoyé par Patrice740 Voir le message
    1. Éviter les Select inutiles
    2. Préciser la parentalité des Range & Cells
    Ça donne (sans select) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Filtre()
    Dim Date_1 As Date
    Dim Date_2 As Date
      Date_1 = Worksheets("RESULTAT").Range("I22").Value
      Date_2 = Worksheets("RESULTAT").Range("I24").Value
      With Worksheets("JOURNAL")
        ' Supprimer le filtre actuel de la feuille (où qu'il se trouve)
        If Not .AutoFilter Is Nothing Then .AutoFilter.Range.AutoFilter
        ' Remettre le filtre automatique
        .Cells(8, "A").CurrentRegion.AutoFilter Field:=1, Criteria1:=">=" & CDbl(Date_1), Operator:=xlAnd, Criteria2:="<=" & CDbl(Date_2)
      End With
    End Sub
    Cordialement,
    Patrice
    Personne ne peut détenir tout le savoir, c'est pour ça qu'on le partage.

    Pour dire merci, cliquer sur et quand la discussion est finie, penser à cliquer sur

  9. #9
    Membre à l'essai
    Homme Profil pro
    Retraité
    Inscrit en
    Mars 2020
    Messages
    10
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Retraité
    Secteur : Associations - ONG

    Informations forums :
    Inscription : Mars 2020
    Messages : 10
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Patrice740 Voir le message
    Bonjour,

    Rappel :

    Ça donne (sans select) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Sub Filtre()
    Dim Date_1 As Date
    Dim Date_2 As Date
      Date_1 = Worksheets("RESULTAT").Range("I22").Value
      Date_2 = Worksheets("RESULTAT").Range("I24").Value
      With Worksheets("JOURNAL")
        ' Supprimer le filtre actuel de la feuille (où qu'il se trouve)
        If Not .AutoFilter Is Nothing Then .AutoFilter.Range.AutoFilter
        ' Remettre le filtre automatique
        .Cells(8, "A").CurrentRegion.AutoFilter Field:=1, Criteria1:=">=" & CDbl(Date_1), Operator:=xlAnd, Criteria2:="<=" & CDbl(Date_2)
      End With
    End Sub
    Super ! Miracle ! Ça marche !
    J'ai introduit cette séquence dans ma macro (qui est quand même un peu plus longue) et cela semble fonctionner parfaitement.
    Étant novice en BVA, je ne comprends pas très bien tout mais je promets de bouquiner pour progresser.
    Merci beaucoup Patrice. Et, à tous, bon week-end qui s'annonce ensoleillé.

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

Discussions similaires

  1. [VBA - Excel - Word] Problème avec Range(Cells(1,1),Cells(10,10))
    Par Tanoffy dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 08/10/2014, 11h07
  2. Petit problème avec Range et Cells
    Par fdegrave dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 09/03/2013, 18h08
  3. [XL-2003] Problème avec Range
    Par andy38 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 04/06/2009, 23h10
  4. [XL-2003] problème avec range
    Par Godzestla dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 29/04/2009, 13h29
  5. Problème avec Range.Formula
    Par zerti dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 23/07/2007, 17h25

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