Exécuter une macro sur une colonne en fonction d'une valeur
Bonjour. Je suis débutant en VBA.
J'ai réussi à créer une macro de validation des donnnées qui m'indique si j'ai des cellules vides.
Voir code:
Sub Remplir5()
'********************************
' Remplir5 Macro
'Macro pour trouver les vides
'******************************
vide = False
For Each c In Range("C10:c30").Cells
If c = "" Then vide = True
Next
If vide Then MsgBox "Cellule vide"
End Sub
Je voudrais que cette macro s'applique également sur les colonnes D, E, F. etc,, seulement si la valeur de D2, de E2 ou de F2 (entete de la colonne) correspond à une certaine valeur.
MErci de votre aide.
Bonjour,
Quel est l'objectif réel de la macro ? Rechercher les cellules vides ou empêcher qu'elles le deviennent ? Et quelle est cette condition sur les colonnes D à F ?
Pour l'exercice, voici une proposition de recherche (compte et renvoie les addresses par boite de dialogue et sur la feuille) :
Sub RechercherVide()
Dim plage as range, c as range
Dim k as byte
Dim nbvide%
Dim Add$
for k = 3 to 6 'pour les colonnes 3 à 6 (càd C à F)
if cells(2, k).value = "" then goto Passer 'si entete vide, on saute la recherche (A ADAPTER EVIDEMMENT)
set plage = Range(cells(10, k), cells(30, k)) 'définition de la plage en cours (lignes 10 à 30)
For Each c In plage 'pour chaque cellule sur la plage
If c.value = "" Then 'si cellule vide
nbvide = nbvide + 1 'compteur s'incrémente (+1)
if Add = "" then 'si Add est vide
Add = c.address 'Add prend uniquement l'adresse
else 'sinon
Add = Add & "," & c.address 'concatène les adresses déjà stockées avec celle en cours (avec , comme séparateur)
end if
end if
Next c 'cellule suivante
Passer: 'reprise en cas de saut (entete vide)
next k 'colonne suivante
msgbox "Il y a " & nbvide & " cellules vides :" & vbcrlf & vbcrlf & Add 'message
Range("N1").value = Add 'adresses copiées sur la feuille (en N1 : choix arbitraire)
End Sub
Mais il y a beaucoup plus simple, avec exemples d'actions sur ces cellules :
Sub AvecMesVides()
Dim Vides as range
Set Vides = Range("C10:F30").specialcells(xlcelltypeblanks) 'union des cellules vides de ma plage de recherche
with Vides 'sur cette plage de cellules vides (factorisation)
.interior.color = RGB(255, 0, 0) 'colorie en rouge l'intérieur
.value = "VIDE" 'attribue la valeur "VIDE"
.cells(1).value = .address 'renvoie sur la première cellule les adresses de toutes les vides
end with
'A NOTER QUE LES LIGNES SE SUPERPOSENT AUX PRÉCÉDENTES SANS INFLUER DESSUS
end sub
Cdlt,
Bonjour.
J'ai copié le code, changer les variables et tout à fonctionner durant un bout. Merci.
J'ai un erreur d'Exécution 13 qui apparait sans raison apparante:
Sub RechercherVide()
Dim plage As Range, c As Range
Dim k As Byte
Dim nbvide%
Dim Add$
For k = 3 To 12 'pour les colonnes 3 à 8 (càd C à n)
If Cells(9, k).Value = "" Then GoTo Passer 'si entete vide, on saute la recherche (A ADAPTER EVIDEMMENT)
Set plage = Range(Cells(10, k), Cells(44, k)) 'définition de la plage en cours (lignes 10 à 30)
For Each c In plage 'pour chaque cellule sur la plage
If c.Value = "" Then 'si cellule vide
nbvide = nbvide + 1 'compteur s'incrémente (+1)
If Add = "" Then 'si Add est vide
Add = c.Address 'Add prend uniquement l'adresse
Else 'sinon
Add = Add & "," & c.Address 'concatène les adresses déjà stockées avec celle en cours (avec , comme séparateur)
End If
End If
Next c 'cellule suivante
Passer: 'reprise en cas de saut (entete vide)
Next k 'colonne suivante
MsgBox "Il y a " & nbvide & " cellules vides :" & vbCrLf & vbCrLf & Add 'message
'Range("N1").Value = Add 'adresses copiées sur la feuille (en N1 : choix arbitraire)
End Sub
Bonjour,
A première vue, c'est assez énigmatique. C'est le genre de chose qui ne m'arrive que sur mon mac et jamais sur windows. Essayez avec
Dim plage As Range 'sans c as range
et sinon, essayez de boucler sur les lignes et colonnes (sans for each).
Mais si le but est de trouver les cellules vides, le second code est plus intéressant !