Ceci est une page optimisée pour les mobiles. Cliquez sur ce texte pour afficher la vraie page.

Test au sein d'une boucle qui plante

  • Initiateur de la discussion Initiateur de la discussion Sebast
  • 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 !

Sebast

XLDnaute Impliqué
Bonjour à tous,

j'ai placé un test demandant confirmation à l'utilisateur (voulez-vous supprimer oui/non) mais ça fait planter la suite du programme. Excel annonce un problème de with sans End with, alors que pour moi, ça paraît bon ...

J'ai mis des explications détaillées dans le fichier joint.

D'avance, merci beaucoup à ceux qui voudront se pencher sur mon fichier

Sebast
 

Pièces jointes

Re : Test au sein d'une boucle qui plante

re

essai de reprendre tout ceci dans module1 !?

Code:
Public Reponse As Variant

' code avec plage variable mais supprime sans validation
Sub supprimer_enregistrements_quand_pays_sans_confirmation()
   Dim DLigP As Long, LigP As Long, ShtP As Worksheet
   Dim DLigB As Long, LigB As Long
   Dim pays_à_supprimer As String
   
   Set ShtP = Sheets("Paramètres")
   DLigP = ShtP.Range("B" & Rows.Count).End(xlUp).Row
   ' Pour chaque pays à supprimer
   For LigP = 3 To DLigP
     pays_à_supprimer = ShtP.Range("B" & LigP)
     ' Avec la feuille Base
     With Sheets("Base")
       .Activate
       ' Memoriser la dernière ligne
       DLigB = .Range("B" & Rows.Count).End(xlUp).Row
       ' Pour chaque ligne en partant de la fin
       For LigB = DLigB To 2 Step -1
         ' SI le pays correspond, supprimer la ligne
         If .Range("B" & LigB) = pays_à_supprimer Then Rows(LigB).Delete
       Next LigB
     End With
   Next LigP
 End Sub
 
 ' code avec plage variable mais demande confirmation avant suppression
 Sub supprimer_enregistrements_quand_pays_avec_confirmation_préalable()
   Dim DLigP As Long, LigP As Long, ShtP As Worksheet
   Dim DLigB As Long, LigB As Long
   Dim pays_à_supprimer As String
   
   Set ShtP = Sheets("Paramètres")
   DLigP = ShtP.Range("B" & Rows.Count).End(xlUp).Row
   ' Pour chaque pays à supprimer
   For LigP = 3 To DLigP
     pays_à_supprimer = ShtP.Range("B" & LigP)
     ' suit la question mais ne fonctionne pas !
       Reponse = MsgBox("voulez-vous vraiment supprimer " & pays_à_supprimer & " ?", vbOKCancel, "Question")
       If Reponse = vbOK Then
          With Sheets("Base")
          .Activate
          ' Memoriser la dernière ligne
          DLigB = .Range("B" & Rows.Count).End(xlUp).Row
            For LigB = DLigB To 2 Step -1
              ' SI le pays correspond, supprimer la ligne
              If .Range("B" & LigB) = pays_à_supprimer Then Rows(LigB).Delete
            Next LigB
          End With
       End If 
  Next LigP
 End Sub
 
 ' code sans plage variable mais supprime sans demander confirmation
 ' je préfère bien sûr le code avec zone variable mais c'est pour plus de clarté
 ' que je fais figurer cette version ici (supprimer_enregistrements_quand_pays ... a ma préférence)
Sub supprimer_quand_critère_sans_confirmation()
   Dim i                 As Long
   Dim pays_à_supprimer  As Range
   Dim Cellule             As Range

   Set pays_à_supprimer = Sheets("Paramètres").Range("B3:B12")
   For Each Cellule In pays_à_supprimer
       With Sheets("Base")
         For i = .UsedRange.Rows.Count To 2 Step -1
            If .Cells(i, 2) = Cellule.Value Then Rows(i).Delete
         Next i
       End With
   Next
End Sub
 
 ' code sans plage variable mais demande confirmation avant suppression
 ' je préfère bien sûr le code avec zone variable mais c'est pour plus de clarté
 ' que je fais figurer cette version ici (supprimer_enregistrements_quand_pays ... a ma préférence)
 
 Sub supprimer_quand_critère_avec_confirmation_préalable()
   Dim i                 As Long
   Dim pays_à_supprimer  As Range
   Dim Cellule             As Range
   
   Set pays_à_supprimer = Sheets("Paramètres").Range("B3:B12")
   For Each Cellule In pays_à_supprimer
       Reponse = MsgBox("voulez-vous vraiment supprimer " & pays_à_supprimer & " ?", vbOKCancel, "Question")
       If Reponse = vbOK Then
          With Sheets("Base")
          For i = .UsedRange.Rows.Count To 2 Step -1
              If .Cells(i, 2) = Cellule.Value Then Rows(i).Delete
          Next i
         End With
       End If
   Next
End Sub
 
Re : Test au sein d'une boucle qui plante

Bonjour,
pas testé ton code mais :
Code:
MsgBox("voulez-vous vraiment supprimer " &[B] c [/B]& " ?", vbOKCancel, "Question")
De plus, end with me semble mal placé par rapport au with.
Enfin, je ne vois pas l'intérêt d'utiliser un sélect case pour 2 possibilités.
Mais bon, teste comme cela :
Code:
 Sub supprimer_quand_critère_avec_confirmation_préalable()
   Dim i As Long
   Dim pays_à_supprimer  As Range
   Dim Cellule As Range

   Set pays_à_supprimer = Sheets("Paramètres").Range("B3:B12")
   For Each Cellule In pays_à_supprimer
      With Sheets("Base")
      Select Case MsgBox("voulez-vous vraiment supprimer " & c & " ?", vbOKCancel, "Question")
       Case vbOK
         For i = .UsedRange.Rows.Count To 2 Step -1
            If .Cells(i, 2) = Cellule.Value Then Rows(i).Delete
         Next i
    Case vbCancel
    End Select
      End With
   Next
End Sub
A+
 
Re : Test au sein d'une boucle qui plante

Merci Roland_M, Merci David84 pour votre réactivité et votre coup d'oeil sur les erreurs de mon code

Quelques précisions :

1) Roland_M
le code qui m'intéresse le plus fonctionne (super !) mais le 2e plante (celui où la zone est figée) - alors que bizarrement, il ne semble pas y avoir de gros changement

2) David84
la msgbox n'affiche pas le nom du pays mais effectue bien le job
Que veut dire "c" dans la msgbox (pourtant, même "c" n'est pas affiché !)

3) Roland_M et David84
en fait - mais c'est vrai que je ne l'avais pas précisé - la msgbox affiche tous les pays figurant en Paramètres, même s'ils ne sont pas en Base.
Y a-t-il moyen de n'afficher le test que pour les pays figurant dans la Base ? (on a par ex le test pour "désolé !" ou "mauvais choix" - je sais, ce ne sont pas des pays mais ça me permet de mieux contrôler le déroulement)

Ce qui éviterait de voir défiler l'intégralité des Paramètres, même s'ils ne figurent pas en données à supprimer. En fait, j'anticipe un cas où j'aurais à gérer non pas des pays mais des palanquées de codes-articles (j'ai pris un exemple très simple ici, pour une meilleure lisibilité).

Merci beaucoup pour vos lumières
 
Re : Test au sein d'une boucle qui plante

Re
remplacer c par Cellule.Value et chaque pays s'affichera.
Maintenant si tu veux que ta MsgBox affiche en une seule fois les pays (donc que ton message n'apparaisse qu'une fois avec les pays concernés), il te faut procéder autrement en plaçant dans un array (tableau VBA) tous les pays ramenés par ta boucle, puis ensuite les reverser dans ta MsgBox.
A+

Edit : au lieu d'un Array, tu peux plus simplement utiliser une variable pour stocker tes pays
 
Dernière édition:
Re : Test au sein d'une boucle qui plante

Merci Roland_M,

désolé pour le délai de réponse, j'ai dû donner le bain aux enfants !
ça fonctionne pour les 2 versions : super !

En revanche, as-tu une idée pour mon problème d'affichage "intempestif" : j'aimerais que la msgbox ne s'affiche que quand elle rencontre effectivement le pays dans Base. Autrement dit, si ma Base ne contient pas "Papouasie" ou "Andorre" ou même "pas bon" (mis ici dans Paramètres pour un meilleur suivi), le test ne se déclenche pas (même si j'ai "Papouasie" ou "Andorre" ou "pas bon" en Paramètres) : en effet, pas besoin de le tester si pas besoin de le supprimer (puisque le pays n'y est pas)
En fait, je me projette sur un problème auquel je vais être confronté avec non plus des pays mais des codes-articles (par centaines et je vais devoir les passer en revue mais si pas dans la base ...).

J'ai bien essayé d'abord de trier Base par pays puis d'inverser le test (le pays dans Base est-il dans Paramètres ?) mais ça foire ...

Merci beaucoup pour tes conseils
 
Re : Test au sein d'une boucle qui plante

Merci David84,

en fait non, je me suis mal exprimé : je ne veux pas afficher tous les pays en une fois mais faire en sorte que la msgbox ne s'affiche que quand on trouve effectivement dans la Base le pays figurant en Paramètres.
donc dans le cas présent, si Andorre n'est pas en données dans la Base et qu'il y est en Paramètres, ne pas proposer de le supprimer.
C'est juste pour anticiper le traitement à venir de données volumineuses (des centaines de code-articles ...)

Merci beaucoup pour ta précision avec Cellule.Value
 
Re : Test au sein d'une boucle qui plante

re:

ci-joint ton classeur complètement modifié !
tu essayes et tu dis quoi !
 

Pièces jointes

Dernière édition:
Re : Test au sein d'une boucle qui plante

Re

Si c'est cela, utilise Application.Countif comme test comme préconisé dans ton autre discussion :
Code:
Sub supprimer_quand_critère_avec_confirmation_préalable()
   Dim i As Long
   Dim pays_à_supprimer  As Range
   Dim Cellule As Range
   Dim réponse As Byte
   Set Base = Sheets("Base").Range("B2:B" & Sheets("Base").Range("B" & Rows.Count).End(xlUp).Row)
   Set pays_à_supprimer = Sheets("Paramètres").Range("B3:B12")
   For Each Cellule In pays_à_supprimer
      If Application.WorksheetFunction.CountIf(Base, Cellule.Value) > 0 Then
    réponse = MsgBox("voulez-vous vraiment supprimer " & Cellule.Value & " ?", vbOKCancel, "Question")
       If réponse = 1 Then Sheets("Paramètres").Cells(Cellule.Row, 2).Delete
    End If
   Next
End Sub
A+
 
Re : Test au sein d'une boucle qui plante

Salut Roland_M,

tu as vraiment fait du bon boulot, ça marche parfaitement !
Vu l'heure à laquelle tu l'as posté, j'ai un peu honte de ma demande, surtout quand je vois le super travail effectué : je ne pensais pas qu'il fallait à ce point repartir de zéro, je pensais qu'une légère adaptation aurait suffi (un test avant déclenchement du test ...)

Un grand merci pour ton aide et ta disponibilité - dont j'ai un peu abusé !

Sebast
 
Re : Test au sein d'une boucle qui plante

Merci David84,

le code ci-dessus supprime le pays de ma feuille paramètres et pas dans Base (soit le contraire voulu). Je vais essayer d'adapter tes lignes à mon besoin.

Un grand merci pour ton aide et ta disponibilité
 
- 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

J
Réponses
22
Affichages
3 K
jui42
J
A
Réponses
11
Affichages
2 K
A
L
Réponses
1
Affichages
1 K
Ludwig74
L
P
Réponses
2
Affichages
1 K
Pieerre69
P
L
Réponses
1
Affichages
1 K
Lucien31
L
Les cookies sont requis pour utiliser ce site. Vous devez les accepter pour continuer à utiliser le site. En savoir plus…