Problème macro

3essais-macro.xlsm (15.00 Ko)

Bonjour j'ai commencé a faire quelques macro dont une qui sera jointe.

Cependant celle ci ne fonctionne pas... Quelqu'un pourrait m'aider ?

Sachant que j'ai casiment la même macro juste avant sur la même feuille.

Est-ce parce ce code est trop grand ?

Y'a t'il une autre solution

" Private Sub Worksheet_Change1(ByVal Target As Range)

Bonjour,

Private Sub Worksheet_Change1(ByVal Target As Range)

Tu le sors d'où le Change1 ?

A+

C'est un autre nom de macro, car j'utilise juste avant un macro " Private Sub Worksheep_change (ByVal Target As Range)

Est-ce ceci le pb ?

Merci

Bonjour,

Et si tu apprenais à utiliser des boucles, cela pourrait te rendre bien des services...

Cordialement

Est-ce possible d'avoir ma solution sous forme de boucle comme tu dis pour que je comprenne ?

Si tu peux mettre un fichier (le rebâtir serait un peu lourd... !)

Cf premier message

Merci pour votre aide

Désolé ! Pas vu ton fichier...

Quelques remarques éventuellement utiles :

- D'abord, comme l'a soulevé Frangy, les procédures évènementielles permettent de programmer des réactions automatiques aux évènements, mais il ne peut y en avoir qu'une par évènement dans un module d'objet, et il est conseillé de ne pas écrire manuellement la ligne Sub... car le nom et les arguments répondent à une syntaxe précise.

- Il est curieux que tu déclares des variables ob1 à ob10 pour utiliser des variables non déclarées ob11 à ob20 ?

- D'autre part, quand tu écris Feuil1.(...), as-tu conscience que sous cette forme Feuil1 ne représente pas le nom de la feuille mais son nom de code (CodeName) ?

Même chose pour Feuil12, sauf que cette feuille n'existe pas dans le classeur ?

(à suivre)

Autre remarque dans la suite des précédentes :

- L'utilisation de Is dans une instruction Select Case n'est requise que si tu dois utiliser un opérateur de comparaison, par ex. :

tu dois écrire : Case Is >2, mais tu peux écrire Case 2 ou Case 2 To 8...

Revenons aux boucles, cela permet de en général de réduire de façon assez conséquente le code à écrire. Un exemple sur ton fichier :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i%, n%, vis As Boolean
    If Not Intersect(Target, Me.Range("D4")) Is Nothing Then
        n = Me.Range("D4").Value
        For i = 1 To 10
            vis = IIf(n >= i, True, False)
            Me.Shapes("Rectangle à coins arrondis " & i).Visible = vis
        Next i
    End If
End Sub

A noter :

  • proc. évènementielle de la feuille (inutile d'intercepter l'évènement sur toutes les feuilles quand celui qui intéresse ne peut se produire que sur une bien définie), et de plus il n'y a qu'une feuille actuellement.
  • n étant une variable de type Integer, utilisée pour récupérer la valeur de D4, prendra la valeur 0 si la cellule est vide.
  • les formes étant nommées avec une même partie littérale suivie d'un n° d'ordre dans un suite de 1 à 10 cela facilite ; si la suite était différente on adapte (ex: 11 à 20 => i+10...) ; par ailleurs, il est loisible de renommer les formes pour pouvoir les traiter en série dotée d'un numéro d'ordre continu ; on peut également utiliser le numéro d'index à la place du nom (en s'étant assuré qu'ils constituent une série continue).
  • ici, utilisation d'une variable booléenne pour définir la propriété Visible en fonction de n et i.
  • utilisation de la fonction Iif pour définir la valeur de Visible (NB- on aurait pu aussi écrire seulement : vis = n >= i).
  • le test utilisant Instersect est préférable ici en raison de cellules fusionnées.

Cordialemenr

Ferrand

Merci pour toutes ces informations !

Cependant le fichier transmit n'avait qu'une feuille pour par qu'il soit trop lourd, mais dans mon vrais dossier (joint)

Le formule que tu m'as transmise ne veut pas fonctionner ..

que dois-je faire (Onglet "Rame HTA")

5classeur2-try.xlsm (241.43 Ko)

Est-ce que tu lis les explications ?

Il ne peut y avoir qu'une seule procédure Worksheet_Change pour une feuille.

Et Worksheet_Change1 ne peut pas exister en tant que procédure évènementielle.

De plus si tu laisses D4 qui ne correspond pas à ta feuille...

D'autre part, il est souhaitable de ne pas confondre "formule" destinée à prendre place sur une feuille de calcul et procédure VBA.

Version adaptée à ta feuille, qui fonctionne pour les 2 séries :

Private Sub Worksheet_Change(ByVal Target As Range)
    Dim i%, d%, f%, n%, vis As Boolean
    Select Case Target.Address
        Case "$H$25"
            n = Target.Value: d = 1: f = 6
        Case "$H$31"
            n = Target.Value + 10: d = 11: f = 20
        Case Else
            Exit Sub
    End Select
    For i = d To f
        vis = IIf(n >= i, True, False)
        Me.Shapes("Go " & i).Visible = vis
    Next i
End Sub

NB- J'ai renommé les formes...

Cordialement

Rechercher des sujets similaires à "probleme macro"