2014-05-12 3 views
0

Fondamentalement, je veux faire un code qui sélectionne les cellules d'Excel en fonction du contenu. J'ai trouvé difficile d'expliquer les mots, alors j'ai téléchargé cette image.Comment créer une bordure conditionnelle avec VBA?

enter image description here

Je veux sélectionner avec une bordure rouge toutes les lignes qui contient la coche. Mais si une ligne avec la coche est suivie par une autre avec la coche, faites simplement une grande sélection. (comme je l'ai fait manuellement dans l'image)

Une solution?

Merci à l'avance

+0

comment cochez-vous? Pas besoin de VBA, utilisez la mise en forme conditionnelle. C'est pour ça que c'est fait. – Brad

+1

Vous ne serez pas en mesure d'obtenir des frontières autour de chaque série contiguë de coches avec formatage conditionnel, mais je vous recommande de voir si vous pouvez ajuster vos besoins, car ce serait une douleur dans VBA et simple (pour réaliser quelque chose de similaire à ceci) avec le formatage conditionnel. – Tmdean

+0

Qu'avez-vous essayé? Avez-vous essayé d'enregistrer vos pas et de regarder le vba généré? Vous devrez juste parcourir une plage et vérifier la valeur de la rangée précédente et suivante. – sasfrog

Répondre

2

Je sais que je disais le contraire dans les commentaires, mais maintenant que je l'ai pensé un peu plus, ce qui est entièrement réalisable avec mise en forme conditionnelle. L'idée est de définir toutes les bordures à l'avance, puis d'utiliser la mise en forme conditionnelle pour supprimer les bordures que vous ne souhaitez pas.

D'abord, définissez les bordures de chaque ligne selon la manière dont vous souhaitez qu'elles apparaissent lorsqu'aucune coche n'est cochée.

enter image description here

Lorsque la colonne « Pass » est « Non », vous voulez supprimer la gauche et la bordure droite. Mettre en place un format conditionnel en utilisant une règle de formule pour y parvenir. Assurez-vous de verrouiller la colonne D parce que la formule est appliquée à plusieurs colonnes et que vous voulez toujours regarder la colonne D.

enter image description here

Si la ligne actuelle a « Oui » dans la colonne de passage et la ligne ci-dessous il a aussi "Oui", vous voulez supprimer la bordure inférieure. Vous pouvez utiliser un format conditionnel supplémentaire pour ce faire.

enter image description here

Vous aurez besoin de couvrir quelques autres cas avec des formules conditionnelles supplémentaires, mais cela est l'idée générale.

enter image description here

+0

Merci! Grande aide! – juanora

+0

Seul un petit problème. La dernière formule devrait être $ D5 = $ D6 – juanora

0

Mon approche serait la suivante: Tout d'abord écrire un sous qui met une bordure rouge autour de l'extérieur de toute portée. Il devrait ressembler à quelque chose comme ceci:

Sub ApplyBorder(inputRg as Range) 
    Call inputRg.BorderAround(Weight:=xlMedium, Color:=vbRed) 
End Sub 

Maintenant, nous pouvons parcourir notre gamme. Si nous trouvons un chèque, incluez-le dans la plage pour avoir une bordure. Si nous trouvons un x, alors appliquez la bordure rouge autour de la gamme que nous avons, et réinitialisez-la à rien.

Sub FormatTable() 

    Dim AllTable As Range, oneRedRg As Range, oneRow As Range 
    Dim iRow As Integer 

    Set AllTable = GetTable 

    For iRow = 1 To AllTable.Rows.Count 
     Set oneRow = AllTable.Rows(iRow) 
     If oneRow.Cells(1, 3) = True Then 
      If oneRedRg Is Nothing Then  'if our current redRg is unset, 
       Set oneRedRg = oneRow  'then this is the first one, so set it 
      Else 
       Set oneRedRg = Range(oneRedRg, oneRow) 'if it is already set, then expand oneRedRg to include this one 
      End If 
     Else 
      if Not oneRedRg Is Nothing Then Call ApplyBorder(oneRedRg) 'if we find a range that need not be red, then 
      Set oneRedRg = Nothing  'apply the border to our redRg and reset it to nothing 
     End If 
    Next iRow 
    If Not oneRedRg Is Nothing Then Call ApplyBorder(oneRedRg) 'this last line captures a group of reds 
                   'that are at the end of the table. 
End Sub 

J'ai exclu la fonction "GetTable". Dans ma réponse, GetTable renvoie la table entière à parcourir, sans les en-têtes. Notez également que j'ai changé les contrôles et x pour être les valeurs "Vrai" ou "Faux" dans la feuille de calcul pour plus de facilité.

Bonne codification!

0

CF avec ces quatre règles peut servir, où ce n'est pas visible est le point de code pour les tiques (peut-être « 252 »):

SO23619627 example

et les plages ajustées, le cas échéant, en fonction de .

Questions connexes