Macro Bordures cellules en fonction d'une valeur

Bonjour à tous,

Je suis tout nouveau sur le forum.

Je suis novice dans l'utilisation d'excel, je dirais que je sais faire une partie des choses proposées par le logiciel, mais je suis totalement perdu lorsqu'il s'agit d'associer plus fonctions avec la partie développeur.

J'ai un problème que je souhaiterai résoudre et je ne pense pas pouvoir le résoudre sans passer par des macro et VBA (on pourrait avec les mises en forme conditionnelle mais bon c'est assez lourd je trouve).

Voici mon problème : Je souhaite mettre en forme un tableau (créations de bordures autour des cellules) en fonction d'une valeur d'une cellule.

Par exemple :

  • Si A1 = Quotidien, alors la plage "B1:F1" a toutes ces bordures (extérieures comme intérieure) de cellules avec une bordure noire et fine (la classique). Si non, rien.
  • Si A1 = Hebdomadaire, alors la plage "B1:F1" a uniquement les bordures externes noires et fines. (Est-il possible de fusionner la plage en une "supercellule" et de mettre ses contours en noir et fins?)

Acutellement, je n'arrive à faire que celà mais je n'arrive pas à le combiner à une fonction si.

Sub proprietes()

'Ajouter une bordure aux cellules B1 à F1

Range("B1:F1").Borders.Value = 1

'Value = 0 => pas de bordure

End Sub

Merci d'avance pour votre réponse et l'aide apportée.

Cordialement.

Insa

Bonsoir,

Il est tout à fait louable de chercher à écrire un code fonctionnel qui fasse ce que tu souhaites... mais cela ne s'improvise pas. Il te faut préalablement t'informer sur les objets, méthodes, propriétés, etc. que tu devras utiliser pour y parvenir. VBA dispose d'une Aide qui est là pour ça et ne demande qu'à être consultée, elle te précisera la syntaxe à utiliser pour manipuler chacun des objets auxquels tu devras avoir recours.

L'objet Range (qu'au passage il serait plus sûr de qualifier par l'appartenance à la feuille sur laquelle il se trouve) représente une plage de cellules, lequel objet dispose d'une propriété Borders (très bien de l'avoir déterminé déjà ). Cette propriété renvoie les 4 bordures de chaque cellule de la plage à laquelle il réfère : allant un peu plus loin, tu pouvais constater que l'objet Borders renvoyé n'a pas de propriété Value (tu peux donc toujours t'escrimer Value te renverra une erreur pour cet objet.

En inventoriant les propriétés de l'objet Borders, tu peux alors constater que deux de ces propriétés te permettent de définir les bordures que tu souhaites : LineStyle (le style de trait des bordures, celui que tu souhaites sera défini par la constante Excel xlContinuous, trait simple continu), et Weight (l'épaisseur du trait à définir par la constante xlThin, trait fin).

Pour la deuxième option (bordure entourant la plage) en utilisant Borders, tu devrais faire le tour de toutes les cellules en cherchant laquelle doit être concernée parce qu'extérieure... Plutôt fastidieux ! Il vaut mieux passer un peu de temps à scruter les possibilités de manipuler l'objet Range jusqu'à trouver la méthode BorderAround qui permet de traiter en une seule fois la bordure extérieure de la plage, et là les caractéristiques de la bordure sont insérées en arguments de la méthode (le style et l'épaisseur du trait étant les 2 premiers)...

Reste le cas où il ne faut aucune bordure : là cela paraît simple cependant définir l'absence d'un élément est souvent moins simple que sa présence (définie par la définition de caractéristiques) et peut donner lieu à hésitations, notamment dans les cas de multitudes d'objets emboîtés... Il peut aussi arriver que plusieurs méthodes marchent... Ici on va définir l'absence de trait par la propriété LineStyle à laquelle on affecte la constante Excel xlNone (0).

Reste ensuite mettre ensemble tous ses éléments pour composer une procédure aussi réduite que possible en utilisant les instructions VBA quile permettent. Pour cela, je t'accorde qu'un débutant n'y parviendra généralement pas du premier coup. Cela vient avec l'expérience et les conseils d'intervenants plus aguerris sont bienvenus...

Voilà un code auquel tu devrais pouvoir finalement parvenir :

Sub test()
    Dim qh$
    With ActiveSheet
        qh = .Range("A1")
        With .Range("B1:F1")
            Select Case qh
                Case "Quotidien"
                    With .Borders
                        .LineStyle = xlContinuous
                        .Weight = xlThin
                    End With
                Case "Hebdomadaire"
                    .Borders.LineStyle = xlNone
                    .BorderAround xlContinuous, xlThin
                Case Else
                    .Borders.LineStyle = xlNone
            End Select
        End With
    End With
End Sub

Cordialement.

Complément :

Pour que l'action soit lancée automatiquement, il faut qu'elle puisse être déclenchée au changement de la valeur en A1, donc l'insérer dans une procédure évènementielle et l'adapter en conséquence :

Private Sub Worksheet_Change(ByVal Target As Range)
    If Target.Address = "$A$1" Then
        With Me.Range("B1:F1")
            Select Case Target.Value
                Case "Quotidien"
                    With .Borders
                        .LineStyle = xlContinuous
                        .Weight = xlThin
                    End With
                Case "Hebdomadaire"
                    .Borders.LineStyle = xlNone
                    .BorderAround xlContinuous, xlThin
                Case Else
                    .Borders.LineStyle = xlNone
            End Select
        End With
    End If
End Sub

Procédure qui doit être placée dans le module de la feuille concernée (et non dans un module Standard où elle serait inopérante).

Attention : si A1 contient une formule, l'évènement n'est pas déclenché par une variation du résultat d'un calcul... (il faut alors rechercher ce qui conditionne la variation du résultat et correspond à un changement de valeur de cellules opéré par l'utilisateur, pour cibler la détection de l'évènement Change sur ces cellules...)

Cordialement.

Bonjour et merci beaucoup pour ton aide.

Je vais tester ce bout de programme et le décortiquer pour mieux le comprendre, puis ensuite l'employer à plus grande échelle.

Je suis d'accord avec toi sur le fait que la programmation est une chose très complexe et effectivement, il me faut beaucoup plus de base pour faire ce que je désire, et surtout comprendre ce que je fais, car un simple "copier/coller" des codes sans chercher à en comprendre le fonctionnement ne sert strictement à rien.

Merci en tout cas pour ton aide!!!

Cordialement,

Insa

Rechercher des sujets similaires à "macro bordures fonction valeur"