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
le code ci-dessus supprime le pays de ma feuille paramètres et pas dans Base (soit le contraire voulu).
Exact. J'ai hésité entre les 2 possibilités car je n'étais pas sûr de ce que tu attendais.
Donc, toujours sur la base de ton code de départ, peut-être 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
   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
                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
        End If
   Next
End Sub
A+
 
Re : Test au sein d'une boucle qui plante

Merci beaucoup David84,

ça marche nickel et le code est très lisible; je commence à mieux cerner l'intérêt des fonctions. En revanche, dans la feuille Paramètres, la zone où il y a les pays (références pour ce qu'il faudra supprimer en Base) est fixe (ici B3:B12); or, la taille est amenée à bouger.
J'ai apporté la modif suivant, qui fonctionne : toi qui a l'oeil, dis-moi si c'est orthodoxe

encore un grand merci pour ton aide et ta patience

Sub supprimer_quand_critère_avec_confirmation_préalable_ET_ZONE_PAYS_DYNAMIQUE
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)
' lig suiv : modif
Set pays_à_supprimer = Sheets("Paramètres").Range("B3:B" & Sheets("Paramètres").Range("B" & Rows.Count).End(xlUp).Row)
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
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
End If
Next
End Sub
 
Re : Test au sein d'une boucle qui plante

c'est ce que je viens de faire, j'ai même créé une liste avec pays1, pays2, ..., pays 250, puis un pays existant dans BASE et ça vient bien ne tester que le pays existant et donc saute les pays1 à pays 250.

Nickel !

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

salut Sebast et David,

euh ! je dis ça, je dis rien ... mais ...
avec le code que je t'ai fais tu es en train de tout mélanger !?
il y a des déclarations de faites et des constantes ...
tu vas au devant de sacrées surprises !

et puis des trucs du genre:
réponse = MsgBox(....
If réponse = 1 Then

ce n'est pas très pro ni très explicite !
il y a déjà pour cela !
Public ReponseMsgBox As Variant
et If ReponseMsgBox = vbOk ... ça parle tout de suite !

et puis:
Public Rang_Pays_a_supprimer As Range, Cellule As Range
Public Pays_a_Supprimer As String


maintenant peut être que tu n'as pas gardé le classeur que je t'ai concocté !?
 
Dernière édition:
Re : Test au sein d'une boucle qui plante

Salut Roland_M,

si, bien sûr que j'ai ton code, que je garde précieusement mais je répondais par ce post à David84 qui lui aussi a été sympa de se pencher sur ma demande. J'ai testé son code et il marche mais je ne suis pas suffisamment connaisseur pour détecter les difficultés potentielles.

Les remarques que tu fais portent-elles sur la forme ou peuvent-elles amener le code à planter ?
par ex tu écris ...
réponse = MsgBox(....
If réponse = 1 Then

est-ce "juste" une question de présentation, de redondance etc. ou cela peut-il planter ?

quand tu écris "... pas très explicite" ou " ... pas très pro", est-ce un problème de fond ?
C'est vrai que ta solution est rigoureuse et bien présentée mais je me dois de répondre à David84 qui m'a aidé

Cela dit, on est aussi là pour apprendre et David84 ne doit pas en prendre ombrage
Dis-moi juste si tel qu'il est, ça peut planter

Par ailleurs, dans un fichier, j'arrive à lancer le code de David84 et dans un autre, il me réclame la variable BASE, que je corrige avec Dim BASE as Range : est-ce possible que parfois ça le réclame, parfois pas ? (dans le code transmis à 13 h 39, on a directement set BASE = ... sans déclaration préalable)

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

Re
@Rolland:
euh ! je dis ça, je dis rien ... mais ...
avec le code que je t'ai fais tu es en train de tout mélanger !?
il y a des déclarations de faites et des constantes ...
tu vas au devant de sacrées surprises !
Je n'ai pas travaillé à partir de ton fichier mais sur celui fourni par le demandeur. De plus, je n'ai regardé que la macro
supprimer_quand_critère_avec_confirmation_préalable()
et pas les autres.
et puis des trucs du genre:
réponse = MsgBox(....
If réponse = 1 Then

ce n'est pas très pro ni très explicite !
Explique-moi en quoi ce n'est pas très pro STP.
Par contre,
If ReponseMsgBox = vbOk
est effectivement plus explicite.
Public ReponseMsgBox As Variant
pas de trace de variable déclarée en Public dans le fichier du demandeur.

avec le code que je t'ai fais tu es en train de tout mélanger !?
il y a des déclarations de faites et des constantes ...
tu vas au devant de sacrées surprises !
Si Sebast mélange ta proposition certainement plus complète en y ajoutant un peu de la mienne (uniquement ciblée sur la macro en question), cela risque effectivement de coincer.
A+
 
Re : Test au sein d'une boucle qui plante

re:

David84 n'y est pour rien ! son code est correct. Ce n'est pas le problème !
le problème c’est qu'il te donne des exemples basés sur le module de départ !
et que tu les colles tels quels sans tenir compte des précédentes modif !
si tu connaissais un peu mieux la programmation tu comprendrais ce que je cherche à t’expliquer

perso je t'ai fais un module totalement différent !
il y a des déclarations et des constantes Public à respecter !!!
il n'est donc pas raisonnable de les modifier dans différent sub !

c'est un sujet récurrent, prendre des routines et les coller telles quelles
et on entasse et on entasse !!! mais ce n’est pas comme cela que ça marche !
à un moment donné il y a forcément des problèmes !

des anciens sur le forum, bien plus pros que moi, simple amateur, te confirmeront mes dires !

EDIT: salut à toi David ne prends pas ombrage ! c'est un malentendu ! je te salut amicalement !
 
Dernière édition:
Re : Test au sein d'une boucle qui plante

Salut Roland_M, salut David84,

je suis content de voir que ça n'est qu'un malentendu ! Oui, j'ai bien votre code respectif, oui, ils arrivent au même résultat avec des approches différentes mais je ne suis pas en train de tout mélanger, j'essaie même au contraire de voir comment ça fonctionne et justement je fais tourner les routines séparément pour essayer de ne pas m'embrouiller !

Je pense que ça aurait été problématique si j'avais collé des morceaux de l'un dans le code de l'autre mais au contraire, je les utilise de façon séparée (à moins que j'ai loupé une étape ...). Par exemple pour les variables à déclarer en Public, ça ne me semble pas être le problème ici puisque dans la routine de David84, on déclare bien dim réponse as byte au niveau de la routine et je fais tourner chaque routine sur des fichiers séparés.

Donc encore une fois, un grand merci à vous deux et désolé si on s'est mal compris

Sebast
 
- 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…