Plusieurs conditions potentielles dans une boucle if

alexvol

XLDnaute Nouveau
Bonsoir,

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".

Merci pour l'aide que vous pourrez m'apporter.

Cordialement
 

Papou-net

XLDnaute Barbatruc
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
Cordialement.
 

alexvol

XLDnaute Nouveau
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.

Merci pour l'aide.
 

Pièces jointes

  • test.xlsm
    53.8 KB · Affichages: 38
  • test.xlsm
    53.8 KB · Affichages: 42
  • test.xlsm
    53.8 KB · Affichages: 39

Papou-net

XLDnaute Barbatruc
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
Et copie de ton fichier en PJ.

Bonne journée.

Cordialement.
 

Pièces jointes

  • Copie de test alexvol.xlsm
    50.9 KB · Affichages: 35

alexvol

XLDnaute Nouveau
Re : Plusieurs conditions potentielles dans une boucle if

Merci pour cette nouvelle proposition. Elle fonctionne parfaitement.

Je vais vous embêter encore un peu. Pourriez vous m'expliquer la procédure ? J'aimerai comprendre.

Encore merci
 

Papou-net

XLDnaute Barbatruc
Re : Plusieurs conditions potentielles dans une boucle if

Je vais vous embêter encore un peu. Pourriez vous m'expliquer la procédure ? J'aimerai comprendre.i

Bonsoir alexvol,

C'est tout-à-ton honneur de vouloir comprendre.

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.

Cordialement.
 

alexvol

XLDnaute Nouveau
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 ?


Je remets le fichier en pièce jointe.

Encore merci pour l'aide.
 

Pièces jointes

  • test.xlsm
    96 KB · Affichages: 59
  • test.xlsm
    96 KB · Affichages: 55
  • test.xlsm
    96 KB · Affichages: 57

Papou-net

XLDnaute Barbatruc
Re : Plusieurs conditions potentielles dans une boucle if

Bonjour alexvol,

Désolé pour mon retard à te répondre, je viens seulement de découvrir ton dernier message.

Pour répondre à ta deuxième question, concernant la protection de la feuille, il faut que tu insères dans le module ThisWorkbook le code suivant :

Code:
Private Sub Workbook_Open()
Feuil11.Protect userinterfaceonly:=True
End Sub
Cette instruction autorise les modifications des cellules par le code mais pas par l'utilisateur.

Quant au premier point, je ne comprends pas bien la question :

Lors de la validation, la copie des données se fait normalement sauf si la cellule n'est pas vide.
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.

A te lire.

Cordialement.
 

alexvol

XLDnaute Nouveau
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.

Encore merci pour l'aide
 

Pièces jointes

  • test.xlsm
    68.9 KB · Affichages: 38
  • test.xlsm
    68.9 KB · Affichages: 40
  • test.xlsm
    68.9 KB · Affichages: 38

Papou-net

XLDnaute Barbatruc
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
Bonne soirée.

Cordialement.
 

alexvol

XLDnaute Nouveau
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).

Encore merci pour toutes les précieuses réponses.
 

alexvol

XLDnaute Nouveau
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.

Je joins le fichier.

Auriez vous une idée ?

Merci
 

Pièces jointes

  • Classeur1.xlsm
    47.2 KB · Affichages: 36
  • Classeur1.xlsm
    47.2 KB · Affichages: 42
  • Classeur1.xlsm
    47.2 KB · Affichages: 40

Papou-net

XLDnaute Barbatruc
Re : Plusieurs conditions potentielles dans une boucle if

Bonsoir alexvol,

Ci-joint ton fichier avec élimination des doublons dans les listes déroulantes.

Important : ne pas oublier de vérifier si la référence Microsoft Scripting Runtime est bien cochée dans le menu VBE (Outils, Références...).

Espérant avoir répondu.

Cordialement.
 

Pièces jointes

  • Copie de Classeur1-1.xlsm
    24.1 KB · Affichages: 35
  • Copie de Classeur1-1.xlsm
    24.1 KB · Affichages: 41
  • Copie de Classeur1-1.xlsm
    24.1 KB · Affichages: 41
  • Reference VBE.JPG
    Reference VBE.JPG
    52.1 KB · Affichages: 79

Discussions similaires

Statistiques des forums

Discussions
312 466
Messages
2 088 662
Membres
103 910
dernier inscrit
amor57