XL 2016 En VBA, Automatiser la réponse en fonction de l'état d'une cellule.

  • Initiateur de la discussion Initiateur de la discussion piga25
  • Date de début Date de début

Boostez vos compétences Excel avec notre communauté !

Rejoignez Excel Downloads, le rendez-vous des passionnés où l'entraide fait la force. Apprenez, échangez, progressez – et tout ça gratuitement ! 👉 Inscrivez-vous maintenant !

piga25

XLDnaute Barbatruc
Bonjour,
Automatiser la réponse en fonction de l'état d'une cellule.
le problème est comment mettre :
Indiquer « Fin » si et seulement si :
  • la mission de l’équipe est « Terminée »
  • la cellule située 2 colonnes à gauche est renseignée
  • Ne pas effacer si la cellule est déjà renseignée.
La feuille se compose de plusieurs tableaux, chaque tableau contient 20 lignes.
Le premier tableau commence à la ligne 25, le second à la ligne 45, le 3ème à la ligne 65 et ainsi de suite.
Chaque tableau contient quatre petits tableaux représentant une équipe à chaque fois : colonnes C,D et E ; G, H et I ; K, L et M et le dernier en O, P et Q.
Les numéros des grands tableaux sont situés en colonne B (B25, B45, B65 et ainsi de suite).
L’état des missions de chaque équipe est situé sur la ligne 27, puis 47, puis 67 et ainsi de suite (C27, G27, K27 et O27)
Donc mettre fin si en colonne E, I, M et Q et cela dans chaque petit tableau soit 16 lignes.
  • La cellule n’est pas déjà renseignée.
  • La mission indique « Terminée »
  • Et que 2 colonnes avant (C, G, K, O) soit renseigné.

VB:
Sub AjouterFinSiMissionTerminee()

  Dim ws As Worksheet
  Dim derniereLigne As Long
  Dim ligneTableau As Long
  Dim colonneMission As Long
  Dim colonneFin As Long
  Dim colonneIntervenant As Long
  Dim i As Long
  Dim ligneDonnees As Long

  ' Définir la feuille de calcul
  Set ws = ThisWorkbook.Sheets("Equipe") ' Nom de la feuille

  ' Trouver la dernière ligne utilisée dans la colonne B (pour déterminer le nombre de tableaux)
  derniereLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

  ' Boucle à travers chaque tableau (tous les 20 lignes)
  For ligneTableau = 25 To derniereLigne Step 20

    ' Boucle à travers chaque équipe dans le tableau (4 équipes par tableau)
    For i = 0 To 3

      ' Définir les colonnes pour chaque équipe
      Select Case i
        Case 0 ' Première équipe
          colonneMission = 3 ' Colonne C
          colonneFin = 5 ' Colonne E
          colonneIntervenant = 2 ' Colonne B
        Case 1 ' Deuxième équipe
          colonneMission = 7 ' Colonne G
          colonneFin = 9 ' Colonne I
          colonneIntervenant = 6 ' Colonne F
        Case 2 ' Troisième équipe
          colonneMission = 11 ' Colonne K
          colonneFin = 13 ' Colonne M
          colonneIntervenant = 10 ' Colonne J
        Case 3 ' Quatrième équipe
          colonneMission = 15 ' Colonne O
          colonneFin = 17 ' Colonne Q
          colonneIntervenant = 14 ' Colonne N
      End Select

      ' Boucle à travers chaque ligne de données de l'équipe
      For ligneDonnees = ligneTableau + 3 To ligneTableau + 18 ' Lignes 28 à 43, 48 à 63, etc.

        ' Vérifier l'état de la mission et la présence d'un intervenant
        If ws.Cells(ligneTableau + 2, colonneMission).Value = "Terminée" And _
           ws.Cells(ligneDonnees, colonneIntervenant).Value <> "" And _
           ws.Cells(ligneDonnees, colonneFin).Value = "" Then

          ' Écrire "Fin" dans la colonne de fin
          ws.Cells(ligneDonnees, colonneFin).Value = "Fin"

        End If

      Next ligneDonnees

    Next i
 

Pièces jointes

Solution
tu peux surtout simplifier le select case
VB:
Sub AjouterFinSiMissionTerminee()

  Dim ws As Worksheet
  Dim derniereLigne As Long
  Dim ligneTableau As Long
  Dim colonneMission As Long
  Dim colonneFin As Long
  Dim colonneIntervenant As Long
  Dim i As Long
  Dim ligneDonnees As Long

  ' Définir la feuille de calcul
  Set ws = ThisWorkbook.Sheets("Equipe") ' le nom de la feuille

  ' Trouver la dernière ligne utilisée dans la colonne B (pour déterminer le nombre de tableaux)
  derniereLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

  ' Boucle à travers chaque tableau (tous les 20 lignes)
  For ligneTableau = 25 To derniereLigne Step 20
    ' Boucle à travers chaque équipe dans le tableau (4 équipes par tableau)
    For i = 0 To 3...
Bonjour

Comment dire.. euh.. c'est un peu indigeste..
Je ne comprend pas ce que sont tes tableaux, les grands, les petits...

les grands tableaux sont constitués de 4 petits tableaux qui représentent chacun une équipe==> ca fait donc 4 équipes.... hors.. dans chaque tableau on voit 15 lignes "equipexx"

idem pour les missions.. on ne voit pas ou elles sont.. c'est le grand tableau?
 
Bonjour vgendron,
Le grand tableau est : A25:R44
1739974663501.png

Dans ce tableau il y a quatre équipes
Equipe 1: C25:F44
Equipe 2: G25:J44
Equipe 3: K25:N44
Equipe 4: O25:R44
1739974840527.png

Chaque Equipe est composée d'un chef d'équipe (1ere ligne) suivi de 15 équipiers.
Pour les missions elles sont sur les lignes: 27, 47, 67 et ainsi de suite.

Sur la feuille, lors d'ajout d'équipes, je rajoute un grand tableau, soit 4 équipes et ainsi de suite, c'est un pas de 20 lignes à chaque rajout.
 
et donc chaque équipe a sa propre misision (équipe 1 = Misson Gestion, Equipe2=Mission ASV, 3=TPH, 4=equiPEment1, 5=Equipement2..)

dans chaque équipe.. ca correspond à quoi les 15 lignes "Eq 1, Eq2....Eq 15) ?

pour mettre Fin sur une ligne, il faut que l'état de mission soit "Terminée" ET qu'il y ait une valeur en colonne "-2"
pourquoi pas simplement une formule? =si(et(D27="Terminée";C28<>"");"Fin";"")
 
Re,
J'ai bien pensé au départ le faire par formule, mais le soucis c'est comment les recopier.
Donc j'opte pour un code qui se déclenchera lorsque j'ouvre la feuille ou que je clique sur l'icone du reveil.
J'ai relu tout mon code et je me suis aperçu de 2 bugs. J'ai corrigé et cela me semble fonctionner. Donc a tester.
J'ai une redondance avec colonneMission et colonneIntervenant. peut être simplifier cela.
Le code modifier:
VB:
Sub AjouterFinSiMissionTerminee()

  Dim ws As Worksheet
  Dim derniereLigne As Long
  Dim ligneTableau As Long
  Dim colonneMission As Long
  Dim colonneFin As Long
  Dim colonneIntervenant As Long
  Dim i As Long
  Dim ligneDonnees As Long

  ' Définir la feuille de calcul
  Set ws = ThisWorkbook.Sheets("Equipe") ' le nom de la feuille

  ' Trouver la dernière ligne utilisée dans la colonne B (pour déterminer le nombre de tableaux)
  derniereLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

  ' Boucle à travers chaque tableau (tous les 20 lignes)
  For ligneTableau = 25 To derniereLigne Step 20

    ' Boucle à travers chaque équipe dans le tableau (4 équipes par tableau)
    For i = 0 To 3

      ' Définir les colonnes pour chaque équipe
      Select Case i
        Case 0 ' Première équipe
          colonneMission = 3 ' Colonne C
          colonneFin = 5 ' Colonne E
          colonneIntervenant = 3 ' Colonne C
        Case 1 ' Deuxième équipe
          colonneMission = 7 ' Colonne G
          colonneFin = 9 ' Colonne I
          colonneIntervenant = 7 ' Colonne G
        Case 2 ' Troisième équipe
          colonneMission = 11 ' Colonne K
          colonneFin = 13 ' Colonne M
          colonneIntervenant = 11 ' Colonne K
        Case 3 ' Quatrième équipe
          colonneMission = 15 ' Colonne O
          colonneFin = 17 ' Colonne Q
          colonneIntervenant = 15 ' Colonne O
      End Select

      ' Boucle à travers chaque ligne de données de l'équipe
      For ligneDonnees = ligneTableau + 3 To ligneTableau + 18 ' Lignes 28 à 43, 48 à 63, etc.

        ' Vérifier l'état de la mission et la présence d'un intervenant
        If ws.Cells(ligneTableau + 2, colonneMission).Value = "Terminée" And _
           ws.Cells(ligneDonnees, colonneIntervenant).Value <> "" And _
           ws.Cells(ligneDonnees, colonneFin).Value = "" Then

          ' Écrire "Fin" dans la colonne de fin
          ws.Cells(ligneDonnees, colonneFin).Value = "Fin"

        End If

      Next ligneDonnees

    Next i

  Next ligneTableau

End Sub
 

Pièces jointes

tu peux surtout simplifier le select case
VB:
Sub AjouterFinSiMissionTerminee()

  Dim ws As Worksheet
  Dim derniereLigne As Long
  Dim ligneTableau As Long
  Dim colonneMission As Long
  Dim colonneFin As Long
  Dim colonneIntervenant As Long
  Dim i As Long
  Dim ligneDonnees As Long

  ' Définir la feuille de calcul
  Set ws = ThisWorkbook.Sheets("Equipe") ' le nom de la feuille

  ' Trouver la dernière ligne utilisée dans la colonne B (pour déterminer le nombre de tableaux)
  derniereLigne = ws.Cells(ws.Rows.Count, "B").End(xlUp).Row

  ' Boucle à travers chaque tableau (tous les 20 lignes)
  For ligneTableau = 25 To derniereLigne Step 20
    ' Boucle à travers chaque équipe dans le tableau (4 équipes par tableau)
    For i = 0 To 3
      ' Définir les colonnes pour chaque équipe
        colonneMission = 4 * i + 3
        colonneFin = 4 * i + 5
        colonneIntervenant = colonneMission
        
      ' Boucle à travers chaque ligne de données de l'équipe
      For ligneDonnees = ligneTableau + 3 To ligneTableau + 18 ' Lignes 28 à 43, 48 à 63, etc.
        ' Vérifier l'état de la mission et la présence d'un intervenant
        If ws.Cells(ligneTableau + 2, colonneMission).Value = "Terminée" And _
           ws.Cells(ligneDonnees, colonneIntervenant).Value <> "" And _
           ws.Cells(ligneDonnees, colonneFin).Value = "" Then

          ' Écrire "Fin" dans la colonne de fin
          ws.Cells(ligneDonnees, colonneFin).Value = "Fin"

        End If
      Next ligneDonnees
    Next i
  Next ligneTableau
End Sub
 
- Navigue sans publicité
- Accède à Cléa, notre assistante IA experte Excel... et pas que...
- Profite de fonctionnalités exclusives
Ton soutien permet à Excel Downloads de rester 100% gratuit et de continuer à rassembler les passionnés d'Excel.
Je deviens Supporter XLD

Discussions similaires

Réponses
0
Affichages
387
Retour