Boucle conditions qui déconne + problème Msgbox

arnaudbu

XLDnaute Occasionnel
Hello,

Je teste en F sur certaines lignes si il y a un "X". Si il y a un "X", je contrôle le remplissage de la ligne.

Si la ligne n'est pas correctement remplie, je renvoie une erreur Msgbox.
Si la ligne n'est pas correctement remplie, on ne copie aucunes données.

Voilà le soucis:

Si il y a plusieurs erreurs de remplissage je me retrouve avec beaucoup de Msgbox. Comment mettre toutes les erreurs dans un seul Msgbox séparées par sauts de lignes?

Si il y a des erreurs, mes lignes sont quand même copiées, je ne trouve pas le soucis ??

@++
 

Pièces jointes

  • test2.xls
    38 KB · Affichages: 59
  • test2.xls
    38 KB · Affichages: 60
  • test2.xls
    38 KB · Affichages: 62
C

Compte Supprimé 979

Guest
Re : Boucle conditions qui déconne + problème Msgbox

Salut Arnaudbu

A Tester
VB:
Sub archivage()
  Dim FlgErr As Boolean
  TabLignes = Array(4, 5)
  TabNC = Array("G", "H", "I", "J", "K", "L", "M", "N")
  FlgErr = False
  With Sheets("feuil1")
    For i = LBound(TabLignes) To UBound(TabLignes)
      Set rd = Sheets("feuil2").Range("A65536").End(xlUp).Offset(1, 0)
      Set rs = .Range("I" & TabLignes(i)).Resize(1, 7)
      If .Range("F" & TabLignes(i)).Value = "X" Then
        For j = LBound(TabNC) To UBound(TabNC)
          If .Range(TabNC(j) & TabLignes(i)).Value = "" Then
            MSG = MSG & "Critères: " & .Range("B" & TabLignes(i)).Value & _
                " Manque: " & .Range(TabNC(j) & "2").Value & vbCrLf
            fglerr = True ' Mettre le flag erreur
          End If
        Next j
        If FlgErr = False Then
          rs.Copy
          rd.PasteSpecial xlValues
          rd.PasteSpecial xlFormats
        Else
          FlgErr = False  ' Réinitialiser le flag
        End If
      End If
    Next i
    MsgBox MSG, vbOKOnly, "Information"
  End With
  MSG = MsgBox("sauvegardées", vbOKOnly, "Information")
End Sub

A+
 

arnaudbu

XLDnaute Occasionnel
Re : Boucle conditions qui déconne + problème Msgbox

Hello et merci,

Donc les lignes incomplètes ne sont pas copié. J'aimerais qu'aucune lignes ne soient copiés si erreur.

Ensuite le msgbox me renvoi 0,1 et... mais pas les valeur des range stipulés.

@+
 

arnaudbu

XLDnaute Occasionnel
Re : Boucle conditions qui déconne + problème Msgbox

OK pour le Msgbox c'est résolu. Mais il me rajoute les erreurs à chaque clic sur OK, je n'ai pas toutes les erreurs d'un coup dans un seul Msgbox.

Juste à bloquer toutes les copies si erreurs.
 

kjin

XLDnaute Barbatruc
Re : Boucle conditions qui déconne + problème Msgbox

Bonsoir,
Apparemment tu ne testes le "X" uniquement dans la colonne F !?
Code:
Sub archivage()
Dim b As Boolean, i%, j%, Texte$, tablo, dl%
b = False
With Sheets("feuil1")
    For i = 4 To .Range("B65000").End(xlUp).Row
        If UCase(.Cells(i, 6)) = "X" Then
            For j = 7 To 14
                If .Cells(i, j) = "" Then
                    b = True
                    Texte = Texte & Chr(64 + j) & ","
                End If
            Next j
            If b Then
                MsgBox "Critères: " & .Cells(i, 2) & " Manque: " & Texte
            Else
            tablo = .Range("I" & i & ":N" & i).Value
                With Sheets("Feuil2")
                    dl = .Range("A65000").End(xlUp).Row + 1
                    .Range("A" & dl).Resize(1, UBound(tablo, 2)) = tablo
                End With
            End If
        End If
    Next
End With
MsgBox "termined"
End Sub
A+
kjin
 

Gorfael

XLDnaute Barbatruc
Re : Boucle conditions qui déconne + problème Msgbox

Salut arnaudbu et le forum
Comme BrunoM45 a répondu, je vais juste critiquer ta macro, yerk, yerk :p

Déclarer ses variables en début de module général les rend globales : plus courte est la durée de vie d'une variable, moins tu maîtrises son contenu. Ne déclarer en variables globales que celles qui doivent réellement l'être est préférable.

Tu déclares des variables servant aux lignes en type Integer. Par expérience, maintenant, je déclares systématiquement mes variables avec le type qui leur permettra d'avoir leur valeur maximale, sans déclencher d'erreur. Un espace intempestif en fin de colonne (ligne 65536) m'a coûté des heures de recherche, n'ayant que moins de 1000 lignes de remplies.
Mais les déclarer c'est bien.

Je sais que ça semble fastidieux et inutile, mais l'indentation n'est pas là pour faire beau : même si tu as des dizaines de boucles, tests, with, avec une bonne indentation, tu sais toujours à quel niveau tu es, même si le début est 5 pages plus haut.
Code:
MSG = MsgBox("sauvegardées", vbOKOnly, "Information")
C'est inutile. regarde ce que fait
Code:
MsgBox "sauvegardées", , "Information"
Code:
            For j = LBound(TabNC) To UBound(TabNC)
                If .Range(TabNC(j) & TabLignes(i)).Value = "" Then
                    MSG = MsgBox("Critères: " & .Range("B" & TabLignes(i)).Value & _
                    " Manque: " & .Range(TabNC(j) & "2").Value, vbOKOnly, "Information")
                End If
            Next j
            rs.Copy
            rd.PasteSpecial xlValues
            rd.PasteSpecial xlFormats
Juste pour que tu comprennes ton erreur :
- tu changes de J => tu passes à l'instruction suivante
- tu testes : détection d'une erreur => message
- tu copies tes données : le test ne fait pas sauter la copie des données, que ton test soit positif (tu mets le message) ou négatif (tu ne mets pas le message), tu copies dans les deux cas.
Il faudrait faire un algorithme (ça fait mousser de mettre des termes pédants :p) qui tienne compte du message. Un truc du genre

Flg=true (variable booléenne
Boucle sur J
si la condition de J fausse, alors
- on met Flg=faux
- on sort de la boucle J
fin de test de J
fin de boucle J
Si Flg alors (Flg =True => si Flg est vrai, on a (True = True) => c'est forcément True. Si Flg est faux, on a (False = True) c'est forcément False => pas la peine de mettre un test d'une égalité en plus)
- (on n'a donc pas d'erreur) => on copie
Else sinon, on a une erreur
- on averti
fin test Flg

Quand on fait des boucles, avec un test à l'intérieur qui conditionne l'action de la boucle : le plus simple et plus rapide, c'est de sortir de la boucle dès que le test n'est pas bon, et de traiter à l'extérieur de la boucle l'avertissement
A+
 

ROGER2327

XLDnaute Barbatruc
Re : Boucle conditions qui déconne + problème Msgbox

Bonjour à tous
Trois essais dans le classeur joint.
ROGER2327
#4643


Mardi 3 Sable 138 (Saint Phlegmon, doctrinaire, SQ)
13 Frimaire An CCXIX
2010-W48-5T01:19:23Z
 

Pièces jointes

  • Copie de test2_4643.xls
    34.5 KB · Affichages: 50

arnaudbu

XLDnaute Occasionnel
Re : Boucle conditions qui déconne + problème Msgbox

Salut arnaudbu et le forum
Comme BrunoM45 a répondu, je vais juste critiquer ta macro, yerk, yerk :p

Déclarer ses variables en début de module général les rend globales : plus courte est la durée de vie d'une variable, moins tu maîtrises son contenu. Ne déclarer en variables globales que celles qui doivent réellement l'être est préférable.

Tu déclares des variables servant aux lignes en type Integer. Par expérience, maintenant, je déclares systématiquement mes variables avec le type qui leur permettra d'avoir leur valeur maximale, sans déclencher d'erreur. Un espace intempestif en fin de colonne (ligne 65536) m'a coûté des heures de recherche, n'ayant que moins de 1000 lignes de remplies.
Mais les déclarer c'est bien.

Je sais que ça semble fastidieux et inutile, mais l'indentation n'est pas là pour faire beau : même si tu as des dizaines de boucles, tests, with, avec une bonne indentation, tu sais toujours à quel niveau tu es, même si le début est 5 pages plus haut.
Code:
MSG = MsgBox("sauvegardées", vbOKOnly, "Information")
C'est inutile. regarde ce que fait
Code:
MsgBox "sauvegardées", , "Information"
Code:
            For j = LBound(TabNC) To UBound(TabNC)
                If .Range(TabNC(j) & TabLignes(i)).Value = "" Then
                    MSG = MsgBox("Critères: " & .Range("B" & TabLignes(i)).Value & _
                    " Manque: " & .Range(TabNC(j) & "2").Value, vbOKOnly, "Information")
                End If
            Next j
            rs.Copy
            rd.PasteSpecial xlValues
            rd.PasteSpecial xlFormats
Juste pour que tu comprennes ton erreur :
- tu changes de J => tu passes à l'instruction suivante
- tu testes : détection d'une erreur => message
- tu copies tes données : le test ne fait pas sauter la copie des données, que ton test soit positif (tu mets le message) ou négatif (tu ne mets pas le message), tu copies dans les deux cas.
Il faudrait faire un algorithme (ça fait mousser de mettre des termes pédants :p) qui tienne compte du message. Un truc du genre

Flg=true (variable booléenne
Boucle sur J
si la condition de J fausse, alors
- on met Flg=faux
- on sort de la boucle J
fin de test de J
fin de boucle J
Si Flg alors (Flg =True => si Flg est vrai, on a (True = True) => c'est forcément True. Si Flg est faux, on a (False = True) c'est forcément False => pas la peine de mettre un test d'une égalité en plus)
- (on n'a donc pas d'erreur) => on copie
Else sinon, on a une erreur
- on averti
fin test Flg

Quand on fait des boucles, avec un test à l'intérieur qui conditionne l'action de la boucle : le plus simple et plus rapide, c'est de sortir de la boucle dès que le test n'est pas bon, et de traiter à l'extérieur de la boucle l'avertissement
A+

Ok merci. J'avais bien compris le problème et l'astuce avec la valeur boolean va bien permettre de régler le soucis.

Je creuse pour voir comment adapter ça.
 

arnaudbu

XLDnaute Occasionnel
Re : Boucle conditions qui déconne + problème Msgbox

Bonjour à tous
Trois essais dans le classeur joint.
ROGER2327
#4643


Mardi 3 Sable 138 (Saint Phlegmon, doctrinaire, SQ)
13 Frimaire An CCXIX
2010-W48-5T01:19:23Z

Hello,

Le sub 3 est exactement ce qu'il faut. Je vais voir pour l'adapter en fonction de mon fichier.

Peux t-on garder les array de ma version ? car j'ai plusieurs contrôle à faire sur des lignes fixes bien spécifiques ?

PS: j'ai mis une version allégée de mon fichier...

@+
 

arnaudbu

XLDnaute Occasionnel
Re : Boucle conditions qui déconne + problème Msgbox

Bon j'ai bossé pour adapter à mon fichier en gardant les array.

J'ai fais une boucle de contrôle et si pas d'erreurs, je j'ai fais une boucle de copie.

Hic1: ça bug sur les copies, ça ne copie que la première ligne (pourtant la boucle est là) ... je me suis surement foiré, mais où ??

Hic2: si une cellule n'est pas remplie et que je la remplie par la suite, j'ai toujours une erreur Msgbox.

Hic3: j'ai pas trouvé comment adapter la Msgbox pour qu'elle affiche toutes les erreurs en une fois.
 

Pièces jointes

  • Copie de Copie de test2.xls
    45.5 KB · Affichages: 49
  • Copie de Copie de test2.xls
    45.5 KB · Affichages: 55
  • Copie de Copie de test2.xls
    45.5 KB · Affichages: 54

arnaudbu

XLDnaute Occasionnel
Re : Boucle conditions qui déconne + problème Msgbox

Comme dit, j'aimerais mettre un code que je comprenne et qui garde mes array car j'ai d'autres lignes à intégrer.

Ceci est une version allégée de mon fichier donc non représentatif.

J'ai étudier ton code ne t'en fais pas...

@+
 

kjin

XLDnaute Barbatruc
Re : Boucle conditions qui déconne + problème Msgbox

Re,
J'ai étudier ton code ne t'en fais pas...
Mouais :rolleyes:
Même si une solution proposée ne convient pas, la moindre des corrections est de le faire savoir...
Je ne vois pas où est la difficulté...donc toujours avec le même code
Code:
Sub archivage2()
Dim b As Boolean, ArrL, ArrC, i%, j%, Texte$, tablo, dl%
b = False
ArrL = Array(4, 5)
ArrC = Array(7, 8, 9, 10, 11, 12, 13, 14)
With Sheets("feuil1")
    For i = 0 To UBound(ArrL)
        If UCase(.Cells(ArrL(i), 6)) = "X" Then
            For j = 0 To UBound(ArrC)
                If .Cells(ArrL(i), ArrC(j)) = "" Then
                    b = True
                    Texte = Texte & Chr(64 + ArrC(j)) & ","
                End If
            Next j
            If b Then
                Texte = Left(Texte, Len(Texte) - 1)
                MsgBox "Critères: " & .Cells(ArrL(i), 2) & " Manque: " & Texte
            Else
            tablo = .Range("I" & i & ":N" & i).Value
                With Sheets("Feuil2")
                    dl = .Range("A65000").End(xlUp).Row + 1
                    .Range("A" & dl).Resize(1, UBound(tablo, 2)) = tablo
                End With
            End If
        End If
    Next
End With
MsgBox "termined"
End Sub
kjin
 

arnaudbu

XLDnaute Occasionnel
Re : Boucle conditions qui déconne + problème Msgbox

Ok merci.

Pour quoi c'est écrit comme ça: i%, j%, Texte$, tablo, dl% au lieu des integer, variant etc...

J'essaye de remettre le code, mais il ne met pas toutes les erreurs dans un seul MSGbox, puis erreur sur: Texte = Left(Texte, Len(Texte) - 1) = incompatibilité de type + message d'erreur Mshbox sur toutes les bonnes lignes.
 
Dernière édition:

Fo_rum

XLDnaute Accro
Re : Boucle conditions qui déconne + problème Msgbox

Salut

les Array sont-ils vraiment nécessaires ?
Code:
Sub Archive()
  Dim n As Long, L As Long, C As Range, Mes As String, Suite As String
  Feuil2.Cells.Clear
  For n = 4 To 9  [B][COLOR="Green"]'choix des lignes[/COLOR][/B]
    If Cells(n, "F") <> "" Then
      For Each C In Range("G" & n, "H" & n)  [B][COLOR="green"]'choix des colonnes[/COLOR][/B]
        If C = "" Then Mes = Mes & C.Address & " est vide" & Chr(10)
      Next
      If Mes = "" Then
        L = L + 1
        Feuil2.Range("A1:F1").Offset(L, 0).Value = Range("I" & n & ":N" & n).Value
        Mes = ""
      End If
    End If
  Next
  If Mes <> "" Then Suite = Chr(10) & "mais, attention, " & Chr(10) & Mes
  MsgBox "lignes complètes copiées " & Suite, vbOKOnly, "Pour information"
  End Sub
 

Pièces jointes

  • Copie Si.xls
    25 KB · Affichages: 50

Discussions similaires

Réponses
2
Affichages
186
Réponses
7
Affichages
432

Statistiques des forums

Discussions
312 601
Messages
2 090 150
Membres
104 411
dernier inscrit
saidokhan