je voudrais pouvoir coller une valeur dans une cellule si elle est vide ou contient la valeur "abs". Voici le code que j'utilise :
Code:
Set cell_source_1er = Range("e7")
Set cell_source_der = cell_source_1er.End(xlDown)
Set cell_cible_deb = Range("k7")
Set cell_cible_fin = Range("q7")
Range(cell_source_1er, cell_source_der).Copy
If IsEmpty(cell_cible_deb) Or cell_cible_deb.Value = "abs" Then
Range(cell_cible_deb).PasteSpecial xlPasteValues
Else
cell_cible_fin.End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
End If
Mais cela ne fonctionne pas. La copie se fait uniquement dans une cellule vide. Il n'y a aucune prise en compte de la condition "abs".
Re : Plusieurs conditions potentielles dans une boucle if
Bonsoir alexvol,
Essaie comme ceci :
Code:
Set cell_source_1er = Range("e7")
Set cell_source_der = cell_source_1er.End(xlDown)
Set cell_cible_deb = Range("k7")
Set cell_cible_fin = Range("q7")
Range(cell_source_1er, cell_source_der).Copy
If cell_cible_deb.Value = "" Or cell_cible_deb.Value = "abs" Then
Range(cell_cible_deb).PasteSpecial xlPasteValues
Else
cell_cible_fin.End(xlToLeft).Offset(0, 1).PasteSpecial xlPasteValues
End If
Re : Plusieurs conditions potentielles dans une boucle if
Merci pour la proposition. Je viens de la tester. Cela fonctionne mais le collage ne se fait pas au bon endroit...
Je voudrai que le collage se fasse dans la colonne la plus à gauche qui ne contienne pas de chiffre. Pour être plus clair, je vous joins le fichier. C'est le bouton "validation" qui utilise la macro en question.
Re : Plusieurs conditions potentielles dans une boucle if
Bonjour alexvol,
Il est vrai qu'avec un fichier c'est plus facile. Voici donc une proposition de modification de ta macro :
Code:
Sub validationEquipe()
'
' validationEquipe Macro
'
'
Dim cell_nom_1er As Range
Dim cell_nom_der As Range
Dim cell_source_1er As Range
Dim cell_source_der As Range
Dim cell_cible_deb As Range
Dim cell_cible_fin As Range
Set cell_nom_1er = Range("a7")
Set cell_nom_der = Range("a" & Rows.Count).End(xlUp)
For Each cel In Range(cell_nom_1er, cell_nom_der)
If Not cel.Value = "" And cel.Offset(0, 4).Value = "" Then cel.Offset(0, 4).Value = "-"
Next
Set cell_source_1er = Range("e7")
Set cell_source_der = cell_source_1er.End(xlDown)
Set cell_cible_deb = Range("k7")
Set cell_cible_fin = Range("q7")
For Each cel In Range(cell_source_1er, cell_source_der).SpecialCells(xlCellTypeConstants)
Cells(cel.Row, cel.End(xlToRight).Column + 1) = cel.Value
Next
End Sub
Je vais donc t'expliquer les notions nouvelles par rapport à ton code.
Pour commencer, la première boucle :
Code:
For Each cel In Range(cell_nom_1er, cell_nom_der)
If Not cel.Value = "" And cel.Offset(0, 4).Value = "" Then cel.Offset(0, 4).Value = "-"
Next
La boucle balaie chaque cellule, dans l'ordre croissant, dans la plage définie par Range(...) et l'affecte à la variable cel. C'est donc cette variable que l'on teste dans la condition If. Si la condition est remplie, alors on écrit "-" dans la cellule décalée (Offset) par rapport à cel et dont les coordonnées de décalage sont indiquées entre parenthèses. Le premier chiffre indique le décalage de ligne, le second le décalage de colonne. Si le signe est positif ou absent, le décalage se fait vers le bas pour le premier chiffre et vers le haut pour le second. Si le signe est négatif, le décalage se fait respectivement vers le haut et vers la gauche.
Dans cet exemple, la boucle balaie les cellules A7:A40. Donc, si on considère le début de la boucle, on se positionne sur A7. Si A7="" et E7="" alors E7="" puisque Offset(0,4) ne change pas de ligne (0) et décale de 4 colonnes vers la droite (+4)
Pour la deuxième boucle :
Code:
For Each cel In Range(cell_source_1er, cell_source_der).SpecialCells(xlCellTypeConstants)
Cells(cel.Row, cel.End(xlToRight).Column + 1) = cel.Value
Next
Même type que la première mais, cette fois, elle ne lit que les cellules qui contiennent une valeur (SpecialCells(xlCellTypeConstants)). Les cellules vides ne sont donc pas analysées. Les boucles For Each...Next ne peuvent s'appliquer qu'à des objets et sont réputées plus rapides que les boucles indicées (For...Next) car elles ne manipulent pas de variables.
Pour pouvoir positionner les valeurs dans la première colonne vide de droite, on utilise la fonction End(xlToRight) qui dirige la recherche de la dernière cellule renseignée vers la droite. Là encore on utilise la même variable cel pour définir la ligne (cel.Row) et la colonne (cel.Column).
J'espère avoir été assez précis dans cet exposé, mais je te conseille toutefois de ne pas hésiter à utiliser l'aide de VBA pour te renseigner sur les différentes instructions et leurs paramètres.
Re : Plusieurs conditions potentielles dans une boucle if
Merci pour cette explication.
Quelques petites questions encore :
Lors de la validation, la copie des données se fait normalement sauf si la cellule n'est pas vide. La copie se fait dans la cellule d'à côté. Ce n'est pas le fonctionnement que je souhaiterai. Je voudrai dans un premier temps identifier la première colonne qui ne contient pas de chiffre, puis coller dans cette colonne les données souhaitées en supprimant les données de cette colonne (le texte "abs").
La macro ne fonctionne pas lorsque la feuille est protégée. pourquoi ?
De quelle cellule parle-tu ? Si tu pouvais m'en dire un peu plus car j'avoue que je "nage" un peu. Éventuellemnt, un exemple de la feuille avant et après la macro me serait bien utile.
Re : Plusieurs conditions potentielles dans une boucle if
Merci pour cette réponse.
Pour la protection, j'ôte la protection en début de macro et je la remets en fin de code.
Pour la copie, je joins un fichier. En rouge, les cellules où je voudrai que la copie se fasse. En actionnant la macro par l'intermédiaire du bouton valider, on remarque que la copie se décale pour la seconde ligne. Je veux que la copie efface "abs" et colle la nouvelle valeur.
Re : Plusieurs conditions potentielles dans une boucle if
Bonsoir alexvol,
Ôter la protection et la remettre par le code est aussi une solution, mais j'avais pensé que la configurer à l'ouverture du fichier évite de le faire dans d'autres procédures qui pourraient agir sur la feuille.
Pour le reste, je te propose de modifier ta macro comme suit :
Code:
Sub validationEquipe()
'
' validationEquipe Macro
'
'
Dim cell_nom_1er As Range
Dim cell_nom_der As Range
Dim cell_source_1er As Range
Dim cell_source_der As Range
Dim cell_cible_deb As Range
Dim cell_cible_fin As Range
Set cell_nom_1er = Range("a7")
Set cell_nom_der = Range("a" & Rows.Count).End(xlUp)
For Each cel In Range(cell_nom_1er, cell_nom_der)
If Not cel.Value = "" And cel.Offset(0, 4).Value = "" Then cel.Offset(0, 4).Value = "-"
Next
Set cell_source_1er = Range("e7")
Set cell_source_der = cell_source_1er.End(xlDown)
Set cell_cible_deb = Range("k7")
Set cell_cible_fin = Range("q7")
For Each cel In Range(cell_source_1er, cell_source_der).SpecialCells(xlCellTypeConstants)
col = cel.End(xlToRight).Column
If LCase(Cells(cel.Row, col)) = "abs" Then
Cells(cel.Row, col) = cel.Value
Else
Cells(cel.Row, col + 1) = cel.Value
End If
Next
End Sub
Re : Plusieurs conditions potentielles dans une boucle if
Superbe, parfait !!! Tout fonctionne comme souhaité.
Merci pour l'aide apporté.
Prochainement je vais terminer un prog sous excel pour la gestion sportive d'un club. Me permettrez vous de vous l'envoyer pour me faire vos commentaires ? (affiner la méthode de codage, la simplifier).
Re : Plusieurs conditions potentielles dans une boucle if
Bonsoir,
je suis de retour
J'ai créé un userform avec trois combobox en cascade sans doublon enfin c'était le but.
En effet, si je ne code que le "userform initialize", j'ai des listes indépendantes sans doublon. Par contre quand je mets en oeuvre les liens entre les combobox, des doublons apparaissent. J'ai essayé de transposer la méthode utilisée dans le "userform initialize" dans les "combobox... change", mais rien n'y fait.